Overview
TokenID
100219
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
MUBonds
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-07-06 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // 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 (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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/utils/Address.sol // OpenZeppelin Contracts (last updated v4.9.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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // 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/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/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/IERC721.sol // OpenZeppelin Contracts (last updated v4.9.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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * 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/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); 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 overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } // File: blur/BlurSwap.sol pragma solidity ^0.8.0; interface IERC20 { function totalSupply() external view returns (uint); function balanceOf(address account) external view returns (uint); function transfer(address recipient, uint amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint amount) external returns (bool); function transferFrom( address sender, address recipient, uint amount ) external returns (bool); event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); } contract MUBonds is ERC721, Ownable { mapping(uint256 => uint256) public _mut; address public mutToken; string public uris; constructor() ERC721("MU Bonds", "MUB") { mutToken = 0x05030203674173Fa6dF6F9f7E34D6E70E9a761D7; uris = "https://www.google.com.hk/"; } function setToken(address _adr) public onlyOwner { mutToken = _adr; } function setUri(string memory _uris) public onlyOwner { uris = _uris; } function _baseURI() internal view override returns (string memory) { return uris; } function safeMint(address to, uint256 tokenId,uint256 _num) public onlyOwner { _safeMint(to, tokenId); _mut[tokenId] = _num; } function safeBatchMint(address[] memory to, uint256[] memory tokenId,uint256[] memory _num) public onlyOwner { for(uint256 i=0;i<to.length;i++){ _safeMint(to[i], tokenId[i]); _mut[tokenId[i]] = _num[i]; } } function batchSend( uint256[] memory tokenId,uint256[] memory _num) public onlyOwner { for(uint256 i=0;i<tokenId.length;i++){ require( _mut[tokenId[i]] >= _num[i] ,"tokenId num is not enough"); _mut[tokenId[i]] = _mut[tokenId[i]] - _num[i]; IERC20 token = IERC20(mutToken); token.transfer(ownerOf(tokenId[i]), _num[i]); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_mut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"uint256[]","name":"_num","type":"uint256[]"}],"name":"batchSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mutToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"uint256[]","name":"_num","type":"uint256[]"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"_num","type":"uint256"}],"name":"safeMint","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":"address","name":"_adr","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uris","type":"string"}],"name":"setUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"uris","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600881526020017f4d5520426f6e64730000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4d5542000000000000000000000000000000000000000000000000000000000081525081600090816200008f9190620004ae565b508060019081620000a19190620004ae565b505050620000c4620000b86200016660201b60201c565b6200016e60201b60201c565b7305030203674173fa6df6f9f7e34d6e70e9a761d7600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280601a81526020017f68747470733a2f2f7777772e676f6f676c652e636f6d2e686b2f000000000000815250600990816200015f9190620004ae565b5062000595565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002b657607f821691505b602082108103620002cc57620002cb6200026e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003367fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002f7565b620003428683620002f7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200038f6200038962000383846200035a565b62000364565b6200035a565b9050919050565b6000819050919050565b620003ab836200036e565b620003c3620003ba8262000396565b84845462000304565b825550505050565b600090565b620003da620003cb565b620003e7818484620003a0565b505050565b5b818110156200040f5762000403600082620003d0565b600181019050620003ed565b5050565b601f8211156200045e576200042881620002d2565b6200043384620002e7565b8101602085101562000443578190505b6200045b6200045285620002e7565b830182620003ec565b50505b505050565b600082821c905092915050565b6000620004836000198460080262000463565b1980831691505092915050565b60006200049e838362000470565b9150826002028217905092915050565b620004b98262000234565b67ffffffffffffffff811115620004d557620004d46200023f565b5b620004e182546200029d565b620004ee82828562000413565b600060209050601f83116001811462000526576000841562000511578287015190505b6200051d858262000490565b8655506200058d565b601f1984166200053686620002d2565b60005b82811015620005605784890151825560018201915060208501945060208101905062000539565b868310156200058057848901516200057c601f89168262000470565b8355505b6001600288020188555050505b505050505050565b61361d80620005a56000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c8063715018a6116100c3578063b88d4fde1161007c578063b88d4fde1461039d578063c87b56dd146103b9578063c8f5c1f4146103e9578063df61264b14610405578063e985e9c514610435578063f2fde38b1461046557610158565b8063715018a6146103015780638da5cb5b1461030b57806395d89b41146103295780639b642de114610347578063a22cb46514610363578063ac1335f11461037f57610158565b806323b872dd1161011557806323b872dd1461023157806324eeedf61461024d57806342842e0e146102695780634ac78ace146102855780636352211e146102a157806370a08231146102d157610158565b806301ffc9a71461015d57806306fdde031461018d578063081812fc146101ab578063095ea7b3146101db578063144fa6d7146101f757806318b7e11c14610213575b600080fd5b61017760048036038101906101729190612005565b610481565b604051610184919061204d565b60405180910390f35b610195610563565b6040516101a291906120f8565b60405180910390f35b6101c560048036038101906101c09190612150565b6105f5565b6040516101d291906121be565b60405180910390f35b6101f560048036038101906101f09190612205565b61063b565b005b610211600480360381019061020c9190612245565b610752565b005b61021b61079e565b60405161022891906121be565b60405180910390f35b61024b60048036038101906102469190612272565b6107c4565b005b610267600480360381019061026291906122c5565b610824565b005b610283600480360381019061027e9190612272565b610853565b005b61029f600480360381019061029a9190612523565b610873565b005b6102bb60048036038101906102b69190612150565b61092a565b6040516102c891906121be565b60405180910390f35b6102eb60048036038101906102e69190612245565b6109b0565b6040516102f891906125d9565b60405180910390f35b610309610a67565b005b610313610a7b565b60405161032091906121be565b60405180910390f35b610331610aa5565b60405161033e91906120f8565b60405180910390f35b610361600480360381019061035c91906126a9565b610b37565b005b61037d6004803603810190610378919061271e565b610b52565b005b610387610b68565b60405161039491906120f8565b60405180910390f35b6103b760048036038101906103b291906127ff565b610bf6565b005b6103d360048036038101906103ce9190612150565b610c58565b6040516103e091906120f8565b60405180910390f35b61040360048036038101906103fe9190612882565b610cc0565b005b61041f600480360381019061041a9190612150565b610edd565b60405161042c91906125d9565b60405180910390f35b61044f600480360381019061044a91906128fa565b610ef5565b60405161045c919061204d565b60405180910390f35b61047f600480360381019061047a9190612245565b610f89565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061054c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061055c575061055b8261100c565b5b9050919050565b60606000805461057290612969565b80601f016020809104026020016040519081016040528092919081815260200182805461059e90612969565b80156105eb5780601f106105c0576101008083540402835291602001916105eb565b820191906000526020600020905b8154815290600101906020018083116105ce57829003601f168201915b5050505050905090565b600061060082611076565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106468261092a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ad90612a0c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106d56110c1565b73ffffffffffffffffffffffffffffffffffffffff1614806107045750610703816106fe6110c1565b610ef5565b5b610743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073a90612a9e565b60405180910390fd5b61074d83836110c9565b505050565b61075a611182565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6107d56107cf6110c1565b82611200565b610814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080b90612b30565b60405180910390fd5b61081f838383611295565b505050565b61082c611182565b610836838361158e565b806007600084815260200190815260200160002081905550505050565b61086e83838360405180602001604052806000815250610bf6565b505050565b61087b611182565b60005b8351811015610924576108c584828151811061089d5761089c612b50565b5b60200260200101518483815181106108b8576108b7612b50565b5b602002602001015161158e565b8181815181106108d8576108d7612b50565b5b6020026020010151600760008584815181106108f7576108f6612b50565b5b6020026020010151815260200190815260200160002081905550808061091c90612bae565b91505061087e565b50505050565b600080610936836115ac565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099e90612c42565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1790612cd4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a6f611182565b610a7960006115e9565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ab490612969565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae090612969565b8015610b2d5780601f10610b0257610100808354040283529160200191610b2d565b820191906000526020600020905b815481529060010190602001808311610b1057829003601f168201915b5050505050905090565b610b3f611182565b8060099081610b4e9190612ea0565b5050565b610b64610b5d6110c1565b83836116af565b5050565b60098054610b7590612969565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba190612969565b8015610bee5780601f10610bc357610100808354040283529160200191610bee565b820191906000526020600020905b815481529060010190602001808311610bd157829003601f168201915b505050505081565b610c07610c016110c1565b83611200565b610c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3d90612b30565b60405180910390fd5b610c528484848461181b565b50505050565b6060610c6382611076565b6000610c6d611877565b90506000815111610c8d5760405180602001604052806000815250610cb8565b80610c9784611909565b604051602001610ca8929190612fae565b6040516020818303038152906040525b915050919050565b610cc8611182565b60005b8251811015610ed857818181518110610ce757610ce6612b50565b5b602002602001015160076000858481518110610d0657610d05612b50565b5b60200260200101518152602001908152602001600020541015610d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d559061301e565b60405180910390fd5b818181518110610d7157610d70612b50565b5b602002602001015160076000858481518110610d9057610d8f612b50565b5b6020026020010151815260200190815260200160002054610db1919061303e565b60076000858481518110610dc857610dc7612b50565b5b60200260200101518152602001908152602001600020819055506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610e48868581518110610e3b57610e3a612b50565b5b602002602001015161092a565b858581518110610e5b57610e5a612b50565b5b60200260200101516040518363ffffffff1660e01b8152600401610e80929190613072565b6020604051808303816000875af1158015610e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec391906130b0565b50508080610ed090612bae565b915050610ccb565b505050565b60076020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610f91611182565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff79061314f565b60405180910390fd5b611009816115e9565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61107f816119d7565b6110be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b590612c42565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661113c8361092a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61118a6110c1565b73ffffffffffffffffffffffffffffffffffffffff166111a8610a7b565b73ffffffffffffffffffffffffffffffffffffffff16146111fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f5906131bb565b60405180910390fd5b565b60008061120c8361092a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061124e575061124d8185610ef5565b5b8061128c57508373ffffffffffffffffffffffffffffffffffffffff16611274846105f5565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166112b58261092a565b73ffffffffffffffffffffffffffffffffffffffff161461130b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113029061324d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361137a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611371906132df565b60405180910390fd5b6113878383836001611a18565b8273ffffffffffffffffffffffffffffffffffffffff166113a78261092a565b73ffffffffffffffffffffffffffffffffffffffff16146113fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f49061324d565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46115898383836001611a1e565b505050565b6115a8828260405180602001604052806000815250611a24565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361171d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117149061334b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161180e919061204d565b60405180910390a3505050565b611826848484611295565b61183284848484611a7f565b611871576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611868906133dd565b60405180910390fd5b50505050565b60606009805461188690612969565b80601f01602080910402602001604051908101604052809291908181526020018280546118b290612969565b80156118ff5780601f106118d4576101008083540402835291602001916118ff565b820191906000526020600020905b8154815290600101906020018083116118e257829003601f168201915b5050505050905090565b60606000600161191884611c06565b01905060008167ffffffffffffffff8111156119375761193661231d565b5b6040519080825280601f01601f1916602001820160405280156119695781602001600182028036833780820191505090505b509050600082602001820190505b6001156119cc578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816119c0576119bf6133fd565b5b04945060008503611977575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166119f9836115ac565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b611a2e8383611d59565b611a3b6000848484611a7f565b611a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a71906133dd565b60405180910390fd5b505050565b6000611aa08473ffffffffffffffffffffffffffffffffffffffff16611f76565b15611bf9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ac96110c1565b8786866040518563ffffffff1660e01b8152600401611aeb9493929190613481565b6020604051808303816000875af1925050508015611b2757506040513d601f19601f82011682018060405250810190611b2491906134e2565b60015b611ba9573d8060008114611b57576040519150601f19603f3d011682016040523d82523d6000602084013e611b5c565b606091505b506000815103611ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b98906133dd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611bfe565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611c64577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611c5a57611c596133fd565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611ca1576d04ee2d6d415b85acef81000000008381611c9757611c966133fd565b5b0492506020810190505b662386f26fc100008310611cd057662386f26fc100008381611cc657611cc56133fd565b5b0492506010810190505b6305f5e1008310611cf9576305f5e1008381611cef57611cee6133fd565b5b0492506008810190505b6127108310611d1e576127108381611d1457611d136133fd565b5b0492506004810190505b60648310611d415760648381611d3757611d366133fd565b5b0492506002810190505b600a8310611d50576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbf9061355b565b60405180910390fd5b611dd1816119d7565b15611e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e08906135c7565b60405180910390fd5b611e1f600083836001611a18565b611e28816119d7565b15611e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5f906135c7565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f72600083836001611a1e565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fe281611fad565b8114611fed57600080fd5b50565b600081359050611fff81611fd9565b92915050565b60006020828403121561201b5761201a611fa3565b5b600061202984828501611ff0565b91505092915050565b60008115159050919050565b61204781612032565b82525050565b6000602082019050612062600083018461203e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156120a2578082015181840152602081019050612087565b60008484015250505050565b6000601f19601f8301169050919050565b60006120ca82612068565b6120d48185612073565b93506120e4818560208601612084565b6120ed816120ae565b840191505092915050565b6000602082019050818103600083015261211281846120bf565b905092915050565b6000819050919050565b61212d8161211a565b811461213857600080fd5b50565b60008135905061214a81612124565b92915050565b60006020828403121561216657612165611fa3565b5b60006121748482850161213b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121a88261217d565b9050919050565b6121b88161219d565b82525050565b60006020820190506121d360008301846121af565b92915050565b6121e28161219d565b81146121ed57600080fd5b50565b6000813590506121ff816121d9565b92915050565b6000806040838503121561221c5761221b611fa3565b5b600061222a858286016121f0565b925050602061223b8582860161213b565b9150509250929050565b60006020828403121561225b5761225a611fa3565b5b6000612269848285016121f0565b91505092915050565b60008060006060848603121561228b5761228a611fa3565b5b6000612299868287016121f0565b93505060206122aa868287016121f0565b92505060406122bb8682870161213b565b9150509250925092565b6000806000606084860312156122de576122dd611fa3565b5b60006122ec868287016121f0565b93505060206122fd8682870161213b565b925050604061230e8682870161213b565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612355826120ae565b810181811067ffffffffffffffff821117156123745761237361231d565b5b80604052505050565b6000612387611f99565b9050612393828261234c565b919050565b600067ffffffffffffffff8211156123b3576123b261231d565b5b602082029050602081019050919050565b600080fd5b60006123dc6123d784612398565b61237d565b905080838252602082019050602084028301858111156123ff576123fe6123c4565b5b835b81811015612428578061241488826121f0565b845260208401935050602081019050612401565b5050509392505050565b600082601f83011261244757612446612318565b5b81356124578482602086016123c9565b91505092915050565b600067ffffffffffffffff82111561247b5761247a61231d565b5b602082029050602081019050919050565b600061249f61249a84612460565b61237d565b905080838252602082019050602084028301858111156124c2576124c16123c4565b5b835b818110156124eb57806124d7888261213b565b8452602084019350506020810190506124c4565b5050509392505050565b600082601f83011261250a57612509612318565b5b813561251a84826020860161248c565b91505092915050565b60008060006060848603121561253c5761253b611fa3565b5b600084013567ffffffffffffffff81111561255a57612559611fa8565b5b61256686828701612432565b935050602084013567ffffffffffffffff81111561258757612586611fa8565b5b612593868287016124f5565b925050604084013567ffffffffffffffff8111156125b4576125b3611fa8565b5b6125c0868287016124f5565b9150509250925092565b6125d38161211a565b82525050565b60006020820190506125ee60008301846125ca565b92915050565b600080fd5b600067ffffffffffffffff8211156126145761261361231d565b5b61261d826120ae565b9050602081019050919050565b82818337600083830152505050565b600061264c612647846125f9565b61237d565b905082815260208101848484011115612668576126676125f4565b5b61267384828561262a565b509392505050565b600082601f8301126126905761268f612318565b5b81356126a0848260208601612639565b91505092915050565b6000602082840312156126bf576126be611fa3565b5b600082013567ffffffffffffffff8111156126dd576126dc611fa8565b5b6126e98482850161267b565b91505092915050565b6126fb81612032565b811461270657600080fd5b50565b600081359050612718816126f2565b92915050565b6000806040838503121561273557612734611fa3565b5b6000612743858286016121f0565b925050602061275485828601612709565b9150509250929050565b600067ffffffffffffffff8211156127795761277861231d565b5b612782826120ae565b9050602081019050919050565b60006127a261279d8461275e565b61237d565b9050828152602081018484840111156127be576127bd6125f4565b5b6127c984828561262a565b509392505050565b600082601f8301126127e6576127e5612318565b5b81356127f684826020860161278f565b91505092915050565b6000806000806080858703121561281957612818611fa3565b5b6000612827878288016121f0565b9450506020612838878288016121f0565b93505060406128498782880161213b565b925050606085013567ffffffffffffffff81111561286a57612869611fa8565b5b612876878288016127d1565b91505092959194509250565b6000806040838503121561289957612898611fa3565b5b600083013567ffffffffffffffff8111156128b7576128b6611fa8565b5b6128c3858286016124f5565b925050602083013567ffffffffffffffff8111156128e4576128e3611fa8565b5b6128f0858286016124f5565b9150509250929050565b6000806040838503121561291157612910611fa3565b5b600061291f858286016121f0565b9250506020612930858286016121f0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061298157607f821691505b6020821081036129945761299361293a565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006129f6602183612073565b9150612a018261299a565b604082019050919050565b60006020820190508181036000830152612a25816129e9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612a88603d83612073565b9150612a9382612a2c565b604082019050919050565b60006020820190508181036000830152612ab781612a7b565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612b1a602d83612073565b9150612b2582612abe565b604082019050919050565b60006020820190508181036000830152612b4981612b0d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612bb98261211a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612beb57612bea612b7f565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612c2c601883612073565b9150612c3782612bf6565b602082019050919050565b60006020820190508181036000830152612c5b81612c1f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612cbe602983612073565b9150612cc982612c62565b604082019050919050565b60006020820190508181036000830152612ced81612cb1565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612d567fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612d19565b612d608683612d19565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612d9d612d98612d938461211a565b612d78565b61211a565b9050919050565b6000819050919050565b612db783612d82565b612dcb612dc382612da4565b848454612d26565b825550505050565b600090565b612de0612dd3565b612deb818484612dae565b505050565b5b81811015612e0f57612e04600082612dd8565b600181019050612df1565b5050565b601f821115612e5457612e2581612cf4565b612e2e84612d09565b81016020851015612e3d578190505b612e51612e4985612d09565b830182612df0565b50505b505050565b600082821c905092915050565b6000612e7760001984600802612e59565b1980831691505092915050565b6000612e908383612e66565b9150826002028217905092915050565b612ea982612068565b67ffffffffffffffff811115612ec257612ec161231d565b5b612ecc8254612969565b612ed7828285612e13565b600060209050601f831160018114612f0a5760008415612ef8578287015190505b612f028582612e84565b865550612f6a565b601f198416612f1886612cf4565b60005b82811015612f4057848901518255600182019150602085019450602081019050612f1b565b86831015612f5d5784890151612f59601f891682612e66565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b6000612f8882612068565b612f928185612f72565b9350612fa2818560208601612084565b80840191505092915050565b6000612fba8285612f7d565b9150612fc68284612f7d565b91508190509392505050565b7f746f6b656e4964206e756d206973206e6f7420656e6f75676800000000000000600082015250565b6000613008601983612073565b915061301382612fd2565b602082019050919050565b6000602082019050818103600083015261303781612ffb565b9050919050565b60006130498261211a565b91506130548361211a565b925082820390508181111561306c5761306b612b7f565b5b92915050565b600060408201905061308760008301856121af565b61309460208301846125ca565b9392505050565b6000815190506130aa816126f2565b92915050565b6000602082840312156130c6576130c5611fa3565b5b60006130d48482850161309b565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613139602683612073565b9150613144826130dd565b604082019050919050565b600060208201905081810360008301526131688161312c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006131a5602083612073565b91506131b08261316f565b602082019050919050565b600060208201905081810360008301526131d481613198565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613237602583612073565b9150613242826131db565b604082019050919050565b600060208201905081810360008301526132668161322a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006132c9602483612073565b91506132d48261326d565b604082019050919050565b600060208201905081810360008301526132f8816132bc565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613335601983612073565b9150613340826132ff565b602082019050919050565b6000602082019050818103600083015261336481613328565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006133c7603283612073565b91506133d28261336b565b604082019050919050565b600060208201905081810360008301526133f6816133ba565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006134538261342c565b61345d8185613437565b935061346d818560208601612084565b613476816120ae565b840191505092915050565b600060808201905061349660008301876121af565b6134a360208301866121af565b6134b060408301856125ca565b81810360608301526134c28184613448565b905095945050505050565b6000815190506134dc81611fd9565b92915050565b6000602082840312156134f8576134f7611fa3565b5b6000613506848285016134cd565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613545602083612073565b91506135508261350f565b602082019050919050565b6000602082019050818103600083015261357481613538565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006135b1601c83612073565b91506135bc8261357b565b602082019050919050565b600060208201905081810360008301526135e0816135a4565b905091905056fea26469706673582212207a441190d6cc9878897299fa3f714e973a1ca42d61640b38cc2ca6b7a9aa5e6b64736f6c63430008120033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101585760003560e01c8063715018a6116100c3578063b88d4fde1161007c578063b88d4fde1461039d578063c87b56dd146103b9578063c8f5c1f4146103e9578063df61264b14610405578063e985e9c514610435578063f2fde38b1461046557610158565b8063715018a6146103015780638da5cb5b1461030b57806395d89b41146103295780639b642de114610347578063a22cb46514610363578063ac1335f11461037f57610158565b806323b872dd1161011557806323b872dd1461023157806324eeedf61461024d57806342842e0e146102695780634ac78ace146102855780636352211e146102a157806370a08231146102d157610158565b806301ffc9a71461015d57806306fdde031461018d578063081812fc146101ab578063095ea7b3146101db578063144fa6d7146101f757806318b7e11c14610213575b600080fd5b61017760048036038101906101729190612005565b610481565b604051610184919061204d565b60405180910390f35b610195610563565b6040516101a291906120f8565b60405180910390f35b6101c560048036038101906101c09190612150565b6105f5565b6040516101d291906121be565b60405180910390f35b6101f560048036038101906101f09190612205565b61063b565b005b610211600480360381019061020c9190612245565b610752565b005b61021b61079e565b60405161022891906121be565b60405180910390f35b61024b60048036038101906102469190612272565b6107c4565b005b610267600480360381019061026291906122c5565b610824565b005b610283600480360381019061027e9190612272565b610853565b005b61029f600480360381019061029a9190612523565b610873565b005b6102bb60048036038101906102b69190612150565b61092a565b6040516102c891906121be565b60405180910390f35b6102eb60048036038101906102e69190612245565b6109b0565b6040516102f891906125d9565b60405180910390f35b610309610a67565b005b610313610a7b565b60405161032091906121be565b60405180910390f35b610331610aa5565b60405161033e91906120f8565b60405180910390f35b610361600480360381019061035c91906126a9565b610b37565b005b61037d6004803603810190610378919061271e565b610b52565b005b610387610b68565b60405161039491906120f8565b60405180910390f35b6103b760048036038101906103b291906127ff565b610bf6565b005b6103d360048036038101906103ce9190612150565b610c58565b6040516103e091906120f8565b60405180910390f35b61040360048036038101906103fe9190612882565b610cc0565b005b61041f600480360381019061041a9190612150565b610edd565b60405161042c91906125d9565b60405180910390f35b61044f600480360381019061044a91906128fa565b610ef5565b60405161045c919061204d565b60405180910390f35b61047f600480360381019061047a9190612245565b610f89565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061054c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061055c575061055b8261100c565b5b9050919050565b60606000805461057290612969565b80601f016020809104026020016040519081016040528092919081815260200182805461059e90612969565b80156105eb5780601f106105c0576101008083540402835291602001916105eb565b820191906000526020600020905b8154815290600101906020018083116105ce57829003601f168201915b5050505050905090565b600061060082611076565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106468261092a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ad90612a0c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106d56110c1565b73ffffffffffffffffffffffffffffffffffffffff1614806107045750610703816106fe6110c1565b610ef5565b5b610743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073a90612a9e565b60405180910390fd5b61074d83836110c9565b505050565b61075a611182565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6107d56107cf6110c1565b82611200565b610814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080b90612b30565b60405180910390fd5b61081f838383611295565b505050565b61082c611182565b610836838361158e565b806007600084815260200190815260200160002081905550505050565b61086e83838360405180602001604052806000815250610bf6565b505050565b61087b611182565b60005b8351811015610924576108c584828151811061089d5761089c612b50565b5b60200260200101518483815181106108b8576108b7612b50565b5b602002602001015161158e565b8181815181106108d8576108d7612b50565b5b6020026020010151600760008584815181106108f7576108f6612b50565b5b6020026020010151815260200190815260200160002081905550808061091c90612bae565b91505061087e565b50505050565b600080610936836115ac565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099e90612c42565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1790612cd4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a6f611182565b610a7960006115e9565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ab490612969565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae090612969565b8015610b2d5780601f10610b0257610100808354040283529160200191610b2d565b820191906000526020600020905b815481529060010190602001808311610b1057829003601f168201915b5050505050905090565b610b3f611182565b8060099081610b4e9190612ea0565b5050565b610b64610b5d6110c1565b83836116af565b5050565b60098054610b7590612969565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba190612969565b8015610bee5780601f10610bc357610100808354040283529160200191610bee565b820191906000526020600020905b815481529060010190602001808311610bd157829003601f168201915b505050505081565b610c07610c016110c1565b83611200565b610c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3d90612b30565b60405180910390fd5b610c528484848461181b565b50505050565b6060610c6382611076565b6000610c6d611877565b90506000815111610c8d5760405180602001604052806000815250610cb8565b80610c9784611909565b604051602001610ca8929190612fae565b6040516020818303038152906040525b915050919050565b610cc8611182565b60005b8251811015610ed857818181518110610ce757610ce6612b50565b5b602002602001015160076000858481518110610d0657610d05612b50565b5b60200260200101518152602001908152602001600020541015610d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d559061301e565b60405180910390fd5b818181518110610d7157610d70612b50565b5b602002602001015160076000858481518110610d9057610d8f612b50565b5b6020026020010151815260200190815260200160002054610db1919061303e565b60076000858481518110610dc857610dc7612b50565b5b60200260200101518152602001908152602001600020819055506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610e48868581518110610e3b57610e3a612b50565b5b602002602001015161092a565b858581518110610e5b57610e5a612b50565b5b60200260200101516040518363ffffffff1660e01b8152600401610e80929190613072565b6020604051808303816000875af1158015610e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec391906130b0565b50508080610ed090612bae565b915050610ccb565b505050565b60076020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610f91611182565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff79061314f565b60405180910390fd5b611009816115e9565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61107f816119d7565b6110be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b590612c42565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661113c8361092a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61118a6110c1565b73ffffffffffffffffffffffffffffffffffffffff166111a8610a7b565b73ffffffffffffffffffffffffffffffffffffffff16146111fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f5906131bb565b60405180910390fd5b565b60008061120c8361092a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061124e575061124d8185610ef5565b5b8061128c57508373ffffffffffffffffffffffffffffffffffffffff16611274846105f5565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166112b58261092a565b73ffffffffffffffffffffffffffffffffffffffff161461130b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113029061324d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361137a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611371906132df565b60405180910390fd5b6113878383836001611a18565b8273ffffffffffffffffffffffffffffffffffffffff166113a78261092a565b73ffffffffffffffffffffffffffffffffffffffff16146113fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f49061324d565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46115898383836001611a1e565b505050565b6115a8828260405180602001604052806000815250611a24565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361171d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117149061334b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161180e919061204d565b60405180910390a3505050565b611826848484611295565b61183284848484611a7f565b611871576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611868906133dd565b60405180910390fd5b50505050565b60606009805461188690612969565b80601f01602080910402602001604051908101604052809291908181526020018280546118b290612969565b80156118ff5780601f106118d4576101008083540402835291602001916118ff565b820191906000526020600020905b8154815290600101906020018083116118e257829003601f168201915b5050505050905090565b60606000600161191884611c06565b01905060008167ffffffffffffffff8111156119375761193661231d565b5b6040519080825280601f01601f1916602001820160405280156119695781602001600182028036833780820191505090505b509050600082602001820190505b6001156119cc578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816119c0576119bf6133fd565b5b04945060008503611977575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166119f9836115ac565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b611a2e8383611d59565b611a3b6000848484611a7f565b611a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a71906133dd565b60405180910390fd5b505050565b6000611aa08473ffffffffffffffffffffffffffffffffffffffff16611f76565b15611bf9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ac96110c1565b8786866040518563ffffffff1660e01b8152600401611aeb9493929190613481565b6020604051808303816000875af1925050508015611b2757506040513d601f19601f82011682018060405250810190611b2491906134e2565b60015b611ba9573d8060008114611b57576040519150601f19603f3d011682016040523d82523d6000602084013e611b5c565b606091505b506000815103611ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b98906133dd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611bfe565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611c64577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611c5a57611c596133fd565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611ca1576d04ee2d6d415b85acef81000000008381611c9757611c966133fd565b5b0492506020810190505b662386f26fc100008310611cd057662386f26fc100008381611cc657611cc56133fd565b5b0492506010810190505b6305f5e1008310611cf9576305f5e1008381611cef57611cee6133fd565b5b0492506008810190505b6127108310611d1e576127108381611d1457611d136133fd565b5b0492506004810190505b60648310611d415760648381611d3757611d366133fd565b5b0492506002810190505b600a8310611d50576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbf9061355b565b60405180910390fd5b611dd1816119d7565b15611e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e08906135c7565b60405180910390fd5b611e1f600083836001611a18565b611e28816119d7565b15611e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5f906135c7565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f72600083836001611a1e565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fe281611fad565b8114611fed57600080fd5b50565b600081359050611fff81611fd9565b92915050565b60006020828403121561201b5761201a611fa3565b5b600061202984828501611ff0565b91505092915050565b60008115159050919050565b61204781612032565b82525050565b6000602082019050612062600083018461203e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156120a2578082015181840152602081019050612087565b60008484015250505050565b6000601f19601f8301169050919050565b60006120ca82612068565b6120d48185612073565b93506120e4818560208601612084565b6120ed816120ae565b840191505092915050565b6000602082019050818103600083015261211281846120bf565b905092915050565b6000819050919050565b61212d8161211a565b811461213857600080fd5b50565b60008135905061214a81612124565b92915050565b60006020828403121561216657612165611fa3565b5b60006121748482850161213b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121a88261217d565b9050919050565b6121b88161219d565b82525050565b60006020820190506121d360008301846121af565b92915050565b6121e28161219d565b81146121ed57600080fd5b50565b6000813590506121ff816121d9565b92915050565b6000806040838503121561221c5761221b611fa3565b5b600061222a858286016121f0565b925050602061223b8582860161213b565b9150509250929050565b60006020828403121561225b5761225a611fa3565b5b6000612269848285016121f0565b91505092915050565b60008060006060848603121561228b5761228a611fa3565b5b6000612299868287016121f0565b93505060206122aa868287016121f0565b92505060406122bb8682870161213b565b9150509250925092565b6000806000606084860312156122de576122dd611fa3565b5b60006122ec868287016121f0565b93505060206122fd8682870161213b565b925050604061230e8682870161213b565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612355826120ae565b810181811067ffffffffffffffff821117156123745761237361231d565b5b80604052505050565b6000612387611f99565b9050612393828261234c565b919050565b600067ffffffffffffffff8211156123b3576123b261231d565b5b602082029050602081019050919050565b600080fd5b60006123dc6123d784612398565b61237d565b905080838252602082019050602084028301858111156123ff576123fe6123c4565b5b835b81811015612428578061241488826121f0565b845260208401935050602081019050612401565b5050509392505050565b600082601f83011261244757612446612318565b5b81356124578482602086016123c9565b91505092915050565b600067ffffffffffffffff82111561247b5761247a61231d565b5b602082029050602081019050919050565b600061249f61249a84612460565b61237d565b905080838252602082019050602084028301858111156124c2576124c16123c4565b5b835b818110156124eb57806124d7888261213b565b8452602084019350506020810190506124c4565b5050509392505050565b600082601f83011261250a57612509612318565b5b813561251a84826020860161248c565b91505092915050565b60008060006060848603121561253c5761253b611fa3565b5b600084013567ffffffffffffffff81111561255a57612559611fa8565b5b61256686828701612432565b935050602084013567ffffffffffffffff81111561258757612586611fa8565b5b612593868287016124f5565b925050604084013567ffffffffffffffff8111156125b4576125b3611fa8565b5b6125c0868287016124f5565b9150509250925092565b6125d38161211a565b82525050565b60006020820190506125ee60008301846125ca565b92915050565b600080fd5b600067ffffffffffffffff8211156126145761261361231d565b5b61261d826120ae565b9050602081019050919050565b82818337600083830152505050565b600061264c612647846125f9565b61237d565b905082815260208101848484011115612668576126676125f4565b5b61267384828561262a565b509392505050565b600082601f8301126126905761268f612318565b5b81356126a0848260208601612639565b91505092915050565b6000602082840312156126bf576126be611fa3565b5b600082013567ffffffffffffffff8111156126dd576126dc611fa8565b5b6126e98482850161267b565b91505092915050565b6126fb81612032565b811461270657600080fd5b50565b600081359050612718816126f2565b92915050565b6000806040838503121561273557612734611fa3565b5b6000612743858286016121f0565b925050602061275485828601612709565b9150509250929050565b600067ffffffffffffffff8211156127795761277861231d565b5b612782826120ae565b9050602081019050919050565b60006127a261279d8461275e565b61237d565b9050828152602081018484840111156127be576127bd6125f4565b5b6127c984828561262a565b509392505050565b600082601f8301126127e6576127e5612318565b5b81356127f684826020860161278f565b91505092915050565b6000806000806080858703121561281957612818611fa3565b5b6000612827878288016121f0565b9450506020612838878288016121f0565b93505060406128498782880161213b565b925050606085013567ffffffffffffffff81111561286a57612869611fa8565b5b612876878288016127d1565b91505092959194509250565b6000806040838503121561289957612898611fa3565b5b600083013567ffffffffffffffff8111156128b7576128b6611fa8565b5b6128c3858286016124f5565b925050602083013567ffffffffffffffff8111156128e4576128e3611fa8565b5b6128f0858286016124f5565b9150509250929050565b6000806040838503121561291157612910611fa3565b5b600061291f858286016121f0565b9250506020612930858286016121f0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061298157607f821691505b6020821081036129945761299361293a565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006129f6602183612073565b9150612a018261299a565b604082019050919050565b60006020820190508181036000830152612a25816129e9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612a88603d83612073565b9150612a9382612a2c565b604082019050919050565b60006020820190508181036000830152612ab781612a7b565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612b1a602d83612073565b9150612b2582612abe565b604082019050919050565b60006020820190508181036000830152612b4981612b0d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612bb98261211a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612beb57612bea612b7f565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612c2c601883612073565b9150612c3782612bf6565b602082019050919050565b60006020820190508181036000830152612c5b81612c1f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612cbe602983612073565b9150612cc982612c62565b604082019050919050565b60006020820190508181036000830152612ced81612cb1565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612d567fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612d19565b612d608683612d19565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612d9d612d98612d938461211a565b612d78565b61211a565b9050919050565b6000819050919050565b612db783612d82565b612dcb612dc382612da4565b848454612d26565b825550505050565b600090565b612de0612dd3565b612deb818484612dae565b505050565b5b81811015612e0f57612e04600082612dd8565b600181019050612df1565b5050565b601f821115612e5457612e2581612cf4565b612e2e84612d09565b81016020851015612e3d578190505b612e51612e4985612d09565b830182612df0565b50505b505050565b600082821c905092915050565b6000612e7760001984600802612e59565b1980831691505092915050565b6000612e908383612e66565b9150826002028217905092915050565b612ea982612068565b67ffffffffffffffff811115612ec257612ec161231d565b5b612ecc8254612969565b612ed7828285612e13565b600060209050601f831160018114612f0a5760008415612ef8578287015190505b612f028582612e84565b865550612f6a565b601f198416612f1886612cf4565b60005b82811015612f4057848901518255600182019150602085019450602081019050612f1b565b86831015612f5d5784890151612f59601f891682612e66565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b6000612f8882612068565b612f928185612f72565b9350612fa2818560208601612084565b80840191505092915050565b6000612fba8285612f7d565b9150612fc68284612f7d565b91508190509392505050565b7f746f6b656e4964206e756d206973206e6f7420656e6f75676800000000000000600082015250565b6000613008601983612073565b915061301382612fd2565b602082019050919050565b6000602082019050818103600083015261303781612ffb565b9050919050565b60006130498261211a565b91506130548361211a565b925082820390508181111561306c5761306b612b7f565b5b92915050565b600060408201905061308760008301856121af565b61309460208301846125ca565b9392505050565b6000815190506130aa816126f2565b92915050565b6000602082840312156130c6576130c5611fa3565b5b60006130d48482850161309b565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613139602683612073565b9150613144826130dd565b604082019050919050565b600060208201905081810360008301526131688161312c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006131a5602083612073565b91506131b08261316f565b602082019050919050565b600060208201905081810360008301526131d481613198565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613237602583612073565b9150613242826131db565b604082019050919050565b600060208201905081810360008301526132668161322a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006132c9602483612073565b91506132d48261326d565b604082019050919050565b600060208201905081810360008301526132f8816132bc565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613335601983612073565b9150613340826132ff565b602082019050919050565b6000602082019050818103600083015261336481613328565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006133c7603283612073565b91506133d28261336b565b604082019050919050565b600060208201905081810360008301526133f6816133ba565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006134538261342c565b61345d8185613437565b935061346d818560208601612084565b613476816120ae565b840191505092915050565b600060808201905061349660008301876121af565b6134a360208301866121af565b6134b060408301856125ca565b81810360608301526134c28184613448565b905095945050505050565b6000815190506134dc81611fd9565b92915050565b6000602082840312156134f8576134f7611fa3565b5b6000613506848285016134cd565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613545602083612073565b91506135508261350f565b602082019050919050565b6000602082019050818103600083015261357481613538565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006135b1601c83612073565b91506135bc8261357b565b602082019050919050565b600060208201905081810360008301526135e0816135a4565b905091905056fea26469706673582212207a441190d6cc9878897299fa3f714e973a1ca42d61640b38cc2ca6b7a9aa5e6b64736f6c63430008120033
Deployed Bytecode Sourcemap
57406:1418:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40793:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41721:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43233:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42751:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57716:83;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57497:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43933:301;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58002:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44305:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58159:255;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41431:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41162:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20131:103;;;:::i;:::-;;19483:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41890:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57805:85;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43476:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57527:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44527:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42065:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58422:394;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57451:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43702:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20389:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40793:305;40895:4;40947:25;40932:40;;;:11;:40;;;;:105;;;;41004:33;40989:48;;;:11;:48;;;;40932:105;:158;;;;41054:36;41078:11;41054:23;:36::i;:::-;40932:158;40912:178;;40793:305;;;:::o;41721:100::-;41775:13;41808:5;41801:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41721:100;:::o;43233:171::-;43309:7;43329:23;43344:7;43329:14;:23::i;:::-;43372:15;:24;43388:7;43372:24;;;;;;;;;;;;;;;;;;;;;43365:31;;43233:171;;;:::o;42751:416::-;42832:13;42848:23;42863:7;42848:14;:23::i;:::-;42832:39;;42896:5;42890:11;;:2;:11;;;42882:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;42990:5;42974:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;42999:37;43016:5;43023:12;:10;:12::i;:::-;42999:16;:37::i;:::-;42974:62;42952:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;43138:21;43147:2;43151:7;43138:8;:21::i;:::-;42821:346;42751:416;;:::o;57716:83::-;19369:13;:11;:13::i;:::-;57787:4:::1;57776:8;;:15;;;;;;;;;;;;;;;;;;57716:83:::0;:::o;57497:23::-;;;;;;;;;;;;;:::o;43933:301::-;44094:41;44113:12;:10;:12::i;:::-;44127:7;44094:18;:41::i;:::-;44086:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;44198:28;44208:4;44214:2;44218:7;44198:9;:28::i;:::-;43933:301;;;:::o;58002:149::-;19369:13;:11;:13::i;:::-;58090:22:::1;58100:2;58104:7;58090:9;:22::i;:::-;58139:4;58123;:13;58128:7;58123:13;;;;;;;;;;;:20;;;;58002:149:::0;;;:::o;44305:151::-;44409:39;44426:4;44432:2;44436:7;44409:39;;;;;;;;;;;;:16;:39::i;:::-;44305:151;;;:::o;58159:255::-;19369:13;:11;:13::i;:::-;58283:9:::1;58279:128;58297:2;:9;58295:1;:11;58279:128;;;58326:28;58336:2;58339:1;58336:5;;;;;;;;:::i;:::-;;;;;;;;58343:7;58351:1;58343:10;;;;;;;;:::i;:::-;;;;;;;;58326:9;:28::i;:::-;58388:4;58393:1;58388:7;;;;;;;;:::i;:::-;;;;;;;;58369:4;:16;58374:7;58382:1;58374:10;;;;;;;;:::i;:::-;;;;;;;;58369:16;;;;;;;;;;;:26;;;;58307:3;;;;;:::i;:::-;;;;58279:128;;;;58159:255:::0;;;:::o;41431:223::-;41503:7;41523:13;41539:17;41548:7;41539:8;:17::i;:::-;41523:33;;41592:1;41575:19;;:5;:19;;;41567:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;41641:5;41634:12;;;41431:223;;;:::o;41162:207::-;41234:7;41279:1;41262:19;;:5;:19;;;41254:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41345:9;:16;41355:5;41345:16;;;;;;;;;;;;;;;;41338:23;;41162:207;;;:::o;20131:103::-;19369:13;:11;:13::i;:::-;20196:30:::1;20223:1;20196:18;:30::i;:::-;20131:103::o:0;19483:87::-;19529:7;19556:6;;;;;;;;;;;19549:13;;19483:87;:::o;41890:104::-;41946:13;41979:7;41972:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41890:104;:::o;57805:85::-;19369:13;:11;:13::i;:::-;57877:5:::1;57870:4;:12;;;;;;:::i;:::-;;57805:85:::0;:::o;43476:155::-;43571:52;43590:12;:10;:12::i;:::-;43604:8;43614;43571:18;:52::i;:::-;43476:155;;:::o;57527:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44527:279::-;44658:41;44677:12;:10;:12::i;:::-;44691:7;44658:18;:41::i;:::-;44650:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;44760:38;44774:4;44780:2;44784:7;44793:4;44760:13;:38::i;:::-;44527:279;;;;:::o;42065:281::-;42138:13;42164:23;42179:7;42164:14;:23::i;:::-;42200:21;42224:10;:8;:10::i;:::-;42200:34;;42276:1;42258:7;42252:21;:25;:86;;;;;;;;;;;;;;;;;42304:7;42313:18;:7;:16;:18::i;:::-;42287:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42252:86;42245:93;;;42065:281;;;:::o;58422:394::-;19369:13;:11;:13::i;:::-;58522:9:::1;58518:291;58536:7;:14;58534:1;:16;58518:291;;;58598:4;58603:1;58598:7;;;;;;;;:::i;:::-;;;;;;;;58578:4;:16;58583:7;58591:1;58583:10;;;;;;;;:::i;:::-;;;;;;;;58578:16;;;;;;;;;;;;:27;;58569:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;58687:4;58692:1;58687:7;;;;;;;;:::i;:::-;;;;;;;;58668:4;:16;58673:7;58681:1;58673:10;;;;;;;;:::i;:::-;;;;;;;;58668:16;;;;;;;;;;;;:26;;;;:::i;:::-;58649:4;:16;58654:7;58662:1;58654:10;;;;;;;;:::i;:::-;;;;;;;;58649:16;;;;;;;;;;;:45;;;;58708:12;58730:8;;;;;;;;;;;58708:31;;58753:5;:14;;;58768:19;58776:7;58784:1;58776:10;;;;;;;;:::i;:::-;;;;;;;;58768:7;:19::i;:::-;58789:4;58794:1;58789:7;;;;;;;;:::i;:::-;;;;;;;;58753:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58555:254;58551:3;;;;;:::i;:::-;;;;58518:291;;;;58422:394:::0;;:::o;57451:39::-;;;;;;;;;;;;;;;;;:::o;43702:164::-;43799:4;43823:18;:25;43842:5;43823:25;;;;;;;;;;;;;;;:35;43849:8;43823:35;;;;;;;;;;;;;;;;;;;;;;;;;43816:42;;43702:164;;;;:::o;20389:201::-;19369:13;:11;:13::i;:::-;20498:1:::1;20478:22;;:8;:22;;::::0;20470:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;20554:28;20573:8;20554:18;:28::i;:::-;20389:201:::0;:::o;33417:157::-;33502:4;33541:25;33526:40;;;:11;:40;;;;33519:47;;33417:157;;;:::o;52796:135::-;52878:16;52886:7;52878;:16::i;:::-;52870:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;52796:135;:::o;18034:98::-;18087:7;18114:10;18107:17;;18034:98;:::o;52109:174::-;52211:2;52184:15;:24;52200:7;52184:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52267:7;52263:2;52229:46;;52238:23;52253:7;52238:14;:23::i;:::-;52229:46;;;;;;;;;;;;52109:174;;:::o;19648:132::-;19723:12;:10;:12::i;:::-;19712:23;;:7;:5;:7::i;:::-;:23;;;19704:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19648:132::o;46796:264::-;46889:4;46906:13;46922:23;46937:7;46922:14;:23::i;:::-;46906:39;;46975:5;46964:16;;:7;:16;;;:52;;;;46984:32;47001:5;47008:7;46984:16;:32::i;:::-;46964:52;:87;;;;47044:7;47020:31;;:20;47032:7;47020:11;:20::i;:::-;:31;;;46964:87;46956:96;;;46796:264;;;;:::o;50761:1229::-;50886:4;50859:31;;:23;50874:7;50859:14;:23::i;:::-;:31;;;50851:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50965:1;50951:16;;:2;:16;;;50943:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;51021:42;51042:4;51048:2;51052:7;51061:1;51021:20;:42::i;:::-;51193:4;51166:31;;:23;51181:7;51166:14;:23::i;:::-;:31;;;51158:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51311:15;:24;51327:7;51311:24;;;;;;;;;;;;51304:31;;;;;;;;;;;51806:1;51787:9;:15;51797:4;51787:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;51839:1;51822:9;:13;51832:2;51822:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;51881:2;51862:7;:16;51870:7;51862:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;51920:7;51916:2;51901:27;;51910:4;51901:27;;;;;;;;;;;;51941:41;51961:4;51967:2;51971:7;51980:1;51941:19;:41::i;:::-;50761:1229;;;:::o;47402:110::-;47478:26;47488:2;47492:7;47478:26;;;;;;;;;;;;:9;:26::i;:::-;47402:110;;:::o;46071:117::-;46137:7;46164;:16;46172:7;46164:16;;;;;;;;;;;;;;;;;;;;;46157:23;;46071:117;;;:::o;20750:191::-;20824:16;20843:6;;;;;;;;;;;20824:25;;20869:8;20860:6;;:17;;;;;;;;;;;;;;;;;;20924:8;20893:40;;20914:8;20893:40;;;;;;;;;;;;20813:128;20750:191;:::o;52426:281::-;52547:8;52538:17;;:5;:17;;;52530:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;52634:8;52596:18;:25;52615:5;52596:25;;;;;;;;;;;;;;;:35;52622:8;52596:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;52680:8;52658:41;;52673:5;52658:41;;;52690:8;52658:41;;;;;;:::i;:::-;;;;;;;;52426:281;;;:::o;45687:270::-;45800:28;45810:4;45816:2;45820:7;45800:9;:28::i;:::-;45847:47;45870:4;45876:2;45880:7;45889:4;45847:22;:47::i;:::-;45839:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;45687:270;;;;:::o;57896:98::-;57949:13;57982:4;57975:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57896:98;:::o;14953:716::-;15009:13;15060:14;15097:1;15077:17;15088:5;15077:10;:17::i;:::-;:21;15060:38;;15113:20;15147:6;15136:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15113:41;;15169:11;15298:6;15294:2;15290:15;15282:6;15278:28;15271:35;;15335:288;15342:4;15335:288;;;15367:5;;;;;;;;15509:8;15504:2;15497:5;15493:14;15488:30;15483:3;15475:44;15565:2;15556:11;;;;;;:::i;:::-;;;;;15599:1;15590:5;:10;15335:288;15586:21;15335:288;15644:6;15637:13;;;;;14953:716;;;:::o;46501:128::-;46566:4;46619:1;46590:31;;:17;46599:7;46590:8;:17::i;:::-;:31;;;;46583:38;;46501:128;;;:::o;55080:116::-;;;;;:::o;55918:115::-;;;;;:::o;47739:285::-;47834:18;47840:2;47844:7;47834:5;:18::i;:::-;47885:53;47916:1;47920:2;47924:7;47933:4;47885:22;:53::i;:::-;47863:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;47739:285;;;:::o;53495:853::-;53649:4;53670:15;:2;:13;;;:15::i;:::-;53666:675;;;53722:2;53706:36;;;53743:12;:10;:12::i;:::-;53757:4;53763:7;53772:4;53706:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53702:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53964:1;53947:6;:13;:18;53943:328;;53990:60;;;;;;;;;;:::i;:::-;;;;;;;;53943:328;54221:6;54215:13;54206:6;54202:2;54198:15;54191:38;53702:584;53838:41;;;53828:51;;;:6;:51;;;;53821:58;;;;;53666:675;54325:4;54318:11;;53495:853;;;;;;;:::o;11787:948::-;11840:7;11860:14;11877:1;11860:18;;11927:8;11918:5;:17;11914:106;;11965:8;11956:17;;;;;;:::i;:::-;;;;;12002:2;11992:12;;;;11914:106;12047:8;12038:5;:17;12034:106;;12085:8;12076:17;;;;;;:::i;:::-;;;;;12122:2;12112:12;;;;12034:106;12167:8;12158:5;:17;12154:106;;12205:8;12196:17;;;;;;:::i;:::-;;;;;12242:2;12232:12;;;;12154:106;12287:7;12278:5;:16;12274:103;;12324:7;12315:16;;;;;;:::i;:::-;;;;;12360:1;12350:11;;;;12274:103;12404:7;12395:5;:16;12391:103;;12441:7;12432:16;;;;;;:::i;:::-;;;;;12477:1;12467:11;;;;12391:103;12521:7;12512:5;:16;12508:103;;12558:7;12549:16;;;;;;:::i;:::-;;;;;12594:1;12584:11;;;;12508:103;12638:7;12629:5;:16;12625:68;;12676:1;12666:11;;;;12625:68;12721:6;12714:13;;;11787:948;;;:::o;48360:942::-;48454:1;48440:16;;:2;:16;;;48432:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;48513:16;48521:7;48513;:16::i;:::-;48512:17;48504:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48575:48;48604:1;48608:2;48612:7;48621:1;48575:20;:48::i;:::-;48722:16;48730:7;48722;:16::i;:::-;48721:17;48713:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49137:1;49120:9;:13;49130:2;49120:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;49181:2;49162:7;:16;49170:7;49162:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49226:7;49222:2;49201:33;;49218:1;49201:33;;;;;;;;;;;;49247:47;49275:1;49279:2;49283:7;49292:1;49247:19;:47::i;:::-;48360:942;;:::o;22422:326::-;22482:4;22739:1;22717:7;:19;;;:23;22710:30;;22422:326;;;:::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:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:329::-;4949:6;4998:2;4986:9;4977:7;4973:23;4969:32;4966:119;;;5004:79;;:::i;:::-;4966:119;5124:1;5149:53;5194:7;5185:6;5174:9;5170:22;5149:53;:::i;:::-;5139:63;;5095:117;4890:329;;;;:::o;5225:619::-;5302:6;5310;5318;5367:2;5355:9;5346:7;5342:23;5338:32;5335:119;;;5373:79;;:::i;:::-;5335:119;5493:1;5518:53;5563:7;5554:6;5543:9;5539:22;5518:53;:::i;:::-;5508:63;;5464:117;5620:2;5646:53;5691:7;5682:6;5671:9;5667:22;5646:53;:::i;:::-;5636:63;;5591:118;5748:2;5774:53;5819:7;5810:6;5799:9;5795:22;5774:53;:::i;:::-;5764:63;;5719:118;5225:619;;;;;:::o;5850:::-;5927:6;5935;5943;5992:2;5980:9;5971:7;5967:23;5963:32;5960:119;;;5998:79;;:::i;:::-;5960:119;6118:1;6143:53;6188:7;6179:6;6168:9;6164:22;6143:53;:::i;:::-;6133:63;;6089:117;6245:2;6271:53;6316:7;6307:6;6296:9;6292:22;6271:53;:::i;:::-;6261:63;;6216:118;6373:2;6399:53;6444:7;6435:6;6424:9;6420:22;6399:53;:::i;:::-;6389:63;;6344:118;5850:619;;;;;:::o;6475:117::-;6584:1;6581;6574:12;6598:180;6646:77;6643:1;6636:88;6743:4;6740:1;6733:15;6767:4;6764:1;6757:15;6784:281;6867:27;6889:4;6867:27;:::i;:::-;6859:6;6855:40;6997:6;6985:10;6982:22;6961:18;6949:10;6946:34;6943:62;6940:88;;;7008:18;;:::i;:::-;6940:88;7048:10;7044:2;7037:22;6827:238;6784:281;;:::o;7071:129::-;7105:6;7132:20;;:::i;:::-;7122:30;;7161:33;7189:4;7181:6;7161:33;:::i;:::-;7071:129;;;:::o;7206:311::-;7283:4;7373:18;7365:6;7362:30;7359:56;;;7395:18;;:::i;:::-;7359:56;7445:4;7437:6;7433:17;7425:25;;7505:4;7499;7495:15;7487:23;;7206:311;;;:::o;7523:117::-;7632:1;7629;7622:12;7663:710;7759:5;7784:81;7800:64;7857:6;7800:64;:::i;:::-;7784:81;:::i;:::-;7775:90;;7885:5;7914:6;7907:5;7900:21;7948:4;7941:5;7937:16;7930:23;;8001:4;7993:6;7989:17;7981:6;7977:30;8030:3;8022:6;8019:15;8016:122;;;8049:79;;:::i;:::-;8016:122;8164:6;8147:220;8181:6;8176:3;8173:15;8147:220;;;8256:3;8285:37;8318:3;8306:10;8285:37;:::i;:::-;8280:3;8273:50;8352:4;8347:3;8343:14;8336:21;;8223:144;8207:4;8202:3;8198:14;8191:21;;8147:220;;;8151:21;7765:608;;7663:710;;;;;:::o;8396:370::-;8467:5;8516:3;8509:4;8501:6;8497:17;8493:27;8483:122;;8524:79;;:::i;:::-;8483:122;8641:6;8628:20;8666:94;8756:3;8748:6;8741:4;8733:6;8729:17;8666:94;:::i;:::-;8657:103;;8473:293;8396:370;;;;:::o;8772:311::-;8849:4;8939:18;8931:6;8928:30;8925:56;;;8961:18;;:::i;:::-;8925:56;9011:4;9003:6;8999:17;8991:25;;9071:4;9065;9061:15;9053:23;;8772:311;;;:::o;9106:710::-;9202:5;9227:81;9243:64;9300:6;9243:64;:::i;:::-;9227:81;:::i;:::-;9218:90;;9328:5;9357:6;9350:5;9343:21;9391:4;9384:5;9380:16;9373:23;;9444:4;9436:6;9432:17;9424:6;9420:30;9473:3;9465:6;9462:15;9459:122;;;9492:79;;:::i;:::-;9459:122;9607:6;9590:220;9624:6;9619:3;9616:15;9590:220;;;9699:3;9728:37;9761:3;9749:10;9728:37;:::i;:::-;9723:3;9716:50;9795:4;9790:3;9786:14;9779:21;;9666:144;9650:4;9645:3;9641:14;9634:21;;9590:220;;;9594:21;9208:608;;9106:710;;;;;:::o;9839:370::-;9910:5;9959:3;9952:4;9944:6;9940:17;9936:27;9926:122;;9967:79;;:::i;:::-;9926:122;10084:6;10071:20;10109:94;10199:3;10191:6;10184:4;10176:6;10172:17;10109:94;:::i;:::-;10100:103;;9916:293;9839:370;;;;:::o;10215:1249::-;10367:6;10375;10383;10432:2;10420:9;10411:7;10407:23;10403:32;10400:119;;;10438:79;;:::i;:::-;10400:119;10586:1;10575:9;10571:17;10558:31;10616:18;10608:6;10605:30;10602:117;;;10638:79;;:::i;:::-;10602:117;10743:78;10813:7;10804:6;10793:9;10789:22;10743:78;:::i;:::-;10733:88;;10529:302;10898:2;10887:9;10883:18;10870:32;10929:18;10921:6;10918:30;10915:117;;;10951:79;;:::i;:::-;10915:117;11056:78;11126:7;11117:6;11106:9;11102:22;11056:78;:::i;:::-;11046:88;;10841:303;11211:2;11200:9;11196:18;11183:32;11242:18;11234:6;11231:30;11228:117;;;11264:79;;:::i;:::-;11228:117;11369:78;11439:7;11430:6;11419:9;11415:22;11369:78;:::i;:::-;11359:88;;11154:303;10215:1249;;;;;:::o;11470:118::-;11557:24;11575:5;11557:24;:::i;:::-;11552:3;11545:37;11470:118;;:::o;11594:222::-;11687:4;11725:2;11714:9;11710:18;11702:26;;11738:71;11806:1;11795:9;11791:17;11782:6;11738:71;:::i;:::-;11594:222;;;;:::o;11822:117::-;11931:1;11928;11921:12;11945:308;12007:4;12097:18;12089:6;12086:30;12083:56;;;12119:18;;:::i;:::-;12083:56;12157:29;12179:6;12157:29;:::i;:::-;12149:37;;12241:4;12235;12231:15;12223:23;;11945:308;;;:::o;12259:146::-;12356:6;12351:3;12346;12333:30;12397:1;12388:6;12383:3;12379:16;12372:27;12259:146;;;:::o;12411:425::-;12489:5;12514:66;12530:49;12572:6;12530:49;:::i;:::-;12514:66;:::i;:::-;12505:75;;12603:6;12596:5;12589:21;12641:4;12634:5;12630:16;12679:3;12670:6;12665:3;12661:16;12658:25;12655:112;;;12686:79;;:::i;:::-;12655:112;12776:54;12823:6;12818:3;12813;12776:54;:::i;:::-;12495:341;12411:425;;;;;:::o;12856:340::-;12912:5;12961:3;12954:4;12946:6;12942:17;12938:27;12928:122;;12969:79;;:::i;:::-;12928:122;13086:6;13073:20;13111:79;13186:3;13178:6;13171:4;13163:6;13159:17;13111:79;:::i;:::-;13102:88;;12918:278;12856:340;;;;:::o;13202:509::-;13271:6;13320:2;13308:9;13299:7;13295:23;13291:32;13288:119;;;13326:79;;:::i;:::-;13288:119;13474:1;13463:9;13459:17;13446:31;13504:18;13496:6;13493:30;13490:117;;;13526:79;;:::i;:::-;13490:117;13631:63;13686:7;13677:6;13666:9;13662:22;13631:63;:::i;:::-;13621:73;;13417:287;13202:509;;;;:::o;13717:116::-;13787:21;13802:5;13787:21;:::i;:::-;13780:5;13777:32;13767:60;;13823:1;13820;13813:12;13767:60;13717:116;:::o;13839:133::-;13882:5;13920:6;13907:20;13898:29;;13936:30;13960:5;13936:30;:::i;:::-;13839:133;;;;:::o;13978:468::-;14043:6;14051;14100:2;14088:9;14079:7;14075:23;14071:32;14068:119;;;14106:79;;:::i;:::-;14068:119;14226:1;14251:53;14296:7;14287:6;14276:9;14272:22;14251:53;:::i;:::-;14241:63;;14197:117;14353:2;14379:50;14421:7;14412:6;14401:9;14397:22;14379:50;:::i;:::-;14369:60;;14324:115;13978:468;;;;;:::o;14452:307::-;14513:4;14603:18;14595:6;14592:30;14589:56;;;14625:18;;:::i;:::-;14589:56;14663:29;14685:6;14663:29;:::i;:::-;14655:37;;14747:4;14741;14737:15;14729:23;;14452:307;;;:::o;14765:423::-;14842:5;14867:65;14883:48;14924:6;14883:48;:::i;:::-;14867:65;:::i;:::-;14858:74;;14955:6;14948:5;14941:21;14993:4;14986:5;14982:16;15031:3;15022:6;15017:3;15013:16;15010:25;15007:112;;;15038:79;;:::i;:::-;15007:112;15128:54;15175:6;15170:3;15165;15128:54;:::i;:::-;14848:340;14765:423;;;;;:::o;15207:338::-;15262:5;15311:3;15304:4;15296:6;15292:17;15288:27;15278:122;;15319:79;;:::i;:::-;15278:122;15436:6;15423:20;15461:78;15535:3;15527:6;15520:4;15512:6;15508:17;15461:78;:::i;:::-;15452:87;;15268:277;15207:338;;;;:::o;15551:943::-;15646:6;15654;15662;15670;15719:3;15707:9;15698:7;15694:23;15690:33;15687:120;;;15726:79;;:::i;:::-;15687:120;15846:1;15871:53;15916:7;15907:6;15896:9;15892:22;15871:53;:::i;:::-;15861:63;;15817:117;15973:2;15999:53;16044:7;16035:6;16024:9;16020:22;15999:53;:::i;:::-;15989:63;;15944:118;16101:2;16127:53;16172:7;16163:6;16152:9;16148:22;16127:53;:::i;:::-;16117:63;;16072:118;16257:2;16246:9;16242:18;16229:32;16288:18;16280:6;16277:30;16274:117;;;16310:79;;:::i;:::-;16274:117;16415:62;16469:7;16460:6;16449:9;16445:22;16415:62;:::i;:::-;16405:72;;16200:287;15551:943;;;;;;;:::o;16500:894::-;16618:6;16626;16675:2;16663:9;16654:7;16650:23;16646:32;16643:119;;;16681:79;;:::i;:::-;16643:119;16829:1;16818:9;16814:17;16801:31;16859:18;16851:6;16848:30;16845:117;;;16881:79;;:::i;:::-;16845:117;16986:78;17056:7;17047:6;17036:9;17032:22;16986:78;:::i;:::-;16976:88;;16772:302;17141:2;17130:9;17126:18;17113:32;17172:18;17164:6;17161:30;17158:117;;;17194:79;;:::i;:::-;17158:117;17299:78;17369:7;17360:6;17349:9;17345:22;17299:78;:::i;:::-;17289:88;;17084:303;16500:894;;;;;:::o;17400:474::-;17468:6;17476;17525:2;17513:9;17504:7;17500:23;17496:32;17493:119;;;17531:79;;:::i;:::-;17493:119;17651:1;17676:53;17721:7;17712:6;17701:9;17697:22;17676:53;:::i;:::-;17666:63;;17622:117;17778:2;17804:53;17849:7;17840:6;17829:9;17825:22;17804:53;:::i;:::-;17794:63;;17749:118;17400:474;;;;;:::o;17880:180::-;17928:77;17925:1;17918:88;18025:4;18022:1;18015:15;18049:4;18046:1;18039:15;18066:320;18110:6;18147:1;18141:4;18137:12;18127:22;;18194:1;18188:4;18184:12;18215:18;18205:81;;18271:4;18263:6;18259:17;18249:27;;18205:81;18333:2;18325:6;18322:14;18302:18;18299:38;18296:84;;18352:18;;:::i;:::-;18296:84;18117:269;18066:320;;;:::o;18392:220::-;18532:34;18528:1;18520:6;18516:14;18509:58;18601:3;18596:2;18588:6;18584:15;18577:28;18392:220;:::o;18618:366::-;18760:3;18781:67;18845:2;18840:3;18781:67;:::i;:::-;18774:74;;18857:93;18946:3;18857:93;:::i;:::-;18975:2;18970:3;18966:12;18959:19;;18618:366;;;:::o;18990:419::-;19156:4;19194:2;19183:9;19179:18;19171:26;;19243:9;19237:4;19233:20;19229:1;19218:9;19214:17;19207:47;19271:131;19397:4;19271:131;:::i;:::-;19263:139;;18990:419;;;:::o;19415:248::-;19555:34;19551:1;19543:6;19539:14;19532:58;19624:31;19619:2;19611:6;19607:15;19600:56;19415:248;:::o;19669:366::-;19811:3;19832:67;19896:2;19891:3;19832:67;:::i;:::-;19825:74;;19908:93;19997:3;19908:93;:::i;:::-;20026:2;20021:3;20017:12;20010:19;;19669:366;;;:::o;20041:419::-;20207:4;20245:2;20234:9;20230:18;20222:26;;20294:9;20288:4;20284:20;20280:1;20269:9;20265:17;20258:47;20322:131;20448:4;20322:131;:::i;:::-;20314:139;;20041:419;;;:::o;20466:232::-;20606:34;20602:1;20594:6;20590:14;20583:58;20675:15;20670:2;20662:6;20658:15;20651:40;20466:232;:::o;20704:366::-;20846:3;20867:67;20931:2;20926:3;20867:67;:::i;:::-;20860:74;;20943:93;21032:3;20943:93;:::i;:::-;21061:2;21056:3;21052:12;21045:19;;20704:366;;;:::o;21076:419::-;21242:4;21280:2;21269:9;21265:18;21257:26;;21329:9;21323:4;21319:20;21315:1;21304:9;21300:17;21293:47;21357:131;21483:4;21357:131;:::i;:::-;21349:139;;21076:419;;;:::o;21501:180::-;21549:77;21546:1;21539:88;21646:4;21643:1;21636:15;21670:4;21667:1;21660:15;21687:180;21735:77;21732:1;21725:88;21832:4;21829:1;21822:15;21856:4;21853:1;21846:15;21873:233;21912:3;21935:24;21953:5;21935:24;:::i;:::-;21926:33;;21981:66;21974:5;21971:77;21968:103;;22051:18;;:::i;:::-;21968:103;22098:1;22091:5;22087:13;22080:20;;21873:233;;;:::o;22112:174::-;22252:26;22248:1;22240:6;22236:14;22229:50;22112:174;:::o;22292:366::-;22434:3;22455:67;22519:2;22514:3;22455:67;:::i;:::-;22448:74;;22531:93;22620:3;22531:93;:::i;:::-;22649:2;22644:3;22640:12;22633:19;;22292:366;;;:::o;22664:419::-;22830:4;22868:2;22857:9;22853:18;22845:26;;22917:9;22911:4;22907:20;22903:1;22892:9;22888:17;22881:47;22945:131;23071:4;22945:131;:::i;:::-;22937:139;;22664:419;;;:::o;23089:228::-;23229:34;23225:1;23217:6;23213:14;23206:58;23298:11;23293:2;23285:6;23281:15;23274:36;23089:228;:::o;23323:366::-;23465:3;23486:67;23550:2;23545:3;23486:67;:::i;:::-;23479:74;;23562:93;23651:3;23562:93;:::i;:::-;23680:2;23675:3;23671:12;23664:19;;23323:366;;;:::o;23695:419::-;23861:4;23899:2;23888:9;23884:18;23876:26;;23948:9;23942:4;23938:20;23934:1;23923:9;23919:17;23912:47;23976:131;24102:4;23976:131;:::i;:::-;23968:139;;23695:419;;;:::o;24120:141::-;24169:4;24192:3;24184:11;;24215:3;24212:1;24205:14;24249:4;24246:1;24236:18;24228:26;;24120:141;;;:::o;24267:93::-;24304:6;24351:2;24346;24339:5;24335:14;24331:23;24321:33;;24267:93;;;:::o;24366:107::-;24410:8;24460:5;24454:4;24450:16;24429:37;;24366:107;;;;:::o;24479:393::-;24548:6;24598:1;24586:10;24582:18;24621:97;24651:66;24640:9;24621:97;:::i;:::-;24739:39;24769:8;24758:9;24739:39;:::i;:::-;24727:51;;24811:4;24807:9;24800:5;24796:21;24787:30;;24860:4;24850:8;24846:19;24839:5;24836:30;24826:40;;24555:317;;24479:393;;;;;:::o;24878:60::-;24906:3;24927:5;24920:12;;24878:60;;;:::o;24944:142::-;24994:9;25027:53;25045:34;25054:24;25072:5;25054:24;:::i;:::-;25045:34;:::i;:::-;25027:53;:::i;:::-;25014:66;;24944:142;;;:::o;25092:75::-;25135:3;25156:5;25149:12;;25092:75;;;:::o;25173:269::-;25283:39;25314:7;25283:39;:::i;:::-;25344:91;25393:41;25417:16;25393:41;:::i;:::-;25385:6;25378:4;25372:11;25344:91;:::i;:::-;25338:4;25331:105;25249:193;25173:269;;;:::o;25448:73::-;25493:3;25448:73;:::o;25527:189::-;25604:32;;:::i;:::-;25645:65;25703:6;25695;25689:4;25645:65;:::i;:::-;25580:136;25527:189;;:::o;25722:186::-;25782:120;25799:3;25792:5;25789:14;25782:120;;;25853:39;25890:1;25883:5;25853:39;:::i;:::-;25826:1;25819:5;25815:13;25806:22;;25782:120;;;25722:186;;:::o;25914:543::-;26015:2;26010:3;26007:11;26004:446;;;26049:38;26081:5;26049:38;:::i;:::-;26133:29;26151:10;26133:29;:::i;:::-;26123:8;26119:44;26316:2;26304:10;26301:18;26298:49;;;26337:8;26322:23;;26298:49;26360:80;26416:22;26434:3;26416:22;:::i;:::-;26406:8;26402:37;26389:11;26360:80;:::i;:::-;26019:431;;26004:446;25914:543;;;:::o;26463:117::-;26517:8;26567:5;26561:4;26557:16;26536:37;;26463:117;;;;:::o;26586:169::-;26630:6;26663:51;26711:1;26707:6;26699:5;26696:1;26692:13;26663:51;:::i;:::-;26659:56;26744:4;26738;26734:15;26724:25;;26637:118;26586:169;;;;:::o;26760:295::-;26836:4;26982:29;27007:3;27001:4;26982:29;:::i;:::-;26974:37;;27044:3;27041:1;27037:11;27031:4;27028:21;27020:29;;26760:295;;;;:::o;27060:1395::-;27177:37;27210:3;27177:37;:::i;:::-;27279:18;27271:6;27268:30;27265:56;;;27301:18;;:::i;:::-;27265:56;27345:38;27377:4;27371:11;27345:38;:::i;:::-;27430:67;27490:6;27482;27476:4;27430:67;:::i;:::-;27524:1;27548:4;27535:17;;27580:2;27572:6;27569:14;27597:1;27592:618;;;;28254:1;28271:6;28268:77;;;28320:9;28315:3;28311:19;28305:26;28296:35;;28268:77;28371:67;28431:6;28424:5;28371:67;:::i;:::-;28365:4;28358:81;28227:222;27562:887;;27592:618;27644:4;27640:9;27632:6;27628:22;27678:37;27710:4;27678:37;:::i;:::-;27737:1;27751:208;27765:7;27762:1;27759:14;27751:208;;;27844:9;27839:3;27835:19;27829:26;27821:6;27814:42;27895:1;27887:6;27883:14;27873:24;;27942:2;27931:9;27927:18;27914:31;;27788:4;27785:1;27781:12;27776:17;;27751:208;;;27987:6;27978:7;27975:19;27972:179;;;28045:9;28040:3;28036:19;28030:26;28088:48;28130:4;28122:6;28118:17;28107:9;28088:48;:::i;:::-;28080:6;28073:64;27995:156;27972:179;28197:1;28193;28185:6;28181:14;28177:22;28171:4;28164:36;27599:611;;;27562:887;;27152:1303;;;27060:1395;;:::o;28461:148::-;28563:11;28600:3;28585:18;;28461:148;;;;:::o;28615:390::-;28721:3;28749:39;28782:5;28749:39;:::i;:::-;28804:89;28886:6;28881:3;28804:89;:::i;:::-;28797:96;;28902:65;28960:6;28955:3;28948:4;28941:5;28937:16;28902:65;:::i;:::-;28992:6;28987:3;28983:16;28976:23;;28725:280;28615:390;;;;:::o;29011:435::-;29191:3;29213:95;29304:3;29295:6;29213:95;:::i;:::-;29206:102;;29325:95;29416:3;29407:6;29325:95;:::i;:::-;29318:102;;29437:3;29430:10;;29011:435;;;;;:::o;29452:175::-;29592:27;29588:1;29580:6;29576:14;29569:51;29452:175;:::o;29633:366::-;29775:3;29796:67;29860:2;29855:3;29796:67;:::i;:::-;29789:74;;29872:93;29961:3;29872:93;:::i;:::-;29990:2;29985:3;29981:12;29974:19;;29633:366;;;:::o;30005:419::-;30171:4;30209:2;30198:9;30194:18;30186:26;;30258:9;30252:4;30248:20;30244:1;30233:9;30229:17;30222:47;30286:131;30412:4;30286:131;:::i;:::-;30278:139;;30005:419;;;:::o;30430:194::-;30470:4;30490:20;30508:1;30490:20;:::i;:::-;30485:25;;30524:20;30542:1;30524:20;:::i;:::-;30519:25;;30568:1;30565;30561:9;30553:17;;30592:1;30586:4;30583:11;30580:37;;;30597:18;;:::i;:::-;30580:37;30430:194;;;;:::o;30630:332::-;30751:4;30789:2;30778:9;30774:18;30766:26;;30802:71;30870:1;30859:9;30855:17;30846:6;30802:71;:::i;:::-;30883:72;30951:2;30940:9;30936:18;30927:6;30883:72;:::i;:::-;30630:332;;;;;:::o;30968:137::-;31022:5;31053:6;31047:13;31038:22;;31069:30;31093:5;31069:30;:::i;:::-;30968:137;;;;:::o;31111:345::-;31178:6;31227:2;31215:9;31206:7;31202:23;31198:32;31195:119;;;31233:79;;:::i;:::-;31195:119;31353:1;31378:61;31431:7;31422:6;31411:9;31407:22;31378:61;:::i;:::-;31368:71;;31324:125;31111:345;;;;:::o;31462:225::-;31602:34;31598:1;31590:6;31586:14;31579:58;31671:8;31666:2;31658:6;31654:15;31647:33;31462:225;:::o;31693:366::-;31835:3;31856:67;31920:2;31915:3;31856:67;:::i;:::-;31849:74;;31932:93;32021:3;31932:93;:::i;:::-;32050:2;32045:3;32041:12;32034:19;;31693:366;;;:::o;32065:419::-;32231:4;32269:2;32258:9;32254:18;32246:26;;32318:9;32312:4;32308:20;32304:1;32293:9;32289:17;32282:47;32346:131;32472:4;32346:131;:::i;:::-;32338:139;;32065:419;;;:::o;32490:182::-;32630:34;32626:1;32618:6;32614:14;32607:58;32490:182;:::o;32678:366::-;32820:3;32841:67;32905:2;32900:3;32841:67;:::i;:::-;32834:74;;32917:93;33006:3;32917:93;:::i;:::-;33035:2;33030:3;33026:12;33019:19;;32678:366;;;:::o;33050:419::-;33216:4;33254:2;33243:9;33239:18;33231:26;;33303:9;33297:4;33293:20;33289:1;33278:9;33274:17;33267:47;33331:131;33457:4;33331:131;:::i;:::-;33323:139;;33050:419;;;:::o;33475:224::-;33615:34;33611:1;33603:6;33599:14;33592:58;33684:7;33679:2;33671:6;33667:15;33660:32;33475:224;:::o;33705:366::-;33847:3;33868:67;33932:2;33927:3;33868:67;:::i;:::-;33861:74;;33944:93;34033:3;33944:93;:::i;:::-;34062:2;34057:3;34053:12;34046:19;;33705:366;;;:::o;34077:419::-;34243:4;34281:2;34270:9;34266:18;34258:26;;34330:9;34324:4;34320:20;34316:1;34305:9;34301:17;34294:47;34358:131;34484:4;34358:131;:::i;:::-;34350:139;;34077:419;;;:::o;34502:223::-;34642:34;34638:1;34630:6;34626:14;34619:58;34711:6;34706:2;34698:6;34694:15;34687:31;34502:223;:::o;34731:366::-;34873:3;34894:67;34958:2;34953:3;34894:67;:::i;:::-;34887:74;;34970:93;35059:3;34970:93;:::i;:::-;35088:2;35083:3;35079:12;35072:19;;34731:366;;;:::o;35103:419::-;35269:4;35307:2;35296:9;35292:18;35284:26;;35356:9;35350:4;35346:20;35342:1;35331:9;35327:17;35320:47;35384:131;35510:4;35384:131;:::i;:::-;35376:139;;35103:419;;;:::o;35528:175::-;35668:27;35664:1;35656:6;35652:14;35645:51;35528:175;:::o;35709:366::-;35851:3;35872:67;35936:2;35931:3;35872:67;:::i;:::-;35865:74;;35948:93;36037:3;35948:93;:::i;:::-;36066:2;36061:3;36057:12;36050:19;;35709:366;;;:::o;36081:419::-;36247:4;36285:2;36274:9;36270:18;36262:26;;36334:9;36328:4;36324:20;36320:1;36309:9;36305:17;36298:47;36362:131;36488:4;36362:131;:::i;:::-;36354:139;;36081:419;;;:::o;36506:237::-;36646:34;36642:1;36634:6;36630:14;36623:58;36715:20;36710:2;36702:6;36698:15;36691:45;36506:237;:::o;36749:366::-;36891:3;36912:67;36976:2;36971:3;36912:67;:::i;:::-;36905:74;;36988:93;37077:3;36988:93;:::i;:::-;37106:2;37101:3;37097:12;37090:19;;36749:366;;;:::o;37121:419::-;37287:4;37325:2;37314:9;37310:18;37302:26;;37374:9;37368:4;37364:20;37360:1;37349:9;37345:17;37338:47;37402:131;37528:4;37402:131;:::i;:::-;37394:139;;37121:419;;;:::o;37546:180::-;37594:77;37591:1;37584:88;37691:4;37688:1;37681:15;37715:4;37712:1;37705:15;37732:98;37783:6;37817:5;37811:12;37801:22;;37732:98;;;:::o;37836:168::-;37919:11;37953:6;37948:3;37941:19;37993:4;37988:3;37984:14;37969:29;;37836:168;;;;:::o;38010:373::-;38096:3;38124:38;38156:5;38124:38;:::i;:::-;38178:70;38241:6;38236:3;38178:70;:::i;:::-;38171:77;;38257:65;38315:6;38310:3;38303:4;38296:5;38292:16;38257:65;:::i;:::-;38347:29;38369:6;38347:29;:::i;:::-;38342:3;38338:39;38331:46;;38100:283;38010:373;;;;:::o;38389:640::-;38584:4;38622:3;38611:9;38607:19;38599:27;;38636:71;38704:1;38693:9;38689:17;38680:6;38636:71;:::i;:::-;38717:72;38785:2;38774:9;38770:18;38761:6;38717:72;:::i;:::-;38799;38867:2;38856:9;38852:18;38843:6;38799:72;:::i;:::-;38918:9;38912:4;38908:20;38903:2;38892:9;38888:18;38881:48;38946:76;39017:4;39008:6;38946:76;:::i;:::-;38938:84;;38389:640;;;;;;;:::o;39035:141::-;39091:5;39122:6;39116:13;39107:22;;39138:32;39164:5;39138:32;:::i;:::-;39035:141;;;;:::o;39182:349::-;39251:6;39300:2;39288:9;39279:7;39275:23;39271:32;39268:119;;;39306:79;;:::i;:::-;39268:119;39426:1;39451:63;39506:7;39497:6;39486:9;39482:22;39451:63;:::i;:::-;39441:73;;39397:127;39182:349;;;;:::o;39537:182::-;39677:34;39673:1;39665:6;39661:14;39654:58;39537:182;:::o;39725:366::-;39867:3;39888:67;39952:2;39947:3;39888:67;:::i;:::-;39881:74;;39964:93;40053:3;39964:93;:::i;:::-;40082:2;40077:3;40073:12;40066:19;;39725:366;;;:::o;40097:419::-;40263:4;40301:2;40290:9;40286:18;40278:26;;40350:9;40344:4;40340:20;40336:1;40325:9;40321:17;40314:47;40378:131;40504:4;40378:131;:::i;:::-;40370:139;;40097:419;;;:::o;40522:178::-;40662:30;40658:1;40650:6;40646:14;40639:54;40522:178;:::o;40706:366::-;40848:3;40869:67;40933:2;40928:3;40869:67;:::i;:::-;40862:74;;40945:93;41034:3;40945:93;:::i;:::-;41063:2;41058:3;41054:12;41047:19;;40706:366;;;:::o;41078:419::-;41244:4;41282:2;41271:9;41267:18;41259:26;;41331:9;41325:4;41321:20;41317:1;41306:9;41302:17;41295:47;41359:131;41485:4;41359:131;:::i;:::-;41351:139;;41078:419;;;:::o
Swarm Source
ipfs://7a441190d6cc9878897299fa3f714e973a1ca42d61640b38cc2ca6b7a9aa5e6b
Loading...
Loading
Loading...
Loading
[ 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.