Contract Overview
Balance:
0 AVAX
AVAX Value:
$0.00
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0xbe5dcd6d49be2f4325005183b07ae0138c8da33140719030a08e3b4647383d15 | Mint | 25501604 | 2 days 23 hrs ago | 0xe84967a35af55fea8991e51a14408abf948dce14 | IN | 0x82e83f5cd3461a872ada3e3e3eb9d2bccf23c685 | 1 AVAX | 0.00352908513 | |
0x1dd00340a5fa71a15611a419a6a7db8cb4565fac00aee2fc5b4abde7a42b739b | Mint | 25501555 | 2 days 23 hrs ago | 0xe84967a35af55fea8991e51a14408abf948dce14 | IN | 0x82e83f5cd3461a872ada3e3e3eb9d2bccf23c685 | 1 AVAX | 0.002986346007 | |
0x0d2087e72a842f5f8b5d479957c619425ea423372d372f86745adaa6007ec15a | Mint | 25488970 | 3 days 6 hrs ago | 0x62b9d72d55c63f443a8206c6fb88b7d3dd2ad159 | IN | 0x82e83f5cd3461a872ada3e3e3eb9d2bccf23c685 | 1 AVAX | 0.00300580133 | |
0x2836b7ab38f6c7b39ce9653a8fed176cc24b4b3651d3927334d8aa5bd187cd03 | 0x60806040 | 25365803 | 6 days 4 hrs ago | 0x2e16bf30e186f2fa8fb79568586c2dd4fda11c63 | IN | Create: Web3StudiosNFTMP3 | 0 AVAX | 0.1026471875 |
[ Download CSV Export ]
Latest 3 internal transactions
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0xbe5dcd6d49be2f4325005183b07ae0138c8da33140719030a08e3b4647383d15 | 25501604 | 2 days 23 hrs ago | 0x82e83f5cd3461a872ada3e3e3eb9d2bccf23c685 | 0x2e16bf30e186f2fa8fb79568586c2dd4fda11c63 | 1 AVAX | ||
0x1dd00340a5fa71a15611a419a6a7db8cb4565fac00aee2fc5b4abde7a42b739b | 25501555 | 2 days 23 hrs ago | 0x82e83f5cd3461a872ada3e3e3eb9d2bccf23c685 | 0x2e16bf30e186f2fa8fb79568586c2dd4fda11c63 | 1 AVAX | ||
0x0d2087e72a842f5f8b5d479957c619425ea423372d372f86745adaa6007ec15a | 25488970 | 3 days 6 hrs ago | 0x82e83f5cd3461a872ada3e3e3eb9d2bccf23c685 | 0x2e16bf30e186f2fa8fb79568586c2dd4fda11c63 | 1 AVAX |
[ Download CSV Export ]
Contract Name:
Web3StudiosNFTMP3
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2023-01-24 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/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/contracts/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/contracts/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/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.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/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.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/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.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/contracts/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: contracts/test.sol pragma solidity ^0.8.0; contract KindaRandom { uint256 private _index = 0; uint256 private _supply; mapping(uint256 => uint256) _ids; constructor(uint256 supply_) { _supply = supply_; } function generateKindaRandomID(uint256 randomIndex) internal virtual returns (uint256) { uint256 remainder = _supply - _index; uint256 available; uint256 result; if (_ids[remainder - 1] == 0) { available = remainder - 1; } else { available = _ids[remainder - 1]; } if (_ids[randomIndex] == 0) { result = randomIndex; _ids[randomIndex] = available; } else { result = _ids[randomIndex]; _ids[randomIndex] = available; } _index++; return result; } } contract Web3StudiosNFTMP3 is ERC721URIStorage, Ownable, KindaRandom { using Counters for Counters.Counter; using Strings for uint256; Counters.Counter private _tokenIds; uint256 private _maxMintable; string private _customBaseURI; uint256 private _royaltyAmount; uint256 private _maxMintPerTx; string private _customBaseExtension; uint256 private _startTime; uint256 private _price; bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; bool private _mintActive; constructor() ERC721("Young Barid - On My Own - NFT MP3", "YBOMOMP3") KindaRandom(5) { _customBaseURI = 'https://web3studios.mypinata.cloud/ipfs/QmbhVpbWKRLfD3vruVWw6tbDY59bwVC9LwZuJakKG3TEhk/'; _customBaseExtension = '.json'; _maxMintable = 5; // 5 max supply - PROD _royaltyAmount = 1000; // 10% royalties _mintActive = false; // start paused _startTime = 1674799200; //unix timestamp of start time (Fri Jan 27 2023 00:00:00 GMT-0600 (Central Standard Time)) _maxMintPerTx = 1; _price = 1.0 ether; _privateMint(msg.sender); } function setBaseURI(string memory customBaseURI_) public onlyOwner { _customBaseURI = customBaseURI_; } function setBaseExtension(string memory customBaseExtension_) public onlyOwner { _customBaseExtension = customBaseExtension_; } function setMintActive(bool status) public onlyOwner { _mintActive = status; } function setStartTime(uint256 startTime_) public onlyOwner { _startTime = startTime_; } function mintActive() public view returns (bool) { return _mintActive || (block.timestamp >= _startTime); // use timer w/ability to override } function secondsUntilMint() public view returns (uint256) { if (!mintActive()) { return _startTime - block.timestamp; } else { return 0; } } function mint(uint256 quantity) public payable { require(mintActive(), "Minting is not active."); require(quantity <= _maxMintPerTx, "Cannot mint that many at once."); require(msg.value >= (quantity * _price), "Not enough AVAX sent."); payable(owner()).transfer(msg.value); for(uint i = 0; i < quantity; i++) { _privateMint(msg.sender); } } function totalSupply() public view returns (uint256) { return _tokenIds.current(); } function _privateMint(address recipient) private { uint256 randomish = uint256(keccak256(abi.encodePacked(block.difficulty, block.timestamp))) % (_maxMintable - _tokenIds.current()); _tokenIds.increment(); require(_tokenIds.current() <= _maxMintable, "Project is finished minting."); uint256 newItemId = generateKindaRandomID(randomish) + 1; // metadata is 1 indexed _mint(recipient, newItemId); } function _baseURI() internal view virtual override returns (string memory) { return _customBaseURI; } function _baseExtension() internal view returns (string memory) { return _customBaseExtension; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId),"ERC721URIStorage: URI query for nonexistent token"); string memory base = _baseURI(); string memory ext = _baseExtension(); return string(abi.encodePacked(base, (tokenId).toString(), ext)); } function royaltyInfo( uint256 _tokenId, uint256 _salePrice ) external view returns (address receiver, uint256 royaltyAmount) { return (owner(), ((_salePrice * _royaltyAmount) / 10000)); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721) returns (bool) { if (interfaceId == _INTERFACE_ID_ERC2981) { return true; } return super.supportsInterface(interfaceId); } function withdraw() public onlyOwner { require(address(this).balance > 0, "Balance is 0"); payable(owner()).transfer(address(this).balance); } }
[{"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":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintActive","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":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"secondsUntilMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"customBaseExtension_","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"customBaseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startTime_","type":"uint256"}],"name":"setStartTime","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006008553480156200001657600080fd5b5060056040518060600160405280602181526020016200466c602191396040518060400160405280600881526020017f59424f4d4f4d5033000000000000000000000000000000000000000000000000815250816000908051906020019062000081929190620008c2565b5080600190805190602001906200009a929190620008c2565b505050620000bd620000b1620001aa60201b60201c565b620001b260201b60201c565b80600981905550506040518060800160405280605781526020016200468d60579139600d9080519060200190620000f6929190620008c2565b506040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506010908051906020019062000144929190620008c2565b506005600c819055506103e8600e819055506000601360006101000a81548160ff0219169083151502179055506363d368606011819055506001600f81905550670de0b6b3a7640000601281905550620001a4336200027860201b60201c565b62000d19565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600062000291600b6200038b60201b620010231760201c565b600c54620002a0919062000b06565b4442604051602001620002b592919062000a02565b6040516020818303038152906040528051906020012060001c620002da919062000bd9565b9050620002f3600b6200039960201b620010311760201c565b600c546200030d600b6200038b60201b620010231760201c565b111562000351576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003489062000a76565b60405180910390fd5b600060016200036683620003af60201b60201c565b62000372919062000aa9565b9050620003868382620004c260201b60201c565b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b600080600854600954620003c4919062000b06565b90506000806000600a6000600186620003de919062000b06565b81526020019081526020016000205414156200040b5760018362000403919062000b06565b915062000430565b600a60006001856200041e919062000b06565b81526020019081526020016000205491505b6000600a60008781526020019081526020016000205414156200046e5784905081600a6000878152602001908152602001600020819055506200049d565b600a600086815260200190815260200160002054905081600a6000878152602001908152602001600020819055505b60086000815480929190620004b29062000b81565b9190505550809350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000535576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200052c9062000a54565b60405180910390fd5b62000546816200070960201b60201c565b1562000589576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005809062000a32565b60405180910390fd5b6200059f6000838360016200075260201b60201c565b620005b0816200070960201b60201c565b15620005f3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005ea9062000a32565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620007056000838360016200087f60201b60201c565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff1662000733836200088560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60018111156200087957600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614620007ea5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620007e2919062000b06565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614620008785780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000870919062000aa9565b925050819055505b5b50505050565b50505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b828054620008d09062000b4b565b90600052602060002090601f016020900481019282620008f4576000855562000940565b82601f106200090f57805160ff191683800117855562000940565b8280016001018555821562000940579182015b828111156200093f57825182559160200191906001019062000922565b5b5090506200094f919062000953565b5090565b5b808211156200096e57600081600090555060010162000954565b5090565b600062000981601c8362000a98565b91506200098e8262000c9e565b602082019050919050565b6000620009a860208362000a98565b9150620009b58262000cc7565b602082019050919050565b6000620009cf601c8362000a98565b9150620009dc8262000cf0565b602082019050919050565b620009fc620009f68262000b41565b62000bcf565b82525050565b600062000a108285620009e7565b60208201915062000a228284620009e7565b6020820191508190509392505050565b6000602082019050818103600083015262000a4d8162000972565b9050919050565b6000602082019050818103600083015262000a6f8162000999565b9050919050565b6000602082019050818103600083015262000a9181620009c0565b9050919050565b600082825260208201905092915050565b600062000ab68262000b41565b915062000ac38362000b41565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000afb5762000afa62000c11565b5b828201905092915050565b600062000b138262000b41565b915062000b208362000b41565b92508282101562000b365762000b3562000c11565b5b828203905092915050565b6000819050919050565b6000600282049050600182168062000b6457607f821691505b6020821081141562000b7b5762000b7a62000c6f565b5b50919050565b600062000b8e8262000b41565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000bc45762000bc362000c11565b5b600182019050919050565b6000819050919050565b600062000be68262000b41565b915062000bf38362000b41565b92508262000c065762000c0562000c40565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f50726f6a6563742069732066696e6973686564206d696e74696e672e00000000600082015250565b6139438062000d296000396000f3fe6080604052600436106101815760003560e01c806370a08231116100d1578063a22cb4651161008a578063da3ef23f11610064578063da3ef23f14610560578063e985e9c514610589578063ee1cc944146105c6578063f2fde38b146105ef57610181565b8063a22cb465146104d1578063b88d4fde146104fa578063c87b56dd1461052357610181565b806370a08231146103e0578063715018a61461041d5780638406a0e0146104345780638da5cb5b1461045f57806395d89b411461048a578063a0712d68146104b557610181565b806325fd90f31161013e5780633e0a322d116101185780633e0a322d1461032857806342842e0e1461035157806355f804b31461037a5780636352211e146103a357610181565b806325fd90f3146102a85780632a55205a146102d35780633ccfd60b1461031157610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a891906127be565b610618565b6040516101ba9190612d3b565b60405180910390f35b3480156101cf57600080fd5b506101d8610681565b6040516101e59190612d56565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612861565b610713565b6040516102229190612cab565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d9190612751565b610759565b005b34801561026057600080fd5b50610269610871565b6040516102769190612fd8565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a1919061263b565b610882565b005b3480156102b457600080fd5b506102bd6108e2565b6040516102ca9190612d3b565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f5919061288e565b610906565b604051610308929190612d12565b60405180910390f35b34801561031d57600080fd5b50610326610937565b005b34801561033457600080fd5b5061034f600480360381019061034a9190612861565b6109d2565b005b34801561035d57600080fd5b506103786004803603810190610373919061263b565b6109e4565b005b34801561038657600080fd5b506103a1600480360381019061039c9190612818565b610a04565b005b3480156103af57600080fd5b506103ca60048036038101906103c59190612861565b610a26565b6040516103d79190612cab565b60405180910390f35b3480156103ec57600080fd5b50610407600480360381019061040291906125ce565b610aad565b6040516104149190612fd8565b60405180910390f35b34801561042957600080fd5b50610432610b65565b005b34801561044057600080fd5b50610449610b79565b6040516104569190612fd8565b60405180910390f35b34801561046b57600080fd5b50610474610ba4565b6040516104819190612cab565b60405180910390f35b34801561049657600080fd5b5061049f610bce565b6040516104ac9190612d56565b60405180910390f35b6104cf60048036038101906104ca9190612861565b610c60565b005b3480156104dd57600080fd5b506104f860048036038101906104f39190612711565b610db5565b005b34801561050657600080fd5b50610521600480360381019061051c919061268e565b610dcb565b005b34801561052f57600080fd5b5061054a60048036038101906105459190612861565b610e2d565b6040516105579190612d56565b60405180910390f35b34801561056c57600080fd5b5061058760048036038101906105829190612818565b610ec4565b005b34801561059557600080fd5b506105b060048036038101906105ab91906125fb565b610ee6565b6040516105bd9190612d3b565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e89190612791565b610f7a565b005b3480156105fb57600080fd5b50610616600480360381019061061191906125ce565b610f9f565b005b6000632a55205a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610670576001905061067c565b61067982611047565b90505b919050565b60606000805461069090613288565b80601f01602080910402602001604051908101604052809291908181526020018280546106bc90613288565b80156107095780601f106106de57610100808354040283529160200191610709565b820191906000526020600020905b8154815290600101906020018083116106ec57829003601f168201915b5050505050905090565b600061071e82611129565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061076482610a26565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cc90612f78565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107f4611174565b73ffffffffffffffffffffffffffffffffffffffff16148061082357506108228161081d611174565b610ee6565b5b610862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085990612fb8565b60405180910390fd5b61086c838361117c565b505050565b600061087d600b611023565b905090565b61089361088d611174565b82611235565b6108d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c990612d78565b60405180910390fd5b6108dd8383836112ca565b505050565b6000601360009054906101000a900460ff168061090157506011544210155b905090565b600080610911610ba4565b612710600e54856109229190613144565b61092c9190613113565b915091509250929050565b61093f6115c4565b60004711610982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097990612ed8565b60405180910390fd5b61098a610ba4565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156109cf573d6000803e3d6000fd5b50565b6109da6115c4565b8060118190555050565b6109ff83838360405180602001604052806000815250610dcb565b505050565b610a0c6115c4565b80600d9080519060200190610a229291906123e2565b5050565b600080610a3283611642565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610aa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9b90612f58565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1590612e58565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b6d6115c4565b610b77600061167f565b565b6000610b836108e2565b610b9c5742601154610b95919061319e565b9050610ba1565b600090505b90565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610bdd90613288565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0990613288565b8015610c565780601f10610c2b57610100808354040283529160200191610c56565b820191906000526020600020905b815481529060010190602001808311610c3957829003601f168201915b5050505050905090565b610c686108e2565b610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90612f98565b60405180910390fd5b600f54811115610cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce390612e98565b60405180910390fd5b60125481610cfa9190613144565b341015610d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3390612e78565b60405180910390fd5b610d44610ba4565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610d89573d6000803e3d6000fd5b5060005b81811015610db157610d9e33611745565b8080610da9906132eb565b915050610d8d565b5050565b610dc7610dc0611174565b8383611816565b5050565b610ddc610dd6611174565b83611235565b610e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1290612d78565b60405180910390fd5b610e2784848484611983565b50505050565b6060610e38826119df565b610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e90612ef8565b60405180910390fd5b6000610e81611a20565b90506000610e8d611ab2565b905081610e9985611b44565b82604051602001610eac93929190612c4e565b60405160208183030381529060405292505050919050565b610ecc6115c4565b8060109080519060200190610ee29291906123e2565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610f826115c4565b80601360006101000a81548160ff02191690831515021790555050565b610fa76115c4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e90612db8565b60405180910390fd5b6110208161167f565b50565b600081600001549050919050565b6001816000016000828254019250508190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061111257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611122575061112182611c1c565b5b9050919050565b611132816119df565b611171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116890612f58565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166111ef83610a26565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061124183610a26565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061128357506112828185610ee6565b5b806112c157508373ffffffffffffffffffffffffffffffffffffffff166112a984610713565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166112ea82610a26565b73ffffffffffffffffffffffffffffffffffffffff1614611340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133790612dd8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a790612e18565b60405180910390fd5b6113bd8383836001611c86565b8273ffffffffffffffffffffffffffffffffffffffff166113dd82610a26565b73ffffffffffffffffffffffffffffffffffffffff1614611433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142a90612dd8565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46115bf8383836001611dac565b505050565b6115cc611174565b73ffffffffffffffffffffffffffffffffffffffff166115ea610ba4565b73ffffffffffffffffffffffffffffffffffffffff1614611640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163790612f38565b60405180910390fd5b565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611751600b611023565b600c5461175e919061319e565b4442604051602001611771929190612c7f565b6040516020818303038152906040528051906020012060001c611794919061333e565b90506117a0600b611031565b600c546117ad600b611023565b11156117ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e590612f18565b60405180910390fd5b600060016117fb83611db2565b61180591906130bd565b90506118118382611eb7565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187c90612e38565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119769190612d3b565b60405180910390a3505050565b61198e8484846112ca565b61199a848484846120d5565b6119d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d090612d98565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16611a0183611642565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600d8054611a2f90613288565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5b90613288565b8015611aa85780601f10611a7d57610100808354040283529160200191611aa8565b820191906000526020600020905b815481529060010190602001808311611a8b57829003601f168201915b5050505050905090565b606060108054611ac190613288565b80601f0160208091040260200160405190810160405280929190818152602001828054611aed90613288565b8015611b3a5780601f10611b0f57610100808354040283529160200191611b3a565b820191906000526020600020905b815481529060010190602001808311611b1d57829003601f168201915b5050505050905090565b606060006001611b538461226c565b01905060008167ffffffffffffffff811115611b7257611b716133fc565b5b6040519080825280601f01601f191660200182016040528015611ba45781602001600182028036833780820191505090505b509050600082602001820190505b600115611c11578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611bfb57611bfa61339e565b5b0494506000851415611c0c57611c11565b611bb2565b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6001811115611da657600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611d1a5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d12919061319e565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611da55780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d9d91906130bd565b925050819055505b5b50505050565b50505050565b600080600854600954611dc5919061319e565b90506000806000600a6000600186611ddd919061319e565b8152602001908152602001600020541415611e0657600183611dff919061319e565b9150611e29565b600a6000600185611e17919061319e565b81526020019081526020016000205491505b6000600a6000878152602001908152602001600020541415611e655784905081600a600087815260200190815260200160002081905550611e94565b600a600086815260200190815260200160002054905081600a6000878152602001908152602001600020819055505b60086000815480929190611ea7906132eb565b9190505550809350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1e90612eb8565b60405180910390fd5b611f30816119df565b15611f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6790612df8565b60405180910390fd5b611f7e600083836001611c86565b611f87816119df565b15611fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbe90612df8565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120d1600083836001611dac565b5050565b60006120f68473ffffffffffffffffffffffffffffffffffffffff166123bf565b1561225f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261211f611174565b8786866040518563ffffffff1660e01b81526004016121419493929190612cc6565b602060405180830381600087803b15801561215b57600080fd5b505af192505050801561218c57506040513d601f19601f8201168201806040525081019061218991906127eb565b60015b61220f573d80600081146121bc576040519150601f19603f3d011682016040523d82523d6000602084013e6121c1565b606091505b50600081511415612207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fe90612d98565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612264565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106122ca577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816122c0576122bf61339e565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612307576d04ee2d6d415b85acef810000000083816122fd576122fc61339e565b5b0492506020810190505b662386f26fc10000831061233657662386f26fc10000838161232c5761232b61339e565b5b0492506010810190505b6305f5e100831061235f576305f5e10083816123555761235461339e565b5b0492506008810190505b612710831061238457612710838161237a5761237961339e565b5b0492506004810190505b606483106123a7576064838161239d5761239c61339e565b5b0492506002810190505b600a83106123b6576001810190505b80915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546123ee90613288565b90600052602060002090601f0160209004810192826124105760008555612457565b82601f1061242957805160ff1916838001178555612457565b82800160010185558215612457579182015b8281111561245657825182559160200191906001019061243b565b5b5090506124649190612468565b5090565b5b80821115612481576000816000905550600101612469565b5090565b600061249861249384613018565b612ff3565b9050828152602081018484840111156124b4576124b3613430565b5b6124bf848285613246565b509392505050565b60006124da6124d584613049565b612ff3565b9050828152602081018484840111156124f6576124f5613430565b5b612501848285613246565b509392505050565b600081359050612518816138b1565b92915050565b60008135905061252d816138c8565b92915050565b600081359050612542816138df565b92915050565b600081519050612557816138df565b92915050565b600082601f8301126125725761257161342b565b5b8135612582848260208601612485565b91505092915050565b600082601f8301126125a05761259f61342b565b5b81356125b08482602086016124c7565b91505092915050565b6000813590506125c8816138f6565b92915050565b6000602082840312156125e4576125e361343a565b5b60006125f284828501612509565b91505092915050565b600080604083850312156126125761261161343a565b5b600061262085828601612509565b925050602061263185828601612509565b9150509250929050565b6000806000606084860312156126545761265361343a565b5b600061266286828701612509565b935050602061267386828701612509565b9250506040612684868287016125b9565b9150509250925092565b600080600080608085870312156126a8576126a761343a565b5b60006126b687828801612509565b94505060206126c787828801612509565b93505060406126d8878288016125b9565b925050606085013567ffffffffffffffff8111156126f9576126f8613435565b5b6127058782880161255d565b91505092959194509250565b600080604083850312156127285761272761343a565b5b600061273685828601612509565b92505060206127478582860161251e565b9150509250929050565b600080604083850312156127685761276761343a565b5b600061277685828601612509565b9250506020612787858286016125b9565b9150509250929050565b6000602082840312156127a7576127a661343a565b5b60006127b58482850161251e565b91505092915050565b6000602082840312156127d4576127d361343a565b5b60006127e284828501612533565b91505092915050565b6000602082840312156128015761280061343a565b5b600061280f84828501612548565b91505092915050565b60006020828403121561282e5761282d61343a565b5b600082013567ffffffffffffffff81111561284c5761284b613435565b5b6128588482850161258b565b91505092915050565b6000602082840312156128775761287661343a565b5b6000612885848285016125b9565b91505092915050565b600080604083850312156128a5576128a461343a565b5b60006128b3858286016125b9565b92505060206128c4858286016125b9565b9150509250929050565b6128d7816131d2565b82525050565b6128e6816131e4565b82525050565b60006128f78261307a565b6129018185613090565b9350612911818560208601613255565b61291a8161343f565b840191505092915050565b600061293082613085565b61293a81856130a1565b935061294a818560208601613255565b6129538161343f565b840191505092915050565b600061296982613085565b61297381856130b2565b9350612983818560208601613255565b80840191505092915050565b600061299c602d836130a1565b91506129a782613450565b604082019050919050565b60006129bf6032836130a1565b91506129ca8261349f565b604082019050919050565b60006129e26026836130a1565b91506129ed826134ee565b604082019050919050565b6000612a056025836130a1565b9150612a108261353d565b604082019050919050565b6000612a28601c836130a1565b9150612a338261358c565b602082019050919050565b6000612a4b6024836130a1565b9150612a56826135b5565b604082019050919050565b6000612a6e6019836130a1565b9150612a7982613604565b602082019050919050565b6000612a916029836130a1565b9150612a9c8261362d565b604082019050919050565b6000612ab46015836130a1565b9150612abf8261367c565b602082019050919050565b6000612ad7601e836130a1565b9150612ae2826136a5565b602082019050919050565b6000612afa6020836130a1565b9150612b05826136ce565b602082019050919050565b6000612b1d600c836130a1565b9150612b28826136f7565b602082019050919050565b6000612b406031836130a1565b9150612b4b82613720565b604082019050919050565b6000612b63601c836130a1565b9150612b6e8261376f565b602082019050919050565b6000612b866020836130a1565b9150612b9182613798565b602082019050919050565b6000612ba96018836130a1565b9150612bb4826137c1565b602082019050919050565b6000612bcc6021836130a1565b9150612bd7826137ea565b604082019050919050565b6000612bef6016836130a1565b9150612bfa82613839565b602082019050919050565b6000612c12603d836130a1565b9150612c1d82613862565b604082019050919050565b612c318161323c565b82525050565b612c48612c438261323c565b613334565b82525050565b6000612c5a828661295e565b9150612c66828561295e565b9150612c72828461295e565b9150819050949350505050565b6000612c8b8285612c37565b602082019150612c9b8284612c37565b6020820191508190509392505050565b6000602082019050612cc060008301846128ce565b92915050565b6000608082019050612cdb60008301876128ce565b612ce860208301866128ce565b612cf56040830185612c28565b8181036060830152612d0781846128ec565b905095945050505050565b6000604082019050612d2760008301856128ce565b612d346020830184612c28565b9392505050565b6000602082019050612d5060008301846128dd565b92915050565b60006020820190508181036000830152612d708184612925565b905092915050565b60006020820190508181036000830152612d918161298f565b9050919050565b60006020820190508181036000830152612db1816129b2565b9050919050565b60006020820190508181036000830152612dd1816129d5565b9050919050565b60006020820190508181036000830152612df1816129f8565b9050919050565b60006020820190508181036000830152612e1181612a1b565b9050919050565b60006020820190508181036000830152612e3181612a3e565b9050919050565b60006020820190508181036000830152612e5181612a61565b9050919050565b60006020820190508181036000830152612e7181612a84565b9050919050565b60006020820190508181036000830152612e9181612aa7565b9050919050565b60006020820190508181036000830152612eb181612aca565b9050919050565b60006020820190508181036000830152612ed181612aed565b9050919050565b60006020820190508181036000830152612ef181612b10565b9050919050565b60006020820190508181036000830152612f1181612b33565b9050919050565b60006020820190508181036000830152612f3181612b56565b9050919050565b60006020820190508181036000830152612f5181612b79565b9050919050565b60006020820190508181036000830152612f7181612b9c565b9050919050565b60006020820190508181036000830152612f9181612bbf565b9050919050565b60006020820190508181036000830152612fb181612be2565b9050919050565b60006020820190508181036000830152612fd181612c05565b9050919050565b6000602082019050612fed6000830184612c28565b92915050565b6000612ffd61300e565b905061300982826132ba565b919050565b6000604051905090565b600067ffffffffffffffff821115613033576130326133fc565b5b61303c8261343f565b9050602081019050919050565b600067ffffffffffffffff821115613064576130636133fc565b5b61306d8261343f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006130c88261323c565b91506130d38361323c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131085761310761336f565b5b828201905092915050565b600061311e8261323c565b91506131298361323c565b9250826131395761313861339e565b5b828204905092915050565b600061314f8261323c565b915061315a8361323c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156131935761319261336f565b5b828202905092915050565b60006131a98261323c565b91506131b48361323c565b9250828210156131c7576131c661336f565b5b828203905092915050565b60006131dd8261321c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613273578082015181840152602081019050613258565b83811115613282576000848401525b50505050565b600060028204905060018216806132a057607f821691505b602082108114156132b4576132b36133cd565b5b50919050565b6132c38261343f565b810181811067ffffffffffffffff821117156132e2576132e16133fc565b5b80604052505050565b60006132f68261323c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156133295761332861336f565b5b600182019050919050565b6000819050919050565b60006133498261323c565b91506133548361323c565b9250826133645761336361339e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820415641582073656e742e0000000000000000000000600082015250565b7f43616e6e6f74206d696e742074686174206d616e79206174206f6e63652e0000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f42616c616e636520697320300000000000000000000000000000000000000000600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f50726f6a6563742069732066696e6973686564206d696e74696e672e00000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e67206973206e6f74206163746976652e00000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6138ba816131d2565b81146138c557600080fd5b50565b6138d1816131e4565b81146138dc57600080fd5b50565b6138e8816131f0565b81146138f357600080fd5b50565b6138ff8161323c565b811461390a57600080fd5b5056fea2646970667358221220290999af68ea6fd6567ad555fa91319ca9164088757e0e3b0b3d12ecb9cd11c264736f6c63430008070033596f756e67204261726964202d204f6e204d79204f776e202d204e4654204d503368747470733a2f2f7765623373747564696f732e6d7970696e6174612e636c6f75642f697066732f516d6268567062574b524c6644337672755657773674624459353962775643394c775a754a616b4b47335445686b2f
Deployed ByteCode Sourcemap
58659:3990:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62250:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40970:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42482:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42000:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60936:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43182:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60204:150;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62036:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;62487:159;;;;;;;;;;;;;:::i;:::-;;60103:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43588:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59755:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40680:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40411:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19473:103;;;;;;;;;;;;;:::i;:::-;;60362:172;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18825:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41139:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60540:390;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42725:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43844:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61698:332;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59870:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42951:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60011:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19731:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62250:231;62343:4;59128:10;62375:21;;62360:36;;;:11;:36;;;;62356:70;;;62414:4;62407:11;;;;62356:70;62439:36;62463:11;62439:23;:36::i;:::-;62432:43;;62250:231;;;;:::o;40970:100::-;41024:13;41057:5;41050:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40970:100;:::o;42482:171::-;42558:7;42578:23;42593:7;42578:14;:23::i;:::-;42621:15;:24;42637:7;42621:24;;;;;;;;;;;;;;;;;;;;;42614:31;;42482:171;;;:::o;42000:416::-;42081:13;42097:23;42112:7;42097:14;:23::i;:::-;42081:39;;42145:5;42139:11;;:2;:11;;;;42131:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;42239:5;42223:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;42248:37;42265:5;42272:12;:10;:12::i;:::-;42248:16;:37::i;:::-;42223:62;42201:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;42387:21;42396:2;42400:7;42387:8;:21::i;:::-;42070:346;42000:416;;:::o;60936:92::-;60980:7;61003:19;:9;:17;:19::i;:::-;60996:26;;60936:92;:::o;43182:335::-;43377:41;43396:12;:10;:12::i;:::-;43410:7;43377:18;:41::i;:::-;43369:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;43481:28;43491:4;43497:2;43501:7;43481:9;:28::i;:::-;43182:335;;;:::o;60204:150::-;60247:4;60267:11;;;;;;;;;;;:46;;;;60302:10;;60283:15;:29;;60267:46;60260:53;;60204:150;:::o;62036:208::-;62133:16;62151:21;62189:7;:5;:7::i;:::-;62231:5;62213:14;;62200:10;:27;;;;:::i;:::-;62199:37;;;;:::i;:::-;62181:57;;;;62036:208;;;;;:::o;62487:159::-;18711:13;:11;:13::i;:::-;62565:1:::1;62541:21;:25;62533:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;62600:7;:5;:7::i;:::-;62592:25;;:48;62618:21;62592:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;62487:159::o:0;60103:95::-;18711:13;:11;:13::i;:::-;60182:10:::1;60169;:23;;;;60103:95:::0;:::o;43588:185::-;43726:39;43743:4;43749:2;43753:7;43726:39;;;;;;;;;;;;:16;:39::i;:::-;43588:185;;;:::o;59755:111::-;18711:13;:11;:13::i;:::-;59846:14:::1;59829;:31;;;;;;;;;;;;:::i;:::-;;59755:111:::0;:::o;40680:223::-;40752:7;40772:13;40788:17;40797:7;40788:8;:17::i;:::-;40772:33;;40841:1;40824:19;;:5;:19;;;;40816:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;40890:5;40883:12;;;40680:223;;;:::o;40411:207::-;40483:7;40528:1;40511:19;;:5;:19;;;;40503:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40594:9;:16;40604:5;40594:16;;;;;;;;;;;;;;;;40587:23;;40411:207;;;:::o;19473:103::-;18711:13;:11;:13::i;:::-;19538:30:::1;19565:1;19538:18;:30::i;:::-;19473:103::o:0;60362:172::-;60411:7;60432:12;:10;:12::i;:::-;60427:102;;60475:15;60462:10;;:28;;;;:::i;:::-;60455:35;;;;60427:102;60520:1;60513:8;;60362:172;;:::o;18825:87::-;18871:7;18898:6;;;;;;;;;;;18891:13;;18825:87;:::o;41139:104::-;41195:13;41228:7;41221:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41139:104;:::o;60540:390::-;60602:12;:10;:12::i;:::-;60594:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;60668:13;;60656:8;:25;;60648:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60756:6;;60745:8;:17;;;;:::i;:::-;60731:9;:32;;60723:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;60808:7;:5;:7::i;:::-;60800:25;;:36;60826:9;60800:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60849:6;60845:76;60865:8;60861:1;:12;60845:76;;;60889:24;60902:10;60889:12;:24::i;:::-;60875:3;;;;;:::i;:::-;;;;60845:76;;;;60540:390;:::o;42725:155::-;42820:52;42839:12;:10;:12::i;:::-;42853:8;42863;42820:18;:52::i;:::-;42725:155;;:::o;43844:322::-;44018:41;44037:12;:10;:12::i;:::-;44051:7;44018:18;:41::i;:::-;44010:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;44120:38;44134:4;44140:2;44144:7;44153:4;44120:13;:38::i;:::-;43844:322;;;;:::o;61698:332::-;61771:13;61801:16;61809:7;61801;:16::i;:::-;61793:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;61877:18;61898:10;:8;:10::i;:::-;61877:31;;61915:17;61935:16;:14;:16::i;:::-;61915:36;;61989:4;61995:20;61996:7;61995:18;:20::i;:::-;62017:3;61972:49;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61958:64;;;;61698:332;;;:::o;59870:135::-;18711:13;:11;:13::i;:::-;59979:20:::1;59956;:43;;;;;;;;;;;;:::i;:::-;;59870:135:::0;:::o;42951:164::-;43048:4;43072:18;:25;43091:5;43072:25;;;;;;;;;;;;;;;:35;43098:8;43072:35;;;;;;;;;;;;;;;;;;;;;;;;;43065:42;;42951:164;;;;:::o;60011:86::-;18711:13;:11;:13::i;:::-;60085:6:::1;60071:11;;:20;;;;;;;;;;;;;;;;;;60011:86:::0;:::o;19731:201::-;18711:13;:11;:13::i;:::-;19840:1:::1;19820:22;;:8;:22;;;;19812:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19896:28;19915:8;19896:18;:28::i;:::-;19731:201:::0;:::o;905:114::-;970:7;997;:14;;;990:21;;905:114;;;:::o;1027:127::-;1134:1;1116:7;:14;;;:19;;;;;;;;;;;1027:127;:::o;40042:305::-;40144:4;40196:25;40181:40;;;:11;:40;;;;:105;;;;40253:33;40238:48;;;:11;:48;;;;40181:105;:158;;;;40303:36;40327:11;40303:23;:36::i;:::-;40181:158;40161:178;;40042:305;;;:::o;52301:135::-;52383:16;52391:7;52383;:16::i;:::-;52375:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;52301:135;:::o;17376:98::-;17429:7;17456:10;17449:17;;17376:98;:::o;51580:174::-;51682:2;51655:15;:24;51671:7;51655:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51738:7;51734:2;51700:46;;51709:23;51724:7;51709:14;:23::i;:::-;51700:46;;;;;;;;;;;;51580:174;;:::o;46199:264::-;46292:4;46309:13;46325:23;46340:7;46325:14;:23::i;:::-;46309:39;;46378:5;46367:16;;:7;:16;;;:52;;;;46387:32;46404:5;46411:7;46387:16;:32::i;:::-;46367:52;:87;;;;46447:7;46423:31;;:20;46435:7;46423:11;:20::i;:::-;:31;;;46367:87;46359:96;;;46199:264;;;;:::o;50198:1263::-;50357:4;50330:31;;:23;50345:7;50330:14;:23::i;:::-;:31;;;50322:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50436:1;50422:16;;:2;:16;;;;50414:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50492:42;50513:4;50519:2;50523:7;50532:1;50492:20;:42::i;:::-;50664:4;50637:31;;:23;50652:7;50637:14;:23::i;:::-;:31;;;50629:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50782:15;:24;50798:7;50782:24;;;;;;;;;;;;50775:31;;;;;;;;;;;51277:1;51258:9;:15;51268:4;51258:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;51310:1;51293:9;:13;51303:2;51293:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;51352:2;51333:7;:16;51341:7;51333:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;51391:7;51387:2;51372:27;;51381:4;51372:27;;;;;;;;;;;;51412:41;51432:4;51438:2;51442:7;51451:1;51412:19;:41::i;:::-;50198:1263;;;:::o;18990:132::-;19065:12;:10;:12::i;:::-;19054:23;;:7;:5;:7::i;:::-;:23;;;19046:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18990:132::o;45474:117::-;45540:7;45567;:16;45575:7;45567:16;;;;;;;;;;;;;;;;;;;;;45560:23;;45474:117;;;:::o;20092:191::-;20166:16;20185:6;;;;;;;;;;;20166:25;;20211:8;20202:6;;:17;;;;;;;;;;;;;;;;;;20266:8;20235:40;;20256:8;20235:40;;;;;;;;;;;;20155:128;20092:191;:::o;61034:431::-;61090:17;61200:19;:9;:17;:19::i;:::-;61185:12;;:34;;;;:::i;:::-;61145:16;61163:15;61128:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61118:62;;;;;;61110:71;;:110;;;;:::i;:::-;61090:130;;61229:21;:9;:19;:21::i;:::-;61288:12;;61265:19;:9;:17;:19::i;:::-;:35;;61257:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;61342:17;61397:1;61362:32;61384:9;61362:21;:32::i;:::-;:36;;;;:::i;:::-;61342:56;;61432:27;61438:9;61449;61432:5;:27::i;:::-;61083:382;;61034:431;:::o;51897:315::-;52052:8;52043:17;;:5;:17;;;;52035:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;52139:8;52101:18;:25;52120:5;52101:25;;;;;;;;;;;;;;;:35;52127:8;52101:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;52185:8;52163:41;;52178:5;52163:41;;;52195:8;52163:41;;;;;;:::i;:::-;;;;;;;;51897:315;;;:::o;45047:313::-;45203:28;45213:4;45219:2;45223:7;45203:9;:28::i;:::-;45250:47;45273:4;45279:2;45283:7;45292:4;45250:22;:47::i;:::-;45242:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;45047:313;;;;:::o;45904:128::-;45969:4;46022:1;45993:31;;:17;46002:7;45993:8;:17::i;:::-;:31;;;;45986:38;;45904:128;;;:::o;61471:109::-;61531:13;61560:14;61553:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61471:109;:::o;61586:104::-;61635:13;61664:20;61657:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61586:104;:::o;14803:716::-;14859:13;14910:14;14947:1;14927:17;14938:5;14927:10;:17::i;:::-;:21;14910:38;;14963:20;14997:6;14986:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14963:41;;15019:11;15148:6;15144:2;15140:15;15132:6;15128:28;15121:35;;15185:288;15192:4;15185:288;;;15217:5;;;;;;;;15359:8;15354:2;15347:5;15343:14;15338:30;15333:3;15325:44;15415:2;15406:11;;;;;;:::i;:::-;;;;;15449:1;15440:5;:10;15436:21;;;15452:5;;15436:21;15185:288;;;15494:6;15487:13;;;;;14803:716;;;:::o;32554:157::-;32639:4;32678:25;32663:40;;;:11;:40;;;;32656:47;;32554:157;;;:::o;54585:410::-;54775:1;54763:9;:13;54759:229;;;54813:1;54797:18;;:4;:18;;;54793:87;;54855:9;54836;:15;54846:4;54836:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;54793:87;54912:1;54898:16;;:2;:16;;;54894:83;;54952:9;54935;:13;54945:2;54935:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;54894:83;54759:229;54585:410;;;;:::o;55717:158::-;;;;;:::o;58100:552::-;58178:7;58194:17;58224:6;;58214:7;;:16;;;;:::i;:::-;58194:36;;58237:17;58261:14;58311:1;58288:4;:19;58305:1;58293:9;:13;;;;:::i;:::-;58288:19;;;;;;;;;;;;:24;58284:126;;;58347:1;58335:9;:13;;;;:::i;:::-;58323:25;;58284:126;;;58383:4;:19;58400:1;58388:9;:13;;;;:::i;:::-;58383:19;;;;;;;;;;;;58371:31;;58284:126;58443:1;58422:4;:17;58427:11;58422:17;;;;;;;;;;;;:22;58418:190;;;58464:11;58455:20;;58504:9;58484:4;:17;58489:11;58484:17;;;;;;;;;;;:29;;;;58418:190;;;58545:4;:17;58550:11;58545:17;;;;;;;;;;;;58536:26;;58591:9;58571:4;:17;58576:11;58571:17;;;;;;;;;;;:29;;;;58418:190;58616:6;;:8;;;;;;;;;:::i;:::-;;;;;;58640:6;58633:13;;;;;58100:552;;;:::o;47797:942::-;47891:1;47877:16;;:2;:16;;;;47869:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47950:16;47958:7;47950;:16::i;:::-;47949:17;47941:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48012:48;48041:1;48045:2;48049:7;48058:1;48012:20;:48::i;:::-;48159:16;48167:7;48159;:16::i;:::-;48158:17;48150:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48574:1;48557:9;:13;48567:2;48557:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;48618:2;48599:7;:16;48607:7;48599:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;48663:7;48659:2;48638:33;;48655:1;48638:33;;;;;;;;;;;;48684:47;48712:1;48716:2;48720:7;48729:1;48684:19;:47::i;:::-;47797:942;;:::o;53000:853::-;53154:4;53175:15;:2;:13;;;:15::i;:::-;53171:675;;;53227:2;53211:36;;;53248:12;:10;:12::i;:::-;53262:4;53268:7;53277:4;53211:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53207:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53469:1;53452:6;:13;:18;53448:328;;;53495:60;;;;;;;;;;:::i;:::-;;;;;;;;53448:328;53726:6;53720:13;53711:6;53707:2;53703:15;53696:38;53207:584;53343:41;;;53333:51;;;:6;:51;;;;53326:58;;;;;53171:675;53830:4;53823:11;;53000:853;;;;;;;:::o;11669:922::-;11722:7;11742:14;11759:1;11742:18;;11809:6;11800:5;:15;11796:102;;11845:6;11836:15;;;;;;:::i;:::-;;;;;11880:2;11870:12;;;;11796:102;11925:6;11916:5;:15;11912:102;;11961:6;11952:15;;;;;;:::i;:::-;;;;;11996:2;11986:12;;;;11912:102;12041:6;12032:5;:15;12028:102;;12077:6;12068:15;;;;;;:::i;:::-;;;;;12112:2;12102:12;;;;12028:102;12157:5;12148;:14;12144:99;;12192:5;12183:14;;;;;;:::i;:::-;;;;;12226:1;12216:11;;;;12144:99;12270:5;12261;:14;12257:99;;12305:5;12296:14;;;;;;:::i;:::-;;;;;12339:1;12329:11;;;;12257:99;12383:5;12374;:14;12370:99;;12418:5;12409:14;;;;;;:::i;:::-;;;;;12452:1;12442:11;;;;12370:99;12496:5;12487;:14;12483:66;;12532:1;12522:11;;;;12483:66;12577:6;12570:13;;;11669:922;;;:::o;21523:326::-;21583:4;21840:1;21818:7;:19;;;:23;21811:30;;21523:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:474::-;7555:6;7563;7612:2;7600:9;7591:7;7587:23;7583:32;7580:119;;;7618:79;;:::i;:::-;7580:119;7738:1;7763:53;7808:7;7799:6;7788:9;7784:22;7763:53;:::i;:::-;7753:63;;7709:117;7865:2;7891:53;7936:7;7927:6;7916:9;7912:22;7891:53;:::i;:::-;7881:63;;7836:118;7487:474;;;;;:::o;7967:118::-;8054:24;8072:5;8054:24;:::i;:::-;8049:3;8042:37;7967:118;;:::o;8091:109::-;8172:21;8187:5;8172:21;:::i;:::-;8167:3;8160:34;8091:109;;:::o;8206:360::-;8292:3;8320:38;8352:5;8320:38;:::i;:::-;8374:70;8437:6;8432:3;8374:70;:::i;:::-;8367:77;;8453:52;8498:6;8493:3;8486:4;8479:5;8475:16;8453:52;:::i;:::-;8530:29;8552:6;8530:29;:::i;:::-;8525:3;8521:39;8514:46;;8296:270;8206:360;;;;:::o;8572:364::-;8660:3;8688:39;8721:5;8688:39;:::i;:::-;8743:71;8807:6;8802:3;8743:71;:::i;:::-;8736:78;;8823:52;8868:6;8863:3;8856:4;8849:5;8845:16;8823:52;:::i;:::-;8900:29;8922:6;8900:29;:::i;:::-;8895:3;8891:39;8884:46;;8664:272;8572:364;;;;:::o;8942:377::-;9048:3;9076:39;9109:5;9076:39;:::i;:::-;9131:89;9213:6;9208:3;9131:89;:::i;:::-;9124:96;;9229:52;9274:6;9269:3;9262:4;9255:5;9251:16;9229:52;:::i;:::-;9306:6;9301:3;9297:16;9290:23;;9052:267;8942:377;;;;:::o;9325:366::-;9467:3;9488:67;9552:2;9547:3;9488:67;:::i;:::-;9481:74;;9564:93;9653:3;9564:93;:::i;:::-;9682:2;9677:3;9673:12;9666:19;;9325:366;;;:::o;9697:::-;9839:3;9860:67;9924:2;9919:3;9860:67;:::i;:::-;9853:74;;9936:93;10025:3;9936:93;:::i;:::-;10054:2;10049:3;10045:12;10038:19;;9697:366;;;:::o;10069:::-;10211:3;10232:67;10296:2;10291:3;10232:67;:::i;:::-;10225:74;;10308:93;10397:3;10308:93;:::i;:::-;10426:2;10421:3;10417:12;10410:19;;10069:366;;;:::o;10441:::-;10583:3;10604:67;10668:2;10663:3;10604:67;:::i;:::-;10597:74;;10680:93;10769:3;10680:93;:::i;:::-;10798:2;10793:3;10789:12;10782:19;;10441:366;;;:::o;10813:::-;10955:3;10976:67;11040:2;11035:3;10976:67;:::i;:::-;10969:74;;11052:93;11141:3;11052:93;:::i;:::-;11170:2;11165:3;11161:12;11154:19;;10813:366;;;:::o;11185:::-;11327:3;11348:67;11412:2;11407:3;11348:67;:::i;:::-;11341:74;;11424:93;11513:3;11424:93;:::i;:::-;11542:2;11537:3;11533:12;11526:19;;11185:366;;;:::o;11557:::-;11699:3;11720:67;11784:2;11779:3;11720:67;:::i;:::-;11713:74;;11796:93;11885:3;11796:93;:::i;:::-;11914:2;11909:3;11905:12;11898:19;;11557:366;;;:::o;11929:::-;12071:3;12092:67;12156:2;12151:3;12092:67;:::i;:::-;12085:74;;12168:93;12257:3;12168:93;:::i;:::-;12286:2;12281:3;12277:12;12270:19;;11929:366;;;:::o;12301:::-;12443:3;12464:67;12528:2;12523:3;12464:67;:::i;:::-;12457:74;;12540:93;12629:3;12540:93;:::i;:::-;12658:2;12653:3;12649:12;12642:19;;12301:366;;;:::o;12673:::-;12815:3;12836:67;12900:2;12895:3;12836:67;:::i;:::-;12829:74;;12912:93;13001:3;12912:93;:::i;:::-;13030:2;13025:3;13021:12;13014:19;;12673:366;;;:::o;13045:::-;13187:3;13208:67;13272:2;13267:3;13208:67;:::i;:::-;13201:74;;13284:93;13373:3;13284:93;:::i;:::-;13402:2;13397:3;13393:12;13386:19;;13045:366;;;:::o;13417:::-;13559:3;13580:67;13644:2;13639:3;13580:67;:::i;:::-;13573:74;;13656:93;13745:3;13656:93;:::i;:::-;13774:2;13769:3;13765:12;13758:19;;13417:366;;;:::o;13789:::-;13931:3;13952:67;14016:2;14011:3;13952:67;:::i;:::-;13945:74;;14028:93;14117:3;14028:93;:::i;:::-;14146:2;14141:3;14137:12;14130:19;;13789:366;;;:::o;14161:::-;14303:3;14324:67;14388:2;14383:3;14324:67;:::i;:::-;14317:74;;14400:93;14489:3;14400:93;:::i;:::-;14518:2;14513:3;14509:12;14502:19;;14161:366;;;:::o;14533:::-;14675:3;14696:67;14760:2;14755:3;14696:67;:::i;:::-;14689:74;;14772:93;14861:3;14772:93;:::i;:::-;14890:2;14885:3;14881:12;14874:19;;14533:366;;;:::o;14905:::-;15047:3;15068:67;15132:2;15127:3;15068:67;:::i;:::-;15061:74;;15144:93;15233:3;15144:93;:::i;:::-;15262:2;15257:3;15253:12;15246:19;;14905:366;;;:::o;15277:::-;15419:3;15440:67;15504:2;15499:3;15440:67;:::i;:::-;15433:74;;15516:93;15605:3;15516:93;:::i;:::-;15634:2;15629:3;15625:12;15618:19;;15277:366;;;:::o;15649:::-;15791:3;15812:67;15876:2;15871:3;15812:67;:::i;:::-;15805:74;;15888:93;15977:3;15888:93;:::i;:::-;16006:2;16001:3;15997:12;15990:19;;15649:366;;;:::o;16021:::-;16163:3;16184:67;16248:2;16243:3;16184:67;:::i;:::-;16177:74;;16260:93;16349:3;16260:93;:::i;:::-;16378:2;16373:3;16369:12;16362:19;;16021:366;;;:::o;16393:118::-;16480:24;16498:5;16480:24;:::i;:::-;16475:3;16468:37;16393:118;;:::o;16517:157::-;16622:45;16642:24;16660:5;16642:24;:::i;:::-;16622:45;:::i;:::-;16617:3;16610:58;16517:157;;:::o;16680:595::-;16908:3;16930:95;17021:3;17012:6;16930:95;:::i;:::-;16923:102;;17042:95;17133:3;17124:6;17042:95;:::i;:::-;17035:102;;17154:95;17245:3;17236:6;17154:95;:::i;:::-;17147:102;;17266:3;17259:10;;16680:595;;;;;;:::o;17281:397::-;17421:3;17436:75;17507:3;17498:6;17436:75;:::i;:::-;17536:2;17531:3;17527:12;17520:19;;17549:75;17620:3;17611:6;17549:75;:::i;:::-;17649:2;17644:3;17640:12;17633:19;;17669:3;17662:10;;17281:397;;;;;:::o;17684:222::-;17777:4;17815:2;17804:9;17800:18;17792:26;;17828:71;17896:1;17885:9;17881:17;17872:6;17828:71;:::i;:::-;17684:222;;;;:::o;17912:640::-;18107:4;18145:3;18134:9;18130:19;18122:27;;18159:71;18227:1;18216:9;18212:17;18203:6;18159:71;:::i;:::-;18240:72;18308:2;18297:9;18293:18;18284:6;18240:72;:::i;:::-;18322;18390:2;18379:9;18375:18;18366:6;18322:72;:::i;:::-;18441:9;18435:4;18431:20;18426:2;18415:9;18411:18;18404:48;18469:76;18540:4;18531:6;18469:76;:::i;:::-;18461:84;;17912:640;;;;;;;:::o;18558:332::-;18679:4;18717:2;18706:9;18702:18;18694:26;;18730:71;18798:1;18787:9;18783:17;18774:6;18730:71;:::i;:::-;18811:72;18879:2;18868:9;18864:18;18855:6;18811:72;:::i;:::-;18558:332;;;;;:::o;18896:210::-;18983:4;19021:2;19010:9;19006:18;18998:26;;19034:65;19096:1;19085:9;19081:17;19072:6;19034:65;:::i;:::-;18896:210;;;;:::o;19112:313::-;19225:4;19263:2;19252:9;19248:18;19240:26;;19312:9;19306:4;19302:20;19298:1;19287:9;19283:17;19276:47;19340:78;19413:4;19404:6;19340:78;:::i;:::-;19332:86;;19112:313;;;;:::o;19431:419::-;19597:4;19635:2;19624:9;19620:18;19612:26;;19684:9;19678:4;19674:20;19670:1;19659:9;19655:17;19648:47;19712:131;19838:4;19712:131;:::i;:::-;19704:139;;19431:419;;;:::o;19856:::-;20022:4;20060:2;20049:9;20045:18;20037:26;;20109:9;20103:4;20099:20;20095:1;20084:9;20080:17;20073:47;20137:131;20263:4;20137:131;:::i;:::-;20129:139;;19856:419;;;:::o;20281:::-;20447:4;20485:2;20474:9;20470:18;20462:26;;20534:9;20528:4;20524:20;20520:1;20509:9;20505:17;20498:47;20562:131;20688:4;20562:131;:::i;:::-;20554:139;;20281:419;;;:::o;20706:::-;20872:4;20910:2;20899:9;20895:18;20887:26;;20959:9;20953:4;20949:20;20945:1;20934:9;20930:17;20923:47;20987:131;21113:4;20987:131;:::i;:::-;20979:139;;20706:419;;;:::o;21131:::-;21297:4;21335:2;21324:9;21320:18;21312:26;;21384:9;21378:4;21374:20;21370:1;21359:9;21355:17;21348:47;21412:131;21538:4;21412:131;:::i;:::-;21404:139;;21131:419;;;:::o;21556:::-;21722:4;21760:2;21749:9;21745:18;21737:26;;21809:9;21803:4;21799:20;21795:1;21784:9;21780:17;21773:47;21837:131;21963:4;21837:131;:::i;:::-;21829:139;;21556:419;;;:::o;21981:::-;22147:4;22185:2;22174:9;22170:18;22162:26;;22234:9;22228:4;22224:20;22220:1;22209:9;22205:17;22198:47;22262:131;22388:4;22262:131;:::i;:::-;22254:139;;21981:419;;;:::o;22406:::-;22572:4;22610:2;22599:9;22595:18;22587:26;;22659:9;22653:4;22649:20;22645:1;22634:9;22630:17;22623:47;22687:131;22813:4;22687:131;:::i;:::-;22679:139;;22406:419;;;:::o;22831:::-;22997:4;23035:2;23024:9;23020:18;23012:26;;23084:9;23078:4;23074:20;23070:1;23059:9;23055:17;23048:47;23112:131;23238:4;23112:131;:::i;:::-;23104:139;;22831:419;;;:::o;23256:::-;23422:4;23460:2;23449:9;23445:18;23437:26;;23509:9;23503:4;23499:20;23495:1;23484:9;23480:17;23473:47;23537:131;23663:4;23537:131;:::i;:::-;23529:139;;23256:419;;;:::o;23681:::-;23847:4;23885:2;23874:9;23870:18;23862:26;;23934:9;23928:4;23924:20;23920:1;23909:9;23905:17;23898:47;23962:131;24088:4;23962:131;:::i;:::-;23954:139;;23681:419;;;:::o;24106:::-;24272:4;24310:2;24299:9;24295:18;24287:26;;24359:9;24353:4;24349:20;24345:1;24334:9;24330:17;24323:47;24387:131;24513:4;24387:131;:::i;:::-;24379:139;;24106:419;;;:::o;24531:::-;24697:4;24735:2;24724:9;24720:18;24712:26;;24784:9;24778:4;24774:20;24770:1;24759:9;24755:17;24748:47;24812:131;24938:4;24812:131;:::i;:::-;24804:139;;24531:419;;;:::o;24956:::-;25122:4;25160:2;25149:9;25145:18;25137:26;;25209:9;25203:4;25199:20;25195:1;25184:9;25180:17;25173:47;25237:131;25363:4;25237:131;:::i;:::-;25229:139;;24956:419;;;:::o;25381:::-;25547:4;25585:2;25574:9;25570:18;25562:26;;25634:9;25628:4;25624:20;25620:1;25609:9;25605:17;25598:47;25662:131;25788:4;25662:131;:::i;:::-;25654:139;;25381:419;;;:::o;25806:::-;25972:4;26010:2;25999:9;25995:18;25987:26;;26059:9;26053:4;26049:20;26045:1;26034:9;26030:17;26023:47;26087:131;26213:4;26087:131;:::i;:::-;26079:139;;25806:419;;;:::o;26231:::-;26397:4;26435:2;26424:9;26420:18;26412:26;;26484:9;26478:4;26474:20;26470:1;26459:9;26455:17;26448:47;26512:131;26638:4;26512:131;:::i;:::-;26504:139;;26231:419;;;:::o;26656:::-;26822:4;26860:2;26849:9;26845:18;26837:26;;26909:9;26903:4;26899:20;26895:1;26884:9;26880:17;26873:47;26937:131;27063:4;26937:131;:::i;:::-;26929:139;;26656:419;;;:::o;27081:::-;27247:4;27285:2;27274:9;27270:18;27262:26;;27334:9;27328:4;27324:20;27320:1;27309:9;27305:17;27298:47;27362:131;27488:4;27362:131;:::i;:::-;27354:139;;27081:419;;;:::o;27506:222::-;27599:4;27637:2;27626:9;27622:18;27614:26;;27650:71;27718:1;27707:9;27703:17;27694:6;27650:71;:::i;:::-;27506:222;;;;:::o;27734:129::-;27768:6;27795:20;;:::i;:::-;27785:30;;27824:33;27852:4;27844:6;27824:33;:::i;:::-;27734:129;;;:::o;27869:75::-;27902:6;27935:2;27929:9;27919:19;;27869:75;:::o;27950:307::-;28011:4;28101:18;28093:6;28090:30;28087:56;;;28123:18;;:::i;:::-;28087:56;28161:29;28183:6;28161:29;:::i;:::-;28153:37;;28245:4;28239;28235:15;28227:23;;27950:307;;;:::o;28263:308::-;28325:4;28415:18;28407:6;28404:30;28401:56;;;28437:18;;:::i;:::-;28401:56;28475:29;28497:6;28475:29;:::i;:::-;28467:37;;28559:4;28553;28549:15;28541:23;;28263:308;;;:::o;28577:98::-;28628:6;28662:5;28656:12;28646:22;;28577:98;;;:::o;28681:99::-;28733:6;28767:5;28761:12;28751:22;;28681:99;;;:::o;28786:168::-;28869:11;28903:6;28898:3;28891:19;28943:4;28938:3;28934:14;28919:29;;28786:168;;;;:::o;28960:169::-;29044:11;29078:6;29073:3;29066:19;29118:4;29113:3;29109:14;29094:29;;28960:169;;;;:::o;29135:148::-;29237:11;29274:3;29259:18;;29135:148;;;;:::o;29289:305::-;29329:3;29348:20;29366:1;29348:20;:::i;:::-;29343:25;;29382:20;29400:1;29382:20;:::i;:::-;29377:25;;29536:1;29468:66;29464:74;29461:1;29458:81;29455:107;;;29542:18;;:::i;:::-;29455:107;29586:1;29583;29579:9;29572:16;;29289:305;;;;:::o;29600:185::-;29640:1;29657:20;29675:1;29657:20;:::i;:::-;29652:25;;29691:20;29709:1;29691:20;:::i;:::-;29686:25;;29730:1;29720:35;;29735:18;;:::i;:::-;29720:35;29777:1;29774;29770:9;29765:14;;29600:185;;;;:::o;29791:348::-;29831:7;29854:20;29872:1;29854:20;:::i;:::-;29849:25;;29888:20;29906:1;29888:20;:::i;:::-;29883:25;;30076:1;30008:66;30004:74;30001:1;29998:81;29993:1;29986:9;29979:17;29975:105;29972:131;;;30083:18;;:::i;:::-;29972:131;30131:1;30128;30124:9;30113:20;;29791:348;;;;:::o;30145:191::-;30185:4;30205:20;30223:1;30205:20;:::i;:::-;30200:25;;30239:20;30257:1;30239:20;:::i;:::-;30234:25;;30278:1;30275;30272:8;30269:34;;;30283:18;;:::i;:::-;30269:34;30328:1;30325;30321:9;30313:17;;30145:191;;;;:::o;30342:96::-;30379:7;30408:24;30426:5;30408:24;:::i;:::-;30397:35;;30342:96;;;:::o;30444:90::-;30478:7;30521:5;30514:13;30507:21;30496:32;;30444:90;;;:::o;30540:149::-;30576:7;30616:66;30609:5;30605:78;30594:89;;30540:149;;;:::o;30695:126::-;30732:7;30772:42;30765:5;30761:54;30750:65;;30695:126;;;:::o;30827:77::-;30864:7;30893:5;30882:16;;30827:77;;;:::o;30910:154::-;30994:6;30989:3;30984;30971:30;31056:1;31047:6;31042:3;31038:16;31031:27;30910:154;;;:::o;31070:307::-;31138:1;31148:113;31162:6;31159:1;31156:13;31148:113;;;31247:1;31242:3;31238:11;31232:18;31228:1;31223:3;31219:11;31212:39;31184:2;31181:1;31177:10;31172:15;;31148:113;;;31279:6;31276:1;31273:13;31270:101;;;31359:1;31350:6;31345:3;31341:16;31334:27;31270:101;31119:258;31070:307;;;:::o;31383:320::-;31427:6;31464:1;31458:4;31454:12;31444:22;;31511:1;31505:4;31501:12;31532:18;31522:81;;31588:4;31580:6;31576:17;31566:27;;31522:81;31650:2;31642:6;31639:14;31619:18;31616:38;31613:84;;;31669:18;;:::i;:::-;31613:84;31434:269;31383:320;;;:::o;31709:281::-;31792:27;31814:4;31792:27;:::i;:::-;31784:6;31780:40;31922:6;31910:10;31907:22;31886:18;31874:10;31871:34;31868:62;31865:88;;;31933:18;;:::i;:::-;31865:88;31973:10;31969:2;31962:22;31752:238;31709:281;;:::o;31996:233::-;32035:3;32058:24;32076:5;32058:24;:::i;:::-;32049:33;;32104:66;32097:5;32094:77;32091:103;;;32174:18;;:::i;:::-;32091:103;32221:1;32214:5;32210:13;32203:20;;31996:233;;;:::o;32235:79::-;32274:7;32303:5;32292:16;;32235:79;;;:::o;32320:176::-;32352:1;32369:20;32387:1;32369:20;:::i;:::-;32364:25;;32403:20;32421:1;32403:20;:::i;:::-;32398:25;;32442:1;32432:35;;32447:18;;:::i;:::-;32432:35;32488:1;32485;32481:9;32476:14;;32320:176;;;;:::o;32502:180::-;32550:77;32547:1;32540:88;32647:4;32644:1;32637:15;32671:4;32668:1;32661:15;32688:180;32736:77;32733:1;32726:88;32833:4;32830:1;32823:15;32857:4;32854:1;32847:15;32874:180;32922:77;32919:1;32912:88;33019:4;33016:1;33009:15;33043:4;33040:1;33033:15;33060:180;33108:77;33105:1;33098:88;33205:4;33202:1;33195:15;33229:4;33226:1;33219:15;33246:117;33355:1;33352;33345:12;33369:117;33478:1;33475;33468:12;33492:117;33601:1;33598;33591:12;33615:117;33724:1;33721;33714:12;33738:102;33779:6;33830:2;33826:7;33821:2;33814:5;33810:14;33806:28;33796:38;;33738:102;;;:::o;33846:232::-;33986:34;33982:1;33974:6;33970:14;33963:58;34055:15;34050:2;34042:6;34038:15;34031:40;33846:232;:::o;34084:237::-;34224:34;34220:1;34212:6;34208:14;34201:58;34293:20;34288:2;34280:6;34276:15;34269:45;34084:237;:::o;34327:225::-;34467:34;34463:1;34455:6;34451:14;34444:58;34536:8;34531:2;34523:6;34519:15;34512:33;34327:225;:::o;34558:224::-;34698:34;34694:1;34686:6;34682:14;34675:58;34767:7;34762:2;34754:6;34750:15;34743:32;34558:224;:::o;34788:178::-;34928:30;34924:1;34916:6;34912:14;34905:54;34788:178;:::o;34972:223::-;35112:34;35108:1;35100:6;35096:14;35089:58;35181:6;35176:2;35168:6;35164:15;35157:31;34972:223;:::o;35201:175::-;35341:27;35337:1;35329:6;35325:14;35318:51;35201:175;:::o;35382:228::-;35522:34;35518:1;35510:6;35506:14;35499:58;35591:11;35586:2;35578:6;35574:15;35567:36;35382:228;:::o;35616:171::-;35756:23;35752:1;35744:6;35740:14;35733:47;35616:171;:::o;35793:180::-;35933:32;35929:1;35921:6;35917:14;35910:56;35793:180;:::o;35979:182::-;36119:34;36115:1;36107:6;36103:14;36096:58;35979:182;:::o;36167:162::-;36307:14;36303:1;36295:6;36291:14;36284:38;36167:162;:::o;36335:236::-;36475:34;36471:1;36463:6;36459:14;36452:58;36544:19;36539:2;36531:6;36527:15;36520:44;36335:236;:::o;36577:178::-;36717:30;36713:1;36705:6;36701:14;36694:54;36577:178;:::o;36761:182::-;36901:34;36897:1;36889:6;36885:14;36878:58;36761:182;:::o;36949:174::-;37089:26;37085:1;37077:6;37073:14;37066:50;36949:174;:::o;37129:220::-;37269:34;37265:1;37257:6;37253:14;37246:58;37338:3;37333:2;37325:6;37321:15;37314:28;37129:220;:::o;37355:172::-;37495:24;37491:1;37483:6;37479:14;37472:48;37355:172;:::o;37533:248::-;37673:34;37669:1;37661:6;37657:14;37650:58;37742:31;37737:2;37729:6;37725:15;37718:56;37533:248;:::o;37787:122::-;37860:24;37878:5;37860:24;:::i;:::-;37853:5;37850:35;37840:63;;37899:1;37896;37889:12;37840:63;37787:122;:::o;37915:116::-;37985:21;38000:5;37985:21;:::i;:::-;37978:5;37975:32;37965:60;;38021:1;38018;38011:12;37965:60;37915:116;:::o;38037:120::-;38109:23;38126:5;38109:23;:::i;:::-;38102:5;38099:34;38089:62;;38147:1;38144;38137:12;38089:62;38037:120;:::o;38163:122::-;38236:24;38254:5;38236:24;:::i;:::-;38229:5;38226:35;38216:63;;38275:1;38272;38265:12;38216:63;38163:122;:::o
Swarm Source
ipfs://290999af68ea6fd6567ad555fa91319ca9164088757e0e3b0b3d12ecb9cd11c2
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.