Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 78 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 9432605 | 386 days ago | IN | 0 ETH | 0.00014084 | ||||
Set Approval For... | 9430027 | 386 days ago | IN | 0 ETH | 0.00011425 | ||||
Set Approval For... | 9424328 | 386 days ago | IN | 0 ETH | 0.00006762 | ||||
Set Approval For... | 9423382 | 386 days ago | IN | 0 ETH | 0.00005596 | ||||
Set Approval For... | 8722667 | 418 days ago | IN | 0 ETH | 0.00003395 | ||||
Set Approval For... | 8722283 | 418 days ago | IN | 0 ETH | 0.00003557 | ||||
Set Approval For... | 8720331 | 418 days ago | IN | 0 ETH | 0.00004428 | ||||
Set Approval For... | 8720065 | 418 days ago | IN | 0 ETH | 0.00003882 | ||||
Set Approval For... | 8625269 | 424 days ago | IN | 0 ETH | 0.00008118 | ||||
Set Approval For... | 8622212 | 424 days ago | IN | 0 ETH | 0.00006259 | ||||
Set Approval For... | 8622202 | 424 days ago | IN | 0 ETH | 0.00006834 | ||||
Set Approval For... | 8622188 | 424 days ago | IN | 0 ETH | 0.00006716 | ||||
Set Approval For... | 7905320 | 448 days ago | IN | 0 ETH | 0.00007461 | ||||
Set Approval For... | 7905266 | 448 days ago | IN | 0 ETH | 0.00007648 | ||||
Set Approval For... | 7878985 | 449 days ago | IN | 0 ETH | 0.00007741 | ||||
Set Approval For... | 7878964 | 449 days ago | IN | 0 ETH | 0.00008161 | ||||
Set Approval For... | 7878228 | 449 days ago | IN | 0 ETH | 0.00008441 | ||||
Set Approval For... | 7878221 | 449 days ago | IN | 0 ETH | 0.00008627 | ||||
Set Approval For... | 7877324 | 449 days ago | IN | 0 ETH | 0.0000914 | ||||
Set Approval For... | 7875705 | 449 days ago | IN | 0 ETH | 0.00008207 | ||||
Set Approval For... | 7425844 | 459 days ago | IN | 0 ETH | 0.00006715 | ||||
Set Approval For... | 7425732 | 459 days ago | IN | 0 ETH | 0.00001992 | ||||
Mint | 2926149 | 571 days ago | IN | 0 ETH | 0.00010505 | ||||
Transfer From | 2856369 | 573 days ago | IN | 0 ETH | 0.00005008 | ||||
Transfer From | 2856355 | 573 days ago | IN | 0 ETH | 0.00005227 |
Loading...
Loading
Contract Name:
CopilotERC721
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at zkevm.polygonscan.com on 2023-06-07 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/[email protected]/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/[email protected]/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.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) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 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 10, 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 * 8) < value ? 1 : 0); } } } // File: @openzeppelin/[email protected]/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.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 `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); } } // File: @openzeppelin/[email protected]/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/[email protected]/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/[email protected]/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return 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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.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/[email protected]/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/[email protected]/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.8.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 { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @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 {} } // File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Burnable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _burn(tokenId); } } // File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: layer-e-collections.sol pragma solidity ^0.8.9; contract CopilotERC721 is ERC721, ERC721URIStorage, ERC721Burnable, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; constructor() ERC721("copilot-collections", "ccl") {} function Mint(address to, string memory uri) public { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _mint(to, tokenId); _setTokenURI(tokenId, uri); } // The following functions are overrides required by Solidity. function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function setTokenURI(uint256 tokenId,string memory uri) public onlyOwner{ _setTokenURI(tokenId,uri); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"Mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","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":"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":"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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","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"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280601381526020017f636f70696c6f742d636f6c6c656374696f6e73000000000000000000000000008152506040518060400160405280600381526020017f63636c000000000000000000000000000000000000000000000000000000000081525081600090816200008f919062000412565b508060019081620000a1919062000412565b505050620000c4620000b8620000ca60201b60201c565b620000d260201b60201c565b620004f9565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200021a57607f821691505b60208210810362000230576200022f620001d2565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200029a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200025b565b620002a686836200025b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620002f3620002ed620002e784620002be565b620002c8565b620002be565b9050919050565b6000819050919050565b6200030f83620002d2565b620003276200031e82620002fa565b84845462000268565b825550505050565b600090565b6200033e6200032f565b6200034b81848462000304565b505050565b5b8181101562000373576200036760008262000334565b60018101905062000351565b5050565b601f821115620003c2576200038c8162000236565b62000397846200024b565b81016020851015620003a7578190505b620003bf620003b6856200024b565b83018262000350565b50505b505050565b600082821c905092915050565b6000620003e760001984600802620003c7565b1980831691505092915050565b6000620004028383620003d4565b9150826002028217905092915050565b6200041d8262000198565b67ffffffffffffffff811115620004395762000438620001a3565b5b62000445825462000201565b6200045282828562000377565b600060209050601f8311600181146200048a576000841562000475578287015190505b620004818582620003f4565b865550620004f1565b601f1984166200049a8662000236565b60005b82811015620004c4578489015182556001820191506020850194506020810190506200049d565b86831015620004e45784890151620004e0601f891682620003d4565b8355505b6001600288020188555050505b505050505050565b61328480620005096000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80636352211e116100ad578063a22cb46511610071578063a22cb465146102f2578063b88d4fde1461030e578063c87b56dd1461032a578063e985e9c51461035a578063f2fde38b1461038a57610121565b80636352211e1461024c57806370a082311461027c578063715018a6146102ac5780638da5cb5b146102b657806395d89b41146102d457610121565b8063162094c4116100f4578063162094c4146101c057806323b872dd146101dc57806342842e0e146101f857806342966c68146102145780634c2f6dd31461023057610121565b806301ffc9a71461012657806306fdde0314610156578063081812fc14610174578063095ea7b3146101a4575b600080fd5b610140600480360381019061013b9190611f82565b6103a6565b60405161014d9190611fca565b60405180910390f35b61015e610488565b60405161016b9190612075565b60405180910390f35b61018e600480360381019061018991906120cd565b61051a565b60405161019b919061213b565b60405180910390f35b6101be60048036038101906101b99190612182565b610560565b005b6101da60048036038101906101d591906122f7565b610677565b005b6101f660048036038101906101f19190612353565b61068d565b005b610212600480360381019061020d9190612353565b6106ed565b005b61022e600480360381019061022991906120cd565b61070d565b005b61024a600480360381019061024591906123a6565b610769565b005b610266600480360381019061026191906120cd565b61079a565b604051610273919061213b565b60405180910390f35b61029660048036038101906102919190612402565b610820565b6040516102a3919061243e565b60405180910390f35b6102b46108d7565b005b6102be6108eb565b6040516102cb919061213b565b60405180910390f35b6102dc610915565b6040516102e99190612075565b60405180910390f35b61030c60048036038101906103079190612485565b6109a7565b005b61032860048036038101906103239190612566565b6109bd565b005b610344600480360381019061033f91906120cd565b610a1f565b6040516103519190612075565b60405180910390f35b610374600480360381019061036f91906125e9565b610a31565b6040516103819190611fca565b60405180910390f35b6103a4600480360381019061039f9190612402565b610ac5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061047157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610481575061048082610b48565b5b9050919050565b60606000805461049790612658565b80601f01602080910402602001604051908101604052809291908181526020018280546104c390612658565b80156105105780601f106104e557610100808354040283529160200191610510565b820191906000526020600020905b8154815290600101906020018083116104f357829003601f168201915b5050505050905090565b600061052582610bb2565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061056b8261079a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d2906126fb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166105fa610bfd565b73ffffffffffffffffffffffffffffffffffffffff161480610629575061062881610623610bfd565b610a31565b5b610668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065f9061278d565b60405180910390fd5b6106728383610c05565b505050565b61067f610cbe565b6106898282610d3c565b5050565b61069e610698610bfd565b82610da9565b6106dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d49061281f565b60405180910390fd5b6106e8838383610e3e565b505050565b610708838383604051806020016040528060008152506109bd565b505050565b61071e610718610bfd565b82610da9565b61075d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107549061281f565b60405180910390fd5b61076681611137565b50565b60006107756008611143565b90506107816008611151565b61078b8382611167565b6107958183610d3c565b505050565b6000806107a683611384565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080e9061288b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610890576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108879061291d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108df610cbe565b6108e960006113c1565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461092490612658565b80601f016020809104026020016040519081016040528092919081815260200182805461095090612658565b801561099d5780601f106109725761010080835404028352916020019161099d565b820191906000526020600020905b81548152906001019060200180831161098057829003601f168201915b5050505050905090565b6109b96109b2610bfd565b8383611487565b5050565b6109ce6109c8610bfd565b83610da9565b610a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a049061281f565b60405180910390fd5b610a19848484846115f3565b50505050565b6060610a2a8261164f565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610acd610cbe565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b33906129af565b60405180910390fd5b610b45816113c1565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610bbb81611761565b610bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf19061288b565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610c788361079a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610cc6610bfd565b73ffffffffffffffffffffffffffffffffffffffff16610ce46108eb565b73ffffffffffffffffffffffffffffffffffffffff1614610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3190612a1b565b60405180910390fd5b565b610d4582611761565b610d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7b90612aad565b60405180910390fd5b80600660008481526020019081526020016000209081610da49190612c79565b505050565b600080610db58361079a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610df75750610df68185610a31565b5b80610e3557508373ffffffffffffffffffffffffffffffffffffffff16610e1d8461051a565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610e5e8261079a565b73ffffffffffffffffffffffffffffffffffffffff1614610eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eab90612dbd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1a90612e4f565b60405180910390fd5b610f3083838360016117a2565b8273ffffffffffffffffffffffffffffffffffffffff16610f508261079a565b73ffffffffffffffffffffffffffffffffffffffff1614610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d90612dbd565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461113283838360016118c8565b505050565b611140816118ce565b50565b600081600001549050919050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cd90612ebb565b60405180910390fd5b6111df81611761565b1561121f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121690612f27565b60405180910390fd5b61122d6000838360016117a2565b61123681611761565b15611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d90612f27565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113806000838360016118c8565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036114f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ec90612f93565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115e69190611fca565b60405180910390a3505050565b6115fe848484610e3e565b61160a84848484611921565b611649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164090613025565b60405180910390fd5b50505050565b606061165a82610bb2565b600060066000848152602001908152602001600020805461167a90612658565b80601f01602080910402602001604051908101604052809291908181526020018280546116a690612658565b80156116f35780601f106116c8576101008083540402835291602001916116f3565b820191906000526020600020905b8154815290600101906020018083116116d657829003601f168201915b505050505090506000611704611aa8565b9050600081510361171957819250505061175c565b60008251111561174e578082604051602001611736929190613081565b6040516020818303038152906040529250505061175c565b61175784611abf565b925050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661178383611384565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60018111156118c257600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146118365780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461182e91906130d4565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146118c15780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118b99190613108565b925050819055505b5b50505050565b50505050565b6118d781611b27565b60006006600083815260200190815260200160002080546118f790612658565b90501461191e5760066000828152602001908152602001600020600061191d9190611eb9565b5b50565b60006119428473ffffffffffffffffffffffffffffffffffffffff16611c75565b15611a9b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261196b610bfd565b8786866040518563ffffffff1660e01b815260040161198d9493929190613191565b6020604051808303816000875af19250505080156119c957506040513d601f19601f820116820180604052508101906119c691906131f2565b60015b611a4b573d80600081146119f9576040519150601f19603f3d011682016040523d82523d6000602084013e6119fe565b606091505b506000815103611a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3a90613025565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611aa0565b600190505b949350505050565b606060405180602001604052806000815250905090565b6060611aca82610bb2565b6000611ad4611aa8565b90506000815111611af45760405180602001604052806000815250611b1f565b80611afe84611c98565b604051602001611b0f929190613081565b6040516020818303038152906040525b915050919050565b6000611b328261079a565b9050611b428160008460016117a2565b611b4b8261079a565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c718160008460016118c8565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060006001611ca784611d66565b01905060008167ffffffffffffffff811115611cc657611cc56121cc565b5b6040519080825280601f01601f191660200182016040528015611cf85781602001600182028036833780820191505090505b509050600082602001820190505b600115611d5b578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611d4f57611d4e61321f565b5b04945060008503611d06575b819350505050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611dc4577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611dba57611db961321f565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611e01576d04ee2d6d415b85acef81000000008381611df757611df661321f565b5b0492506020810190505b662386f26fc100008310611e3057662386f26fc100008381611e2657611e2561321f565b5b0492506010810190505b6305f5e1008310611e59576305f5e1008381611e4f57611e4e61321f565b5b0492506008810190505b6127108310611e7e576127108381611e7457611e7361321f565b5b0492506004810190505b60648310611ea15760648381611e9757611e9661321f565b5b0492506002810190505b600a8310611eb0576001810190505b80915050919050565b508054611ec590612658565b6000825580601f10611ed75750611ef6565b601f016020900490600052602060002090810190611ef59190611ef9565b5b50565b5b80821115611f12576000816000905550600101611efa565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611f5f81611f2a565b8114611f6a57600080fd5b50565b600081359050611f7c81611f56565b92915050565b600060208284031215611f9857611f97611f20565b5b6000611fa684828501611f6d565b91505092915050565b60008115159050919050565b611fc481611faf565b82525050565b6000602082019050611fdf6000830184611fbb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561201f578082015181840152602081019050612004565b60008484015250505050565b6000601f19601f8301169050919050565b600061204782611fe5565b6120518185611ff0565b9350612061818560208601612001565b61206a8161202b565b840191505092915050565b6000602082019050818103600083015261208f818461203c565b905092915050565b6000819050919050565b6120aa81612097565b81146120b557600080fd5b50565b6000813590506120c7816120a1565b92915050565b6000602082840312156120e3576120e2611f20565b5b60006120f1848285016120b8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612125826120fa565b9050919050565b6121358161211a565b82525050565b6000602082019050612150600083018461212c565b92915050565b61215f8161211a565b811461216a57600080fd5b50565b60008135905061217c81612156565b92915050565b6000806040838503121561219957612198611f20565b5b60006121a78582860161216d565b92505060206121b8858286016120b8565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6122048261202b565b810181811067ffffffffffffffff82111715612223576122226121cc565b5b80604052505050565b6000612236611f16565b905061224282826121fb565b919050565b600067ffffffffffffffff821115612262576122616121cc565b5b61226b8261202b565b9050602081019050919050565b82818337600083830152505050565b600061229a61229584612247565b61222c565b9050828152602081018484840111156122b6576122b56121c7565b5b6122c1848285612278565b509392505050565b600082601f8301126122de576122dd6121c2565b5b81356122ee848260208601612287565b91505092915050565b6000806040838503121561230e5761230d611f20565b5b600061231c858286016120b8565b925050602083013567ffffffffffffffff81111561233d5761233c611f25565b5b612349858286016122c9565b9150509250929050565b60008060006060848603121561236c5761236b611f20565b5b600061237a8682870161216d565b935050602061238b8682870161216d565b925050604061239c868287016120b8565b9150509250925092565b600080604083850312156123bd576123bc611f20565b5b60006123cb8582860161216d565b925050602083013567ffffffffffffffff8111156123ec576123eb611f25565b5b6123f8858286016122c9565b9150509250929050565b60006020828403121561241857612417611f20565b5b60006124268482850161216d565b91505092915050565b61243881612097565b82525050565b6000602082019050612453600083018461242f565b92915050565b61246281611faf565b811461246d57600080fd5b50565b60008135905061247f81612459565b92915050565b6000806040838503121561249c5761249b611f20565b5b60006124aa8582860161216d565b92505060206124bb85828601612470565b9150509250929050565b600067ffffffffffffffff8211156124e0576124df6121cc565b5b6124e98261202b565b9050602081019050919050565b6000612509612504846124c5565b61222c565b905082815260208101848484011115612525576125246121c7565b5b612530848285612278565b509392505050565b600082601f83011261254d5761254c6121c2565b5b813561255d8482602086016124f6565b91505092915050565b600080600080608085870312156125805761257f611f20565b5b600061258e8782880161216d565b945050602061259f8782880161216d565b93505060406125b0878288016120b8565b925050606085013567ffffffffffffffff8111156125d1576125d0611f25565b5b6125dd87828801612538565b91505092959194509250565b60008060408385031215612600576125ff611f20565b5b600061260e8582860161216d565b925050602061261f8582860161216d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061267057607f821691505b60208210810361268357612682612629565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006126e5602183611ff0565b91506126f082612689565b604082019050919050565b60006020820190508181036000830152612714816126d8565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612777603d83611ff0565b91506127828261271b565b604082019050919050565b600060208201905081810360008301526127a68161276a565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612809602d83611ff0565b9150612814826127ad565b604082019050919050565b60006020820190508181036000830152612838816127fc565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612875601883611ff0565b91506128808261283f565b602082019050919050565b600060208201905081810360008301526128a481612868565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612907602983611ff0565b9150612912826128ab565b604082019050919050565b60006020820190508181036000830152612936816128fa565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612999602683611ff0565b91506129a48261293d565b604082019050919050565b600060208201905081810360008301526129c88161298c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612a05602083611ff0565b9150612a10826129cf565b602082019050919050565b60006020820190508181036000830152612a34816129f8565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000612a97602e83611ff0565b9150612aa282612a3b565b604082019050919050565b60006020820190508181036000830152612ac681612a8a565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612b2f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612af2565b612b398683612af2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612b76612b71612b6c84612097565b612b51565b612097565b9050919050565b6000819050919050565b612b9083612b5b565b612ba4612b9c82612b7d565b848454612aff565b825550505050565b600090565b612bb9612bac565b612bc4818484612b87565b505050565b5b81811015612be857612bdd600082612bb1565b600181019050612bca565b5050565b601f821115612c2d57612bfe81612acd565b612c0784612ae2565b81016020851015612c16578190505b612c2a612c2285612ae2565b830182612bc9565b50505b505050565b600082821c905092915050565b6000612c5060001984600802612c32565b1980831691505092915050565b6000612c698383612c3f565b9150826002028217905092915050565b612c8282611fe5565b67ffffffffffffffff811115612c9b57612c9a6121cc565b5b612ca58254612658565b612cb0828285612bec565b600060209050601f831160018114612ce35760008415612cd1578287015190505b612cdb8582612c5d565b865550612d43565b601f198416612cf186612acd565b60005b82811015612d1957848901518255600182019150602085019450602081019050612cf4565b86831015612d365784890151612d32601f891682612c3f565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612da7602583611ff0565b9150612db282612d4b565b604082019050919050565b60006020820190508181036000830152612dd681612d9a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612e39602483611ff0565b9150612e4482612ddd565b604082019050919050565b60006020820190508181036000830152612e6881612e2c565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612ea5602083611ff0565b9150612eb082612e6f565b602082019050919050565b60006020820190508181036000830152612ed481612e98565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000612f11601c83611ff0565b9150612f1c82612edb565b602082019050919050565b60006020820190508181036000830152612f4081612f04565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612f7d601983611ff0565b9150612f8882612f47565b602082019050919050565b60006020820190508181036000830152612fac81612f70565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061300f603283611ff0565b915061301a82612fb3565b604082019050919050565b6000602082019050818103600083015261303e81613002565b9050919050565b600081905092915050565b600061305b82611fe5565b6130658185613045565b9350613075818560208601612001565b80840191505092915050565b600061308d8285613050565b91506130998284613050565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006130df82612097565b91506130ea83612097565b9250828203905081811115613102576131016130a5565b5b92915050565b600061311382612097565b915061311e83612097565b9250828201905080821115613136576131356130a5565b5b92915050565b600081519050919050565b600082825260208201905092915050565b60006131638261313c565b61316d8185613147565b935061317d818560208601612001565b6131868161202b565b840191505092915050565b60006080820190506131a6600083018761212c565b6131b3602083018661212c565b6131c0604083018561242f565b81810360608301526131d28184613158565b905095945050505050565b6000815190506131ec81611f56565b92915050565b60006020828403121561320857613207611f20565b5b6000613216848285016131dd565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea2646970667358221220964e08f7025388cece8676d280578e30e7bf535adfbf0b5bc411df6e70548c9b64736f6c63430008120033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101215760003560e01c80636352211e116100ad578063a22cb46511610071578063a22cb465146102f2578063b88d4fde1461030e578063c87b56dd1461032a578063e985e9c51461035a578063f2fde38b1461038a57610121565b80636352211e1461024c57806370a082311461027c578063715018a6146102ac5780638da5cb5b146102b657806395d89b41146102d457610121565b8063162094c4116100f4578063162094c4146101c057806323b872dd146101dc57806342842e0e146101f857806342966c68146102145780634c2f6dd31461023057610121565b806301ffc9a71461012657806306fdde0314610156578063081812fc14610174578063095ea7b3146101a4575b600080fd5b610140600480360381019061013b9190611f82565b6103a6565b60405161014d9190611fca565b60405180910390f35b61015e610488565b60405161016b9190612075565b60405180910390f35b61018e600480360381019061018991906120cd565b61051a565b60405161019b919061213b565b60405180910390f35b6101be60048036038101906101b99190612182565b610560565b005b6101da60048036038101906101d591906122f7565b610677565b005b6101f660048036038101906101f19190612353565b61068d565b005b610212600480360381019061020d9190612353565b6106ed565b005b61022e600480360381019061022991906120cd565b61070d565b005b61024a600480360381019061024591906123a6565b610769565b005b610266600480360381019061026191906120cd565b61079a565b604051610273919061213b565b60405180910390f35b61029660048036038101906102919190612402565b610820565b6040516102a3919061243e565b60405180910390f35b6102b46108d7565b005b6102be6108eb565b6040516102cb919061213b565b60405180910390f35b6102dc610915565b6040516102e99190612075565b60405180910390f35b61030c60048036038101906103079190612485565b6109a7565b005b61032860048036038101906103239190612566565b6109bd565b005b610344600480360381019061033f91906120cd565b610a1f565b6040516103519190612075565b60405180910390f35b610374600480360381019061036f91906125e9565b610a31565b6040516103819190611fca565b60405180910390f35b6103a4600480360381019061039f9190612402565b610ac5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061047157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610481575061048082610b48565b5b9050919050565b60606000805461049790612658565b80601f01602080910402602001604051908101604052809291908181526020018280546104c390612658565b80156105105780601f106104e557610100808354040283529160200191610510565b820191906000526020600020905b8154815290600101906020018083116104f357829003601f168201915b5050505050905090565b600061052582610bb2565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061056b8261079a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d2906126fb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166105fa610bfd565b73ffffffffffffffffffffffffffffffffffffffff161480610629575061062881610623610bfd565b610a31565b5b610668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065f9061278d565b60405180910390fd5b6106728383610c05565b505050565b61067f610cbe565b6106898282610d3c565b5050565b61069e610698610bfd565b82610da9565b6106dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d49061281f565b60405180910390fd5b6106e8838383610e3e565b505050565b610708838383604051806020016040528060008152506109bd565b505050565b61071e610718610bfd565b82610da9565b61075d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107549061281f565b60405180910390fd5b61076681611137565b50565b60006107756008611143565b90506107816008611151565b61078b8382611167565b6107958183610d3c565b505050565b6000806107a683611384565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080e9061288b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610890576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108879061291d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108df610cbe565b6108e960006113c1565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461092490612658565b80601f016020809104026020016040519081016040528092919081815260200182805461095090612658565b801561099d5780601f106109725761010080835404028352916020019161099d565b820191906000526020600020905b81548152906001019060200180831161098057829003601f168201915b5050505050905090565b6109b96109b2610bfd565b8383611487565b5050565b6109ce6109c8610bfd565b83610da9565b610a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a049061281f565b60405180910390fd5b610a19848484846115f3565b50505050565b6060610a2a8261164f565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610acd610cbe565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b33906129af565b60405180910390fd5b610b45816113c1565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610bbb81611761565b610bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf19061288b565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610c788361079a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610cc6610bfd565b73ffffffffffffffffffffffffffffffffffffffff16610ce46108eb565b73ffffffffffffffffffffffffffffffffffffffff1614610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3190612a1b565b60405180910390fd5b565b610d4582611761565b610d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7b90612aad565b60405180910390fd5b80600660008481526020019081526020016000209081610da49190612c79565b505050565b600080610db58361079a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610df75750610df68185610a31565b5b80610e3557508373ffffffffffffffffffffffffffffffffffffffff16610e1d8461051a565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610e5e8261079a565b73ffffffffffffffffffffffffffffffffffffffff1614610eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eab90612dbd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1a90612e4f565b60405180910390fd5b610f3083838360016117a2565b8273ffffffffffffffffffffffffffffffffffffffff16610f508261079a565b73ffffffffffffffffffffffffffffffffffffffff1614610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d90612dbd565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461113283838360016118c8565b505050565b611140816118ce565b50565b600081600001549050919050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cd90612ebb565b60405180910390fd5b6111df81611761565b1561121f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121690612f27565b60405180910390fd5b61122d6000838360016117a2565b61123681611761565b15611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d90612f27565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113806000838360016118c8565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036114f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ec90612f93565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115e69190611fca565b60405180910390a3505050565b6115fe848484610e3e565b61160a84848484611921565b611649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164090613025565b60405180910390fd5b50505050565b606061165a82610bb2565b600060066000848152602001908152602001600020805461167a90612658565b80601f01602080910402602001604051908101604052809291908181526020018280546116a690612658565b80156116f35780601f106116c8576101008083540402835291602001916116f3565b820191906000526020600020905b8154815290600101906020018083116116d657829003601f168201915b505050505090506000611704611aa8565b9050600081510361171957819250505061175c565b60008251111561174e578082604051602001611736929190613081565b6040516020818303038152906040529250505061175c565b61175784611abf565b925050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661178383611384565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60018111156118c257600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146118365780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461182e91906130d4565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146118c15780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118b99190613108565b925050819055505b5b50505050565b50505050565b6118d781611b27565b60006006600083815260200190815260200160002080546118f790612658565b90501461191e5760066000828152602001908152602001600020600061191d9190611eb9565b5b50565b60006119428473ffffffffffffffffffffffffffffffffffffffff16611c75565b15611a9b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261196b610bfd565b8786866040518563ffffffff1660e01b815260040161198d9493929190613191565b6020604051808303816000875af19250505080156119c957506040513d601f19601f820116820180604052508101906119c691906131f2565b60015b611a4b573d80600081146119f9576040519150601f19603f3d011682016040523d82523d6000602084013e6119fe565b606091505b506000815103611a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3a90613025565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611aa0565b600190505b949350505050565b606060405180602001604052806000815250905090565b6060611aca82610bb2565b6000611ad4611aa8565b90506000815111611af45760405180602001604052806000815250611b1f565b80611afe84611c98565b604051602001611b0f929190613081565b6040516020818303038152906040525b915050919050565b6000611b328261079a565b9050611b428160008460016117a2565b611b4b8261079a565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c718160008460016118c8565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060006001611ca784611d66565b01905060008167ffffffffffffffff811115611cc657611cc56121cc565b5b6040519080825280601f01601f191660200182016040528015611cf85781602001600182028036833780820191505090505b509050600082602001820190505b600115611d5b578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611d4f57611d4e61321f565b5b04945060008503611d06575b819350505050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611dc4577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611dba57611db961321f565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611e01576d04ee2d6d415b85acef81000000008381611df757611df661321f565b5b0492506020810190505b662386f26fc100008310611e3057662386f26fc100008381611e2657611e2561321f565b5b0492506010810190505b6305f5e1008310611e59576305f5e1008381611e4f57611e4e61321f565b5b0492506008810190505b6127108310611e7e576127108381611e7457611e7361321f565b5b0492506004810190505b60648310611ea15760648381611e9757611e9661321f565b5b0492506002810190505b600a8310611eb0576001810190505b80915050919050565b508054611ec590612658565b6000825580601f10611ed75750611ef6565b601f016020900490600052602060002090810190611ef59190611ef9565b5b50565b5b80821115611f12576000816000905550600101611efa565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611f5f81611f2a565b8114611f6a57600080fd5b50565b600081359050611f7c81611f56565b92915050565b600060208284031215611f9857611f97611f20565b5b6000611fa684828501611f6d565b91505092915050565b60008115159050919050565b611fc481611faf565b82525050565b6000602082019050611fdf6000830184611fbb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561201f578082015181840152602081019050612004565b60008484015250505050565b6000601f19601f8301169050919050565b600061204782611fe5565b6120518185611ff0565b9350612061818560208601612001565b61206a8161202b565b840191505092915050565b6000602082019050818103600083015261208f818461203c565b905092915050565b6000819050919050565b6120aa81612097565b81146120b557600080fd5b50565b6000813590506120c7816120a1565b92915050565b6000602082840312156120e3576120e2611f20565b5b60006120f1848285016120b8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612125826120fa565b9050919050565b6121358161211a565b82525050565b6000602082019050612150600083018461212c565b92915050565b61215f8161211a565b811461216a57600080fd5b50565b60008135905061217c81612156565b92915050565b6000806040838503121561219957612198611f20565b5b60006121a78582860161216d565b92505060206121b8858286016120b8565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6122048261202b565b810181811067ffffffffffffffff82111715612223576122226121cc565b5b80604052505050565b6000612236611f16565b905061224282826121fb565b919050565b600067ffffffffffffffff821115612262576122616121cc565b5b61226b8261202b565b9050602081019050919050565b82818337600083830152505050565b600061229a61229584612247565b61222c565b9050828152602081018484840111156122b6576122b56121c7565b5b6122c1848285612278565b509392505050565b600082601f8301126122de576122dd6121c2565b5b81356122ee848260208601612287565b91505092915050565b6000806040838503121561230e5761230d611f20565b5b600061231c858286016120b8565b925050602083013567ffffffffffffffff81111561233d5761233c611f25565b5b612349858286016122c9565b9150509250929050565b60008060006060848603121561236c5761236b611f20565b5b600061237a8682870161216d565b935050602061238b8682870161216d565b925050604061239c868287016120b8565b9150509250925092565b600080604083850312156123bd576123bc611f20565b5b60006123cb8582860161216d565b925050602083013567ffffffffffffffff8111156123ec576123eb611f25565b5b6123f8858286016122c9565b9150509250929050565b60006020828403121561241857612417611f20565b5b60006124268482850161216d565b91505092915050565b61243881612097565b82525050565b6000602082019050612453600083018461242f565b92915050565b61246281611faf565b811461246d57600080fd5b50565b60008135905061247f81612459565b92915050565b6000806040838503121561249c5761249b611f20565b5b60006124aa8582860161216d565b92505060206124bb85828601612470565b9150509250929050565b600067ffffffffffffffff8211156124e0576124df6121cc565b5b6124e98261202b565b9050602081019050919050565b6000612509612504846124c5565b61222c565b905082815260208101848484011115612525576125246121c7565b5b612530848285612278565b509392505050565b600082601f83011261254d5761254c6121c2565b5b813561255d8482602086016124f6565b91505092915050565b600080600080608085870312156125805761257f611f20565b5b600061258e8782880161216d565b945050602061259f8782880161216d565b93505060406125b0878288016120b8565b925050606085013567ffffffffffffffff8111156125d1576125d0611f25565b5b6125dd87828801612538565b91505092959194509250565b60008060408385031215612600576125ff611f20565b5b600061260e8582860161216d565b925050602061261f8582860161216d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061267057607f821691505b60208210810361268357612682612629565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006126e5602183611ff0565b91506126f082612689565b604082019050919050565b60006020820190508181036000830152612714816126d8565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612777603d83611ff0565b91506127828261271b565b604082019050919050565b600060208201905081810360008301526127a68161276a565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612809602d83611ff0565b9150612814826127ad565b604082019050919050565b60006020820190508181036000830152612838816127fc565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612875601883611ff0565b91506128808261283f565b602082019050919050565b600060208201905081810360008301526128a481612868565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612907602983611ff0565b9150612912826128ab565b604082019050919050565b60006020820190508181036000830152612936816128fa565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612999602683611ff0565b91506129a48261293d565b604082019050919050565b600060208201905081810360008301526129c88161298c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612a05602083611ff0565b9150612a10826129cf565b602082019050919050565b60006020820190508181036000830152612a34816129f8565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000612a97602e83611ff0565b9150612aa282612a3b565b604082019050919050565b60006020820190508181036000830152612ac681612a8a565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612b2f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612af2565b612b398683612af2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612b76612b71612b6c84612097565b612b51565b612097565b9050919050565b6000819050919050565b612b9083612b5b565b612ba4612b9c82612b7d565b848454612aff565b825550505050565b600090565b612bb9612bac565b612bc4818484612b87565b505050565b5b81811015612be857612bdd600082612bb1565b600181019050612bca565b5050565b601f821115612c2d57612bfe81612acd565b612c0784612ae2565b81016020851015612c16578190505b612c2a612c2285612ae2565b830182612bc9565b50505b505050565b600082821c905092915050565b6000612c5060001984600802612c32565b1980831691505092915050565b6000612c698383612c3f565b9150826002028217905092915050565b612c8282611fe5565b67ffffffffffffffff811115612c9b57612c9a6121cc565b5b612ca58254612658565b612cb0828285612bec565b600060209050601f831160018114612ce35760008415612cd1578287015190505b612cdb8582612c5d565b865550612d43565b601f198416612cf186612acd565b60005b82811015612d1957848901518255600182019150602085019450602081019050612cf4565b86831015612d365784890151612d32601f891682612c3f565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612da7602583611ff0565b9150612db282612d4b565b604082019050919050565b60006020820190508181036000830152612dd681612d9a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612e39602483611ff0565b9150612e4482612ddd565b604082019050919050565b60006020820190508181036000830152612e6881612e2c565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612ea5602083611ff0565b9150612eb082612e6f565b602082019050919050565b60006020820190508181036000830152612ed481612e98565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000612f11601c83611ff0565b9150612f1c82612edb565b602082019050919050565b60006020820190508181036000830152612f4081612f04565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612f7d601983611ff0565b9150612f8882612f47565b602082019050919050565b60006020820190508181036000830152612fac81612f70565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061300f603283611ff0565b915061301a82612fb3565b604082019050919050565b6000602082019050818103600083015261303e81613002565b9050919050565b600081905092915050565b600061305b82611fe5565b6130658185613045565b9350613075818560208601612001565b80840191505092915050565b600061308d8285613050565b91506130998284613050565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006130df82612097565b91506130ea83612097565b9250828203905081811115613102576131016130a5565b5b92915050565b600061311382612097565b915061311e83612097565b9250828201905080821115613136576131356130a5565b5b92915050565b600081519050919050565b600082825260208201905092915050565b60006131638261313c565b61316d8185613147565b935061317d818560208601612001565b6131868161202b565b840191505092915050565b60006080820190506131a6600083018761212c565b6131b3602083018661212c565b6131c0604083018561242f565b81810360608301526131d28184613158565b905095945050505050565b6000815190506131ec81611f56565b92915050565b60006020828403121561320857613207611f20565b5b6000613216848285016131dd565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea2646970667358221220964e08f7025388cece8676d280578e30e7bf535adfbf0b5bc411df6e70548c9b64736f6c63430008120033
Deployed Bytecode Sourcemap
58789:981:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40114:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41042:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42554:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42072:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59447:116;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43254:335;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43660:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56498:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59028:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40752:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40483:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19503:103;;;:::i;:::-;;18855:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41211:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42797:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43916:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59571:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43023:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19761:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40114:305;40216:4;40268:25;40253:40;;;:11;:40;;;;:105;;;;40325:33;40310:48;;;:11;:48;;;;40253:105;:158;;;;40375:36;40399:11;40375:23;:36::i;:::-;40253:158;40233:178;;40114:305;;;:::o;41042:100::-;41096:13;41129:5;41122:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41042:100;:::o;42554:171::-;42630:7;42650:23;42665:7;42650:14;:23::i;:::-;42693:15;:24;42709:7;42693:24;;;;;;;;;;;;;;;;;;;;;42686:31;;42554:171;;;:::o;42072:416::-;42153:13;42169:23;42184:7;42169:14;:23::i;:::-;42153:39;;42217:5;42211:11;;:2;:11;;;42203:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;42311:5;42295:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;42320:37;42337:5;42344:12;:10;:12::i;:::-;42320:16;:37::i;:::-;42295:62;42273:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;42459:21;42468:2;42472:7;42459:8;:21::i;:::-;42142:346;42072:416;;:::o;59447:116::-;18741:13;:11;:13::i;:::-;59530:25:::1;59543:7;59551:3;59530:12;:25::i;:::-;59447:116:::0;;:::o;43254:335::-;43449:41;43468:12;:10;:12::i;:::-;43482:7;43449:18;:41::i;:::-;43441:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;43553:28;43563:4;43569:2;43573:7;43553:9;:28::i;:::-;43254:335;;;:::o;43660:185::-;43798:39;43815:4;43821:2;43825:7;43798:39;;;;;;;;;;;;:16;:39::i;:::-;43660:185;;;:::o;56498:242::-;56616:41;56635:12;:10;:12::i;:::-;56649:7;56616:18;:41::i;:::-;56608:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;56718:14;56724:7;56718:5;:14::i;:::-;56498:242;:::o;59028:218::-;59091:15;59109:25;:15;:23;:25::i;:::-;59091:43;;59145:27;:15;:25;:27::i;:::-;59183:18;59189:2;59193:7;59183:5;:18::i;:::-;59212:26;59225:7;59234:3;59212:12;:26::i;:::-;59080:166;59028:218;;:::o;40752:223::-;40824:7;40844:13;40860:17;40869:7;40860:8;:17::i;:::-;40844:33;;40913:1;40896:19;;:5;:19;;;40888:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;40962:5;40955:12;;;40752:223;;;:::o;40483:207::-;40555:7;40600:1;40583:19;;:5;:19;;;40575:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40666:9;:16;40676:5;40666:16;;;;;;;;;;;;;;;;40659:23;;40483:207;;;:::o;19503:103::-;18741:13;:11;:13::i;:::-;19568:30:::1;19595:1;19568:18;:30::i;:::-;19503:103::o:0;18855:87::-;18901:7;18928:6;;;;;;;;;;;18921:13;;18855:87;:::o;41211:104::-;41267:13;41300:7;41293:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41211:104;:::o;42797:155::-;42892:52;42911:12;:10;:12::i;:::-;42925:8;42935;42892:18;:52::i;:::-;42797:155;;:::o;43916:322::-;44090:41;44109:12;:10;:12::i;:::-;44123:7;44090:18;:41::i;:::-;44082:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;44192:38;44206:4;44212:2;44216:7;44225:4;44192:13;:38::i;:::-;43916:322;;;;:::o;59571:196::-;59698:13;59736:23;59751:7;59736:14;:23::i;:::-;59729:30;;59571:196;;;:::o;43023:164::-;43120:4;43144:18;:25;43163:5;43144:25;;;;;;;;;;;;;;;:35;43170:8;43144:35;;;;;;;;;;;;;;;;;;;;;;;;;43137:42;;43023:164;;;;:::o;19761:201::-;18741:13;:11;:13::i;:::-;19870:1:::1;19850:22;;:8;:22;;::::0;19842:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;19926:28;19945:8;19926:18;:28::i;:::-;19761:201:::0;:::o;32608:157::-;32693:4;32732:25;32717:40;;;:11;:40;;;;32710:47;;32608:157;;;:::o;52373:135::-;52455:16;52463:7;52455;:16::i;:::-;52447:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;52373:135;:::o;17400:98::-;17453:7;17480:10;17473:17;;17400:98;:::o;51652:174::-;51754:2;51727:15;:24;51743:7;51727:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51810:7;51806:2;51772:46;;51781:23;51796:7;51781:14;:23::i;:::-;51772:46;;;;;;;;;;;;51652:174;;:::o;19020:132::-;19095:12;:10;:12::i;:::-;19084:23;;:7;:5;:7::i;:::-;:23;;;19076:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19020:132::o;58059:217::-;58159:16;58167:7;58159;:16::i;:::-;58151:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;58259:9;58237:10;:19;58248:7;58237:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;58059:217;;:::o;46271:264::-;46364:4;46381:13;46397:23;46412:7;46397:14;:23::i;:::-;46381:39;;46450:5;46439:16;;:7;:16;;;:52;;;;46459:32;46476:5;46483:7;46459:16;:32::i;:::-;46439:52;:87;;;;46519:7;46495:31;;:20;46507:7;46495:11;:20::i;:::-;:31;;;46439:87;46431:96;;;46271:264;;;;:::o;50270:1263::-;50429:4;50402:31;;:23;50417:7;50402:14;:23::i;:::-;:31;;;50394:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50508:1;50494:16;;:2;:16;;;50486:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50564:42;50585:4;50591:2;50595:7;50604:1;50564:20;:42::i;:::-;50736:4;50709:31;;:23;50724:7;50709:14;:23::i;:::-;:31;;;50701:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50854:15;:24;50870:7;50854:24;;;;;;;;;;;;50847:31;;;;;;;;;;;51349:1;51330:9;:15;51340:4;51330:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;51382:1;51365:9;:13;51375:2;51365:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;51424:2;51405:7;:16;51413:7;51405:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;51463:7;51459:2;51444:27;;51453:4;51444:27;;;;;;;;;;;;51484:41;51504:4;51510:2;51514:7;51523:1;51484:19;:41::i;:::-;50270:1263;;;:::o;59324:115::-;59411:20;59423:7;59411:11;:20::i;:::-;59324:115;:::o;911:114::-;976:7;1003;:14;;;996:21;;911:114;;;:::o;1033:127::-;1140:1;1122:7;:14;;;:19;;;;;;;;;;;1033:127;:::o;47869:942::-;47963:1;47949:16;;:2;:16;;;47941:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;48022:16;48030:7;48022;:16::i;:::-;48021:17;48013:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48084:48;48113:1;48117:2;48121:7;48130:1;48084:20;:48::i;:::-;48231:16;48239:7;48231;:16::i;:::-;48230:17;48222:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48646:1;48629:9;:13;48639:2;48629:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;48690:2;48671:7;:16;48679:7;48671:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;48735:7;48731:2;48710:33;;48727:1;48710:33;;;;;;;;;;;;48756:47;48784:1;48788:2;48792:7;48801:1;48756:19;:47::i;:::-;47869:942;;:::o;45546:117::-;45612:7;45639;:16;45647:7;45639:16;;;;;;;;;;;;;;;;;;;;;45632:23;;45546:117;;;:::o;20122:191::-;20196:16;20215:6;;;;;;;;;;;20196:25;;20241:8;20232:6;;:17;;;;;;;;;;;;;;;;;;20296:8;20265:40;;20286:8;20265:40;;;;;;;;;;;;20185:128;20122:191;:::o;51969:315::-;52124:8;52115:17;;:5;:17;;;52107:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;52211:8;52173:18;:25;52192:5;52173:25;;;;;;;;;;;;;;;:35;52199:8;52173:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;52257:8;52235:41;;52250:5;52235:41;;;52267:8;52235:41;;;;;;:::i;:::-;;;;;;;;51969:315;;;:::o;45119:313::-;45275:28;45285:4;45291:2;45295:7;45275:9;:28::i;:::-;45322:47;45345:4;45351:2;45355:7;45364:4;45322:22;:47::i;:::-;45314:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;45119:313;;;;:::o;57279:624::-;57352:13;57378:23;57393:7;57378:14;:23::i;:::-;57414;57440:10;:19;57451:7;57440:19;;;;;;;;;;;57414:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57470:18;57491:10;:8;:10::i;:::-;57470:31;;57599:1;57583:4;57577:18;:23;57573:72;;57624:9;57617:16;;;;;;57573:72;57775:1;57755:9;57749:23;:27;57745:108;;;57824:4;57830:9;57807:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57793:48;;;;;;57745:108;57872:23;57887:7;57872:14;:23::i;:::-;57865:30;;;;57279:624;;;;:::o;45976:128::-;46041:4;46094:1;46065:31;;:17;46074:7;46065:8;:17::i;:::-;:31;;;;46058:38;;45976:128;;;:::o;54657:410::-;54847:1;54835:9;:13;54831:229;;;54885:1;54869:18;;:4;:18;;;54865:87;;54927:9;54908;:15;54918:4;54908:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;54865:87;54984:1;54970:16;;:2;:16;;;54966:83;;55024:9;55007;:13;55017:2;55007:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;54966:83;54831:229;54657:410;;;;:::o;55789:158::-;;;;;:::o;58501:206::-;58570:20;58582:7;58570:11;:20::i;:::-;58644:1;58613:10;:19;58624:7;58613:19;;;;;;;;;;;58607:33;;;;;:::i;:::-;;;:38;58603:97;;58669:10;:19;58680:7;58669:19;;;;;;;;;;;;58662:26;;;;:::i;:::-;58603:97;58501:206;:::o;53072:853::-;53226:4;53247:15;:2;:13;;;:15::i;:::-;53243:675;;;53299:2;53283:36;;;53320:12;:10;:12::i;:::-;53334:4;53340:7;53349:4;53283:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53279:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53541:1;53524:6;:13;:18;53520:328;;53567:60;;;;;;;;;;:::i;:::-;;;;;;;;53520:328;53798:6;53792:13;53783:6;53779:2;53775:15;53768:38;53279:584;53415:41;;;53405:51;;;:6;:51;;;;53398:58;;;;;53243:675;53902:4;53895:11;;53072:853;;;;;;;:::o;41916:94::-;41967:13;41993:9;;;;;;;;;;;;;;41916:94;:::o;41386:281::-;41459:13;41485:23;41500:7;41485:14;:23::i;:::-;41521:21;41545:10;:8;:10::i;:::-;41521:34;;41597:1;41579:7;41573:21;:25;:86;;;;;;;;;;;;;;;;;41625:7;41634:18;:7;:16;:18::i;:::-;41608:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41573:86;41566:93;;;41386:281;;;:::o;49150:783::-;49210:13;49226:23;49241:7;49226:14;:23::i;:::-;49210:39;;49262:51;49283:5;49298:1;49302:7;49311:1;49262:20;:51::i;:::-;49426:23;49441:7;49426:14;:23::i;:::-;49418:31;;49497:15;:24;49513:7;49497:24;;;;;;;;;;;;49490:31;;;;;;;;;;;49762:1;49742:9;:16;49752:5;49742:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;49792:7;:16;49800:7;49792:16;;;;;;;;;;;;49785:23;;;;;;;;;;;49854:7;49850:1;49826:36;;49835:5;49826:36;;;;;;;;;;;;49875:50;49895:5;49910:1;49914:7;49923:1;49875:19;:50::i;:::-;49199:734;49150:783;:::o;21559:326::-;21619:4;21876:1;21854:7;:19;;;:23;21847:30;;21559:326;;;:::o;14821:716::-;14877:13;14928:14;14965:1;14945:17;14956:5;14945:10;:17::i;:::-;:21;14928:38;;14981:20;15015:6;15004:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14981:41;;15037:11;15166:6;15162:2;15158:15;15150:6;15146:28;15139:35;;15203:288;15210:4;15203:288;;;15235:5;;;;;;;;15377:8;15372:2;15365:5;15361:14;15356:30;15351:3;15343:44;15433:2;15424:11;;;;;;:::i;:::-;;;;;15467:1;15458:5;:10;15203:288;15454:21;15203:288;15512:6;15505:13;;;;;14821:716;;;:::o;11681:922::-;11734:7;11754:14;11771:1;11754:18;;11821:6;11812:5;:15;11808:102;;11857:6;11848:15;;;;;;:::i;:::-;;;;;11892:2;11882:12;;;;11808:102;11937:6;11928:5;:15;11924:102;;11973:6;11964:15;;;;;;:::i;:::-;;;;;12008:2;11998:12;;;;11924:102;12053:6;12044:5;:15;12040:102;;12089:6;12080:15;;;;;;:::i;:::-;;;;;12124:2;12114:12;;;;12040:102;12169:5;12160;:14;12156:99;;12204:5;12195:14;;;;;;:::i;:::-;;;;;12238:1;12228:11;;;;12156:99;12282:5;12273;:14;12269:99;;12317:5;12308:14;;;;;;:::i;:::-;;;;;12351:1;12341:11;;;;12269:99;12395:5;12386;:14;12382:99;;12430:5;12421:14;;;;;;:::i;:::-;;;;;12464:1;12454:11;;;;12382:99;12508:5;12499;:14;12495:66;;12544:1;12534:11;;;;12495:66;12589:6;12582:13;;;11681:922;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334: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:117::-;4999:1;4996;4989:12;5013:117;5122:1;5119;5112:12;5136:180;5184:77;5181:1;5174:88;5281:4;5278:1;5271:15;5305:4;5302:1;5295:15;5322:281;5405:27;5427:4;5405:27;:::i;:::-;5397:6;5393:40;5535:6;5523:10;5520:22;5499:18;5487:10;5484:34;5481:62;5478:88;;;5546:18;;:::i;:::-;5478:88;5586:10;5582:2;5575:22;5365:238;5322:281;;:::o;5609:129::-;5643:6;5670:20;;:::i;:::-;5660:30;;5699:33;5727:4;5719:6;5699:33;:::i;:::-;5609:129;;;:::o;5744:308::-;5806:4;5896:18;5888:6;5885:30;5882:56;;;5918:18;;:::i;:::-;5882:56;5956:29;5978:6;5956:29;:::i;:::-;5948:37;;6040:4;6034;6030:15;6022:23;;5744:308;;;:::o;6058:146::-;6155:6;6150:3;6145;6132:30;6196:1;6187:6;6182:3;6178:16;6171:27;6058:146;;;:::o;6210:425::-;6288:5;6313:66;6329:49;6371:6;6329:49;:::i;:::-;6313:66;:::i;:::-;6304:75;;6402:6;6395:5;6388:21;6440:4;6433:5;6429:16;6478:3;6469:6;6464:3;6460:16;6457:25;6454:112;;;6485:79;;:::i;:::-;6454:112;6575:54;6622:6;6617:3;6612;6575:54;:::i;:::-;6294:341;6210:425;;;;;:::o;6655:340::-;6711:5;6760:3;6753:4;6745:6;6741:17;6737:27;6727:122;;6768:79;;:::i;:::-;6727:122;6885:6;6872:20;6910:79;6985:3;6977:6;6970:4;6962:6;6958:17;6910:79;:::i;:::-;6901:88;;6717:278;6655:340;;;;:::o;7001:654::-;7079:6;7087;7136:2;7124:9;7115:7;7111:23;7107:32;7104:119;;;7142:79;;:::i;:::-;7104:119;7262:1;7287:53;7332:7;7323:6;7312:9;7308:22;7287:53;:::i;:::-;7277:63;;7233:117;7417:2;7406:9;7402:18;7389:32;7448:18;7440:6;7437:30;7434:117;;;7470:79;;:::i;:::-;7434:117;7575:63;7630:7;7621:6;7610:9;7606:22;7575:63;:::i;:::-;7565:73;;7360:288;7001:654;;;;;:::o;7661:619::-;7738:6;7746;7754;7803:2;7791:9;7782:7;7778:23;7774:32;7771:119;;;7809:79;;:::i;:::-;7771:119;7929:1;7954:53;7999:7;7990:6;7979:9;7975:22;7954:53;:::i;:::-;7944:63;;7900:117;8056:2;8082:53;8127:7;8118:6;8107:9;8103:22;8082:53;:::i;:::-;8072:63;;8027:118;8184:2;8210:53;8255:7;8246:6;8235:9;8231:22;8210:53;:::i;:::-;8200:63;;8155:118;7661:619;;;;;:::o;8286:654::-;8364:6;8372;8421:2;8409:9;8400:7;8396:23;8392:32;8389:119;;;8427:79;;:::i;:::-;8389:119;8547:1;8572:53;8617:7;8608:6;8597:9;8593:22;8572:53;:::i;:::-;8562:63;;8518:117;8702:2;8691:9;8687:18;8674:32;8733:18;8725:6;8722:30;8719:117;;;8755:79;;:::i;:::-;8719:117;8860:63;8915:7;8906:6;8895:9;8891:22;8860:63;:::i;:::-;8850:73;;8645:288;8286:654;;;;;:::o;8946:329::-;9005:6;9054:2;9042:9;9033:7;9029:23;9025:32;9022:119;;;9060:79;;:::i;:::-;9022:119;9180:1;9205:53;9250:7;9241:6;9230:9;9226:22;9205:53;:::i;:::-;9195:63;;9151:117;8946:329;;;;:::o;9281:118::-;9368:24;9386:5;9368:24;:::i;:::-;9363:3;9356:37;9281:118;;:::o;9405:222::-;9498:4;9536:2;9525:9;9521:18;9513:26;;9549:71;9617:1;9606:9;9602:17;9593:6;9549:71;:::i;:::-;9405:222;;;;:::o;9633:116::-;9703:21;9718:5;9703:21;:::i;:::-;9696:5;9693:32;9683:60;;9739:1;9736;9729:12;9683:60;9633:116;:::o;9755:133::-;9798:5;9836:6;9823:20;9814:29;;9852:30;9876:5;9852:30;:::i;:::-;9755:133;;;;:::o;9894:468::-;9959:6;9967;10016:2;10004:9;9995:7;9991:23;9987:32;9984:119;;;10022:79;;:::i;:::-;9984:119;10142:1;10167:53;10212:7;10203:6;10192:9;10188:22;10167:53;:::i;:::-;10157:63;;10113:117;10269:2;10295:50;10337:7;10328:6;10317:9;10313:22;10295:50;:::i;:::-;10285:60;;10240:115;9894:468;;;;;:::o;10368:307::-;10429:4;10519:18;10511:6;10508:30;10505:56;;;10541:18;;:::i;:::-;10505:56;10579:29;10601:6;10579:29;:::i;:::-;10571:37;;10663:4;10657;10653:15;10645:23;;10368:307;;;:::o;10681:423::-;10758:5;10783:65;10799:48;10840:6;10799:48;:::i;:::-;10783:65;:::i;:::-;10774:74;;10871:6;10864:5;10857:21;10909:4;10902:5;10898:16;10947:3;10938:6;10933:3;10929:16;10926:25;10923:112;;;10954:79;;:::i;:::-;10923:112;11044:54;11091:6;11086:3;11081;11044:54;:::i;:::-;10764:340;10681:423;;;;;:::o;11123:338::-;11178:5;11227:3;11220:4;11212:6;11208:17;11204:27;11194:122;;11235:79;;:::i;:::-;11194:122;11352:6;11339:20;11377:78;11451:3;11443:6;11436:4;11428:6;11424:17;11377:78;:::i;:::-;11368:87;;11184:277;11123:338;;;;:::o;11467:943::-;11562:6;11570;11578;11586;11635:3;11623:9;11614:7;11610:23;11606:33;11603:120;;;11642:79;;:::i;:::-;11603:120;11762:1;11787:53;11832:7;11823:6;11812:9;11808:22;11787:53;:::i;:::-;11777:63;;11733:117;11889:2;11915:53;11960:7;11951:6;11940:9;11936:22;11915:53;:::i;:::-;11905:63;;11860:118;12017:2;12043:53;12088:7;12079:6;12068:9;12064:22;12043:53;:::i;:::-;12033:63;;11988:118;12173:2;12162:9;12158:18;12145:32;12204:18;12196:6;12193:30;12190:117;;;12226:79;;:::i;:::-;12190:117;12331:62;12385:7;12376:6;12365:9;12361:22;12331:62;:::i;:::-;12321:72;;12116:287;11467:943;;;;;;;:::o;12416:474::-;12484:6;12492;12541:2;12529:9;12520:7;12516:23;12512:32;12509:119;;;12547:79;;:::i;:::-;12509:119;12667:1;12692:53;12737:7;12728:6;12717:9;12713:22;12692:53;:::i;:::-;12682:63;;12638:117;12794:2;12820:53;12865:7;12856:6;12845:9;12841:22;12820:53;:::i;:::-;12810:63;;12765:118;12416:474;;;;;:::o;12896:180::-;12944:77;12941:1;12934:88;13041:4;13038:1;13031:15;13065:4;13062:1;13055:15;13082:320;13126:6;13163:1;13157:4;13153:12;13143:22;;13210:1;13204:4;13200:12;13231:18;13221:81;;13287:4;13279:6;13275:17;13265:27;;13221:81;13349:2;13341:6;13338:14;13318:18;13315:38;13312:84;;13368:18;;:::i;:::-;13312:84;13133:269;13082:320;;;:::o;13408:220::-;13548:34;13544:1;13536:6;13532:14;13525:58;13617:3;13612:2;13604:6;13600:15;13593:28;13408:220;:::o;13634:366::-;13776:3;13797:67;13861:2;13856:3;13797:67;:::i;:::-;13790:74;;13873:93;13962:3;13873:93;:::i;:::-;13991:2;13986:3;13982:12;13975:19;;13634:366;;;:::o;14006:419::-;14172:4;14210:2;14199:9;14195:18;14187:26;;14259:9;14253:4;14249:20;14245:1;14234:9;14230:17;14223:47;14287:131;14413:4;14287:131;:::i;:::-;14279:139;;14006:419;;;:::o;14431:248::-;14571:34;14567:1;14559:6;14555:14;14548:58;14640:31;14635:2;14627:6;14623:15;14616:56;14431:248;:::o;14685:366::-;14827:3;14848:67;14912:2;14907:3;14848:67;:::i;:::-;14841:74;;14924:93;15013:3;14924:93;:::i;:::-;15042:2;15037:3;15033:12;15026:19;;14685:366;;;:::o;15057:419::-;15223:4;15261:2;15250:9;15246:18;15238:26;;15310:9;15304:4;15300:20;15296:1;15285:9;15281:17;15274:47;15338:131;15464:4;15338:131;:::i;:::-;15330:139;;15057:419;;;:::o;15482:232::-;15622:34;15618:1;15610:6;15606:14;15599:58;15691:15;15686:2;15678:6;15674:15;15667:40;15482:232;:::o;15720:366::-;15862:3;15883:67;15947:2;15942:3;15883:67;:::i;:::-;15876:74;;15959:93;16048:3;15959:93;:::i;:::-;16077:2;16072:3;16068:12;16061:19;;15720:366;;;:::o;16092:419::-;16258:4;16296:2;16285:9;16281:18;16273:26;;16345:9;16339:4;16335:20;16331:1;16320:9;16316:17;16309:47;16373:131;16499:4;16373:131;:::i;:::-;16365:139;;16092:419;;;:::o;16517:174::-;16657:26;16653:1;16645:6;16641:14;16634:50;16517:174;:::o;16697:366::-;16839:3;16860:67;16924:2;16919:3;16860:67;:::i;:::-;16853:74;;16936:93;17025:3;16936:93;:::i;:::-;17054:2;17049:3;17045:12;17038:19;;16697:366;;;:::o;17069:419::-;17235:4;17273:2;17262:9;17258:18;17250:26;;17322:9;17316:4;17312:20;17308:1;17297:9;17293:17;17286:47;17350:131;17476:4;17350:131;:::i;:::-;17342:139;;17069:419;;;:::o;17494:228::-;17634:34;17630:1;17622:6;17618:14;17611:58;17703:11;17698:2;17690:6;17686:15;17679:36;17494:228;:::o;17728:366::-;17870:3;17891:67;17955:2;17950:3;17891:67;:::i;:::-;17884:74;;17967:93;18056:3;17967:93;:::i;:::-;18085:2;18080:3;18076:12;18069:19;;17728:366;;;:::o;18100:419::-;18266:4;18304:2;18293:9;18289:18;18281:26;;18353:9;18347:4;18343:20;18339:1;18328:9;18324:17;18317:47;18381:131;18507:4;18381:131;:::i;:::-;18373:139;;18100:419;;;:::o;18525:225::-;18665:34;18661:1;18653:6;18649:14;18642:58;18734:8;18729:2;18721:6;18717:15;18710:33;18525:225;:::o;18756:366::-;18898:3;18919:67;18983:2;18978:3;18919:67;:::i;:::-;18912:74;;18995:93;19084:3;18995:93;:::i;:::-;19113:2;19108:3;19104:12;19097:19;;18756:366;;;:::o;19128:419::-;19294:4;19332:2;19321:9;19317:18;19309:26;;19381:9;19375:4;19371:20;19367:1;19356:9;19352:17;19345:47;19409:131;19535:4;19409:131;:::i;:::-;19401:139;;19128:419;;;:::o;19553:182::-;19693:34;19689:1;19681:6;19677:14;19670:58;19553:182;:::o;19741:366::-;19883:3;19904:67;19968:2;19963:3;19904:67;:::i;:::-;19897:74;;19980:93;20069:3;19980:93;:::i;:::-;20098:2;20093:3;20089:12;20082:19;;19741:366;;;:::o;20113:419::-;20279:4;20317:2;20306:9;20302:18;20294:26;;20366:9;20360:4;20356:20;20352:1;20341:9;20337:17;20330:47;20394:131;20520:4;20394:131;:::i;:::-;20386:139;;20113:419;;;:::o;20538:233::-;20678:34;20674:1;20666:6;20662:14;20655:58;20747:16;20742:2;20734:6;20730:15;20723:41;20538:233;:::o;20777:366::-;20919:3;20940:67;21004:2;20999:3;20940:67;:::i;:::-;20933:74;;21016:93;21105:3;21016:93;:::i;:::-;21134:2;21129:3;21125:12;21118:19;;20777:366;;;:::o;21149:419::-;21315:4;21353:2;21342:9;21338:18;21330:26;;21402:9;21396:4;21392:20;21388:1;21377:9;21373:17;21366:47;21430:131;21556:4;21430:131;:::i;:::-;21422:139;;21149:419;;;:::o;21574:141::-;21623:4;21646:3;21638:11;;21669:3;21666:1;21659:14;21703:4;21700:1;21690:18;21682:26;;21574:141;;;:::o;21721:93::-;21758:6;21805:2;21800;21793:5;21789:14;21785:23;21775:33;;21721:93;;;:::o;21820:107::-;21864:8;21914:5;21908:4;21904:16;21883:37;;21820:107;;;;:::o;21933:393::-;22002:6;22052:1;22040:10;22036:18;22075:97;22105:66;22094:9;22075:97;:::i;:::-;22193:39;22223:8;22212:9;22193:39;:::i;:::-;22181:51;;22265:4;22261:9;22254:5;22250:21;22241:30;;22314:4;22304:8;22300:19;22293:5;22290:30;22280:40;;22009:317;;21933:393;;;;;:::o;22332:60::-;22360:3;22381:5;22374:12;;22332:60;;;:::o;22398:142::-;22448:9;22481:53;22499:34;22508:24;22526:5;22508:24;:::i;:::-;22499:34;:::i;:::-;22481:53;:::i;:::-;22468:66;;22398:142;;;:::o;22546:75::-;22589:3;22610:5;22603:12;;22546:75;;;:::o;22627:269::-;22737:39;22768:7;22737:39;:::i;:::-;22798:91;22847:41;22871:16;22847:41;:::i;:::-;22839:6;22832:4;22826:11;22798:91;:::i;:::-;22792:4;22785:105;22703:193;22627:269;;;:::o;22902:73::-;22947:3;22902:73;:::o;22981:189::-;23058:32;;:::i;:::-;23099:65;23157:6;23149;23143:4;23099:65;:::i;:::-;23034:136;22981:189;;:::o;23176:186::-;23236:120;23253:3;23246:5;23243:14;23236:120;;;23307:39;23344:1;23337:5;23307:39;:::i;:::-;23280:1;23273:5;23269:13;23260:22;;23236:120;;;23176:186;;:::o;23368:543::-;23469:2;23464:3;23461:11;23458:446;;;23503:38;23535:5;23503:38;:::i;:::-;23587:29;23605:10;23587:29;:::i;:::-;23577:8;23573:44;23770:2;23758:10;23755:18;23752:49;;;23791:8;23776:23;;23752:49;23814:80;23870:22;23888:3;23870:22;:::i;:::-;23860:8;23856:37;23843:11;23814:80;:::i;:::-;23473:431;;23458:446;23368:543;;;:::o;23917:117::-;23971:8;24021:5;24015:4;24011:16;23990:37;;23917:117;;;;:::o;24040:169::-;24084:6;24117:51;24165:1;24161:6;24153:5;24150:1;24146:13;24117:51;:::i;:::-;24113:56;24198:4;24192;24188:15;24178:25;;24091:118;24040:169;;;;:::o;24214:295::-;24290:4;24436:29;24461:3;24455:4;24436:29;:::i;:::-;24428:37;;24498:3;24495:1;24491:11;24485:4;24482:21;24474:29;;24214:295;;;;:::o;24514:1395::-;24631:37;24664:3;24631:37;:::i;:::-;24733:18;24725:6;24722:30;24719:56;;;24755:18;;:::i;:::-;24719:56;24799:38;24831:4;24825:11;24799:38;:::i;:::-;24884:67;24944:6;24936;24930:4;24884:67;:::i;:::-;24978:1;25002:4;24989:17;;25034:2;25026:6;25023:14;25051:1;25046:618;;;;25708:1;25725:6;25722:77;;;25774:9;25769:3;25765:19;25759:26;25750:35;;25722:77;25825:67;25885:6;25878:5;25825:67;:::i;:::-;25819:4;25812:81;25681:222;25016:887;;25046:618;25098:4;25094:9;25086:6;25082:22;25132:37;25164:4;25132:37;:::i;:::-;25191:1;25205:208;25219:7;25216:1;25213:14;25205:208;;;25298:9;25293:3;25289:19;25283:26;25275:6;25268:42;25349:1;25341:6;25337:14;25327:24;;25396:2;25385:9;25381:18;25368:31;;25242:4;25239:1;25235:12;25230:17;;25205:208;;;25441:6;25432:7;25429:19;25426:179;;;25499:9;25494:3;25490:19;25484:26;25542:48;25584:4;25576:6;25572:17;25561:9;25542:48;:::i;:::-;25534:6;25527:64;25449:156;25426:179;25651:1;25647;25639:6;25635:14;25631:22;25625:4;25618:36;25053:611;;;25016:887;;24606:1303;;;24514:1395;;:::o;25915:224::-;26055:34;26051:1;26043:6;26039:14;26032:58;26124:7;26119:2;26111:6;26107:15;26100:32;25915:224;:::o;26145:366::-;26287:3;26308:67;26372:2;26367:3;26308:67;:::i;:::-;26301:74;;26384:93;26473:3;26384:93;:::i;:::-;26502:2;26497:3;26493:12;26486:19;;26145:366;;;:::o;26517:419::-;26683:4;26721:2;26710:9;26706:18;26698:26;;26770:9;26764:4;26760:20;26756:1;26745:9;26741:17;26734:47;26798:131;26924:4;26798:131;:::i;:::-;26790:139;;26517:419;;;:::o;26942:223::-;27082:34;27078:1;27070:6;27066:14;27059:58;27151:6;27146:2;27138:6;27134:15;27127:31;26942:223;:::o;27171:366::-;27313:3;27334:67;27398:2;27393:3;27334:67;:::i;:::-;27327:74;;27410:93;27499:3;27410:93;:::i;:::-;27528:2;27523:3;27519:12;27512:19;;27171:366;;;:::o;27543:419::-;27709:4;27747:2;27736:9;27732:18;27724:26;;27796:9;27790:4;27786:20;27782:1;27771:9;27767:17;27760:47;27824:131;27950:4;27824:131;:::i;:::-;27816:139;;27543:419;;;:::o;27968:182::-;28108:34;28104:1;28096:6;28092:14;28085:58;27968:182;:::o;28156:366::-;28298:3;28319:67;28383:2;28378:3;28319:67;:::i;:::-;28312:74;;28395:93;28484:3;28395:93;:::i;:::-;28513:2;28508:3;28504:12;28497:19;;28156:366;;;:::o;28528:419::-;28694:4;28732:2;28721:9;28717:18;28709:26;;28781:9;28775:4;28771:20;28767:1;28756:9;28752:17;28745:47;28809:131;28935:4;28809:131;:::i;:::-;28801:139;;28528:419;;;:::o;28953:178::-;29093:30;29089:1;29081:6;29077:14;29070:54;28953:178;:::o;29137:366::-;29279:3;29300:67;29364:2;29359:3;29300:67;:::i;:::-;29293:74;;29376:93;29465:3;29376:93;:::i;:::-;29494:2;29489:3;29485:12;29478:19;;29137:366;;;:::o;29509:419::-;29675:4;29713:2;29702:9;29698:18;29690:26;;29762:9;29756:4;29752:20;29748:1;29737:9;29733:17;29726:47;29790:131;29916:4;29790:131;:::i;:::-;29782:139;;29509:419;;;:::o;29934:175::-;30074:27;30070:1;30062:6;30058:14;30051:51;29934:175;:::o;30115:366::-;30257:3;30278:67;30342:2;30337:3;30278:67;:::i;:::-;30271:74;;30354:93;30443:3;30354:93;:::i;:::-;30472:2;30467:3;30463:12;30456:19;;30115:366;;;:::o;30487:419::-;30653:4;30691:2;30680:9;30676:18;30668:26;;30740:9;30734:4;30730:20;30726:1;30715:9;30711:17;30704:47;30768:131;30894:4;30768:131;:::i;:::-;30760:139;;30487:419;;;:::o;30912:237::-;31052:34;31048:1;31040:6;31036:14;31029:58;31121:20;31116:2;31108:6;31104:15;31097:45;30912:237;:::o;31155:366::-;31297:3;31318:67;31382:2;31377:3;31318:67;:::i;:::-;31311:74;;31394:93;31483:3;31394:93;:::i;:::-;31512:2;31507:3;31503:12;31496:19;;31155:366;;;:::o;31527:419::-;31693:4;31731:2;31720:9;31716:18;31708:26;;31780:9;31774:4;31770:20;31766:1;31755:9;31751:17;31744:47;31808:131;31934:4;31808:131;:::i;:::-;31800:139;;31527:419;;;:::o;31952:148::-;32054:11;32091:3;32076:18;;31952:148;;;;:::o;32106:390::-;32212:3;32240:39;32273:5;32240:39;:::i;:::-;32295:89;32377:6;32372:3;32295:89;:::i;:::-;32288:96;;32393:65;32451:6;32446:3;32439:4;32432:5;32428:16;32393:65;:::i;:::-;32483:6;32478:3;32474:16;32467:23;;32216:280;32106:390;;;;:::o;32502:435::-;32682:3;32704:95;32795:3;32786:6;32704:95;:::i;:::-;32697:102;;32816:95;32907:3;32898:6;32816:95;:::i;:::-;32809:102;;32928:3;32921:10;;32502:435;;;;;:::o;32943:180::-;32991:77;32988:1;32981:88;33088:4;33085:1;33078:15;33112:4;33109:1;33102:15;33129:194;33169:4;33189:20;33207:1;33189:20;:::i;:::-;33184:25;;33223:20;33241:1;33223:20;:::i;:::-;33218:25;;33267:1;33264;33260:9;33252:17;;33291:1;33285:4;33282:11;33279:37;;;33296:18;;:::i;:::-;33279:37;33129:194;;;;:::o;33329:191::-;33369:3;33388:20;33406:1;33388:20;:::i;:::-;33383:25;;33422:20;33440:1;33422:20;:::i;:::-;33417:25;;33465:1;33462;33458:9;33451:16;;33486:3;33483:1;33480:10;33477:36;;;33493:18;;:::i;:::-;33477:36;33329:191;;;;:::o;33526:98::-;33577:6;33611:5;33605:12;33595:22;;33526:98;;;:::o;33630:168::-;33713:11;33747:6;33742:3;33735:19;33787:4;33782:3;33778:14;33763:29;;33630:168;;;;:::o;33804:373::-;33890:3;33918:38;33950:5;33918:38;:::i;:::-;33972:70;34035:6;34030:3;33972:70;:::i;:::-;33965:77;;34051:65;34109:6;34104:3;34097:4;34090:5;34086:16;34051:65;:::i;:::-;34141:29;34163:6;34141:29;:::i;:::-;34136:3;34132:39;34125:46;;33894:283;33804:373;;;;:::o;34183:640::-;34378:4;34416:3;34405:9;34401:19;34393:27;;34430:71;34498:1;34487:9;34483:17;34474:6;34430:71;:::i;:::-;34511:72;34579:2;34568:9;34564:18;34555:6;34511:72;:::i;:::-;34593;34661:2;34650:9;34646:18;34637:6;34593:72;:::i;:::-;34712:9;34706:4;34702:20;34697:2;34686:9;34682:18;34675:48;34740:76;34811:4;34802:6;34740:76;:::i;:::-;34732:84;;34183:640;;;;;;;:::o;34829:141::-;34885:5;34916:6;34910:13;34901:22;;34932:32;34958:5;34932:32;:::i;:::-;34829:141;;;;:::o;34976:349::-;35045:6;35094:2;35082:9;35073:7;35069:23;35065:32;35062:119;;;35100:79;;:::i;:::-;35062:119;35220:1;35245:63;35300:7;35291:6;35280:9;35276:22;35245:63;:::i;:::-;35235:73;;35191:127;34976:349;;;;:::o;35331:180::-;35379:77;35376:1;35369:88;35476:4;35473:1;35466:15;35500:4;35497:1;35490:15
Swarm Source
ipfs://964e08f7025388cece8676d280578e30e7bf535adfbf0b5bc411df6e70548c9b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.