Token migration announcement. XPower token contract has migrated to a new address.
[ Download CSV Export ]
OVERVIEW
Staked XPower ODIN NFTs.Contract Name:
XPowerOdinNftStaked
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2022-04-28 */ // Sources flattened with hardhat v2.9.3 https://hardhat.org // SPDX-License-Identifier: GPL-3.0 // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC1155/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC1155/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC1155/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // 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/utils/introspection/[email protected] // 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/ERC1155/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File @openzeppelin/contracts/token/ERC1155/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC1155} that allows token holders to destroy both their * own tokens and those that they have been approved to use. * * _Available since v3.1._ */ abstract contract ERC1155Burnable is ERC1155 { function burn( address account, uint256 id, uint256 value ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved" ); _burn(account, id, value); } function burnBatch( address account, uint256[] memory ids, uint256[] memory values ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved" ); _burnBatch(account, ids, values); } } // File @openzeppelin/contracts/token/ERC1155/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Supply.sol) pragma solidity ^0.8.0; /** * @dev Extension of ERC1155 that adds tracking of total supply per id. * * Useful for scenarios where Fungible and Non-fungible tokens have to be * clearly identified. Note: While a totalSupply of 1 might mean the * corresponding is an NFT, there is no guarantees that no other token with the * same id are not going to be minted. */ abstract contract ERC1155Supply is ERC1155 { mapping(uint256 => uint256) private _totalSupply; /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155Supply.totalSupply(id) > 0; } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] -= amounts[i]; } } } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File contracts/URIMalleable.sol pragma solidity ^0.8.0; /** * Allows changing of the NFT's URI (by only the contract owner), where the URI * should redirect permanently (301) to e.g. a corresponding IPFS address. */ abstract contract URIMalleable is ERC1155, Ownable { function setURI(string memory newuri) public onlyOwner { _setURI(newuri); } } // File contracts/MigratableNft.sol // solhint-disable not-rely-on-time pragma solidity ^0.8.0; /** * Allows migration of NFTs from an old contract; batch migration is also * possible. Further, manually sealing the migration is also possible. */ abstract contract MigratableNft is ERC1155, ERC1155Burnable, Ownable { /** old contract to migrate from */ ERC1155Burnable private _token; /** timestamp of migration deadline */ uint256 private _deadlineBy; /** flag to control migration */ bool private _migratable = true; /** @param base address of old contract */ /** @param deadlineIn seconds to end-of-migration */ constructor(address base, uint256 deadlineIn) { _deadlineBy = block.timestamp + deadlineIn; _token = ERC1155Burnable(base); } /** import NFT from old contract */ function migrate(uint256 nftId, uint256 amount) public { require(_migratable, "migration sealed"); uint256 timestamp = block.timestamp; require(_deadlineBy >= timestamp, "deadline passed"); _token.burn(msg.sender, nftId, amount); require(amount > 0, "non-positive amount"); _mint(msg.sender, nftId, amount, ""); } /** batch import NFTs from old contract */ function migrateBatch(uint256[] memory nftIds, uint256[] memory amounts) public { require(_migratable, "migration sealed"); uint256 timestamp = block.timestamp; require(_deadlineBy >= timestamp, "deadline passed"); _token.burnBatch(msg.sender, nftIds, amounts); for (uint256 i = 0; i < amounts.length; i++) { require(amounts[i] > 0, "non-positive amount"); } _mintBatch(msg.sender, nftIds, amounts, ""); } /** seal migration (manually) */ function seal() public onlyOwner { _migratable = false; } } // File contracts/XPowerNftBase.sol // solhint-disable not-rely-on-time // solhint-disable no-empty-blocks pragma solidity ^0.8.0; /** * Abstract base NFT class: publicly *not* minteable (nor burneable). */ abstract contract XPowerNftBase is ERC1155, ERC1155Burnable, ERC1155Supply, URIMalleable, MigratableNft { /** NFT levels: UNIT, ..., YOTTA *or* higher! */ uint256 public constant UNIT = 0; uint256 public constant KILO = 3; uint256 public constant MEGA = 6; uint256 public constant GIGA = 9; uint256 public constant TERA = 12; uint256 public constant PETA = 15; uint256 public constant EXA = 18; uint256 public constant ZETTA = 21; uint256 public constant YOTTA = 24; /** @param uri meta-data URI */ /** @param base address of old contract */ /** @param deadlineIn seconds to end-of-migration */ constructor( string memory uri, address base, uint256 deadlineIn ) // ERC1155 constructor: meta-data URI ERC1155(uri) // MigratableNft: old contract, rel. deadline [seconds] MigratableNft(base, deadlineIn) {} /** @return nft-id composed of (year, level) */ function idBy(uint256 anno, uint256 level) public pure returns (uint256) { require(level % 3 == 0, "non-ternary level"); require(level < 100, "invalid level"); require(anno > 1970, "invalid year"); return anno * 100 + level; } /** @return nft-ids composed of [(year, level) for level in levels] */ function idsBy(uint256 anno, uint256[] memory levels) public pure returns (uint256[] memory) { uint256[] memory ids = new uint256[](levels.length); for (uint256 i = 0; i < levels.length; i++) { ids[i] = idBy(anno, levels[i]); } return ids; } /** @return denomination of level (1, 1'000, 1'000'000, ...) */ function denominationOf(uint256 level) public pure returns (uint256) { require(level % 3 == 0, "non-ternary level"); require(level < 100, "invalid level"); return 10**level; } /** @return level of nft-id (0, 3, 6, ...) */ function levelOf(uint256 nftId) public pure returns (uint256) { uint256 level = nftId % 100; require(level % 3 == 0, "non-ternary level"); require(level < 100, "invalid level"); return level; } /** @return year of nft-id (2021, 2022, ...) */ function yearOf(uint256 nftId) public pure returns (uint256) { uint256 anno = nftId / 100; require(anno > 1970, "invalid year"); return anno; } /** @return current number of years since anno domini */ function year() public view returns (uint256) { uint256 anno = 1970 + (100 * block.timestamp) / (365_25 days); require(anno > 1970, "invalid year"); return anno; } /** called before any token transfer; includes (batched) minting and burning */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory nftIds, uint256[] memory amounts, bytes memory data ) internal override(ERC1155, ERC1155Supply) { super._beforeTokenTransfer(operator, from, to, nftIds, amounts, data); } } // File contracts/XPowerNftStaked.sol // solhint-disable no-empty-blocks // solhint-disable not-rely-on-time pragma solidity ^0.8.0; /** * Abstract base class for staked XPowerNft(s): Contract owner only is allowed * to mint and burn XPowerNftStaked tokens. */ abstract contract XPowerNftStaked is XPowerNftBase { /** map of mints: account => nft-id => accumulator [seconds] */ mapping(address => mapping(uint256 => uint256)) private _mints; /** map of burns: account => nft-id => accumulator [seconds] */ mapping(address => mapping(uint256 => uint256)) private _burns; /** map of total mints: nft-id => accumulator [seconds] */ mapping(uint256 => uint256) private _mintsTotal; /** map of total burns: nft-id => accumulator [seconds] */ mapping(uint256 => uint256) private _burnsTotal; /** @param uri meta-data URI */ /** @param base address of old contract */ /** @param deadlineIn seconds to end-of-migration */ constructor( string memory uri, address base, uint256 deadlineIn ) XPowerNftBase(uri, base, deadlineIn) {} /** transfer tokens (and reset age) */ function safeTransferFrom( address from, address to, uint256 nftId, uint256 amount, bytes memory data ) public override { _pushBurn(from, nftId, amount); _pushMint(to, nftId, amount); super.safeTransferFrom(from, to, nftId, amount, data); } /** batch transfer tokens (and reset age) */ function safeBatchTransferFrom( address from, address to, uint256[] memory nftIds, uint256[] memory amounts, bytes memory data ) public override { _pushBurnBatch(from, nftIds, amounts); _pushMintBatch(to, nftIds, amounts); super.safeBatchTransferFrom(from, to, nftIds, amounts, data); } /** mint particular amount of staked NFTs for given address and nft-id */ function mint( address to, uint256 nftId, uint256 amount ) public onlyOwner { _pushMint(to, nftId, amount); _mint(to, nftId, amount, ""); } /** mint particular amounts of staked NFTs for given address and nft-ids */ function mintBatch( address to, uint256[] memory nftIds, uint256[] memory amounts ) public onlyOwner { _pushMintBatch(to, nftIds, amounts); _mintBatch(to, nftIds, amounts, ""); } /** burn particular amount of staked NFTs for given address and nft-id */ function burn( address from, uint256 nftId, uint256 amount ) public override onlyOwner { _pushBurn(from, nftId, amount); _burn(from, nftId, amount); } /** burn particular amounts of staked NFTs for given address and nft-ids */ function burnBatch( address from, uint256[] memory nftIds, uint256[] memory amounts ) public override onlyOwner { _pushBurnBatch(from, nftIds, amounts); _burnBatch(from, nftIds, amounts); } /** @return age seconds over all stakes for given address and nft-id */ function ageOf(address account, uint256 nftId) public view returns (uint256) { uint256 mints = _mints[account][nftId]; uint256 burns = _burns[account][nftId]; if (mints > burns) { uint256 balance = balanceOf(account, nftId); uint256 difference = mints - burns; return balance * block.timestamp - difference; } return 0; } /** @return age seconds totalled over all stakes for given nft-id */ function totalAgeOf(uint256 nftId) public view returns (uint256) { uint256 mintsTotal = _mintsTotal[nftId]; uint256 burnsTotal = _burnsTotal[nftId]; if (mintsTotal > burnsTotal) { uint256 supply = totalSupply(nftId); uint256 difference = mintsTotal - burnsTotal; return supply * block.timestamp - difference; } return 0; } /** remember mint action */ function _pushMint( address account, uint256 nftId, uint256 amount ) internal { require(amount > 0, "non-positive amount"); _mints[account][nftId] += amount * block.timestamp; _mintsTotal[nftId] += amount * block.timestamp; } /** remember mint actions */ function _pushMintBatch( address account, uint256[] memory nftIds, uint256[] memory amounts ) internal { assert(nftIds.length == amounts.length); for (uint256 i = 0; i < nftIds.length; i++) { _pushMint(account, nftIds[i], amounts[i]); } } /** remember burn action */ function _pushBurn( address account, uint256 nftId, uint256 amount ) internal { require(amount > 0, "non-positive amount"); _burns[account][nftId] += amount * block.timestamp; _burnsTotal[nftId] += amount * block.timestamp; } /** remember burn actions */ function _pushBurnBatch( address account, uint256[] memory nftIds, uint256[] memory amounts ) internal { assert(nftIds.length == amounts.length); for (uint256 i = 0; i < nftIds.length; i++) { _pushBurn(account, nftIds[i], amounts[i]); } } } /** * Staked NFT class for ODIN tokens. */ contract XPowerOdinNftStaked is XPowerNftStaked { /** @param uri meta-data URI */ /** @param base address of old contract */ /** @param deadlineIn seconds to end-of-migration */ constructor( string memory uri, address base, uint256 deadlineIn ) XPowerNftStaked(uri, base, deadlineIn) {} }
[{"inputs":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"address","name":"base","type":"address"},{"internalType":"uint256","name":"deadlineIn","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"EXA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GIGA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KILO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MEGA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PETA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TERA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YOTTA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZETTA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"ageOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"level","type":"uint256"}],"name":"denominationOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"anno","type":"uint256"},{"internalType":"uint256","name":"level","type":"uint256"}],"name":"idBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"anno","type":"uint256"},{"internalType":"uint256[]","name":"levels","type":"uint256[]"}],"name":"idsBy","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"levelOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"migrateBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"totalAgeOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"year","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"yearOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
60806040526007805460ff191660011790553480156200001e57600080fd5b506040516200311b3803806200311b8339810160408190526200004191620001e5565b8282828282828181846200005581620000a1565b506200006133620000ba565b6200006d8142620002df565b60065550600580546001600160a01b0319166001600160a01b03929092169190911790555062000343975050505050505050565b8051620000b69060029060208401906200010c565b5050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200011a9062000306565b90600052602060002090601f0160209004810192826200013e576000855562000189565b82601f106200015957805160ff191683800117855562000189565b8280016001018555821562000189579182015b82811115620001895782518255916020019190600101906200016c565b50620001979291506200019b565b5090565b5b808211156200019757600081556001016200019c565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b0381168114620001e057600080fd5b919050565b600080600060608486031215620001fb57600080fd5b83516001600160401b03808211156200021357600080fd5b818601915086601f8301126200022857600080fd5b8151818111156200023d576200023d620001b2565b604051601f8201601f19908116603f01168101908382118183101715620002685762000268620001b2565b816040528281526020935089848487010111156200028557600080fd5b600091505b82821015620002a957848201840151818301850152908301906200028a565b82821115620002bb5760008484830101525b9650620002cd915050868201620001c8565b93505050604084015190509250925092565b600082198211156200030157634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200031b57607f821691505b602082108114156200033d57634e487b7160e01b600052602260045260246000fd5b50919050565b612dc880620003536000396000f3fe608060405234801561001057600080fd5b50600436106102315760003560e01c80636d5e303211610130578063c7b8b19d116100b8578063e985e9c51161007c578063e985e9c514610493578063f242432a146104cf578063f2fde38b146104e2578063f3269716146104f5578063f5298aca146104fd57600080fd5b8063c7b8b19d14610455578063cb431e7614610468578063d5e5e06214610470578063d81d0a1514610478578063df435be81461048b57600080fd5b80639d8e2177116100ff5780639d8e2177146103ff578063a22cb46514610407578063a62c77991461041a578063bd85b0391461042d578063c446d5501461044d57600080fd5b80636d5e3032146103c1578063715018a6146103d457806389c3cbae146103dc5780638da5cb5b146103e457600080fd5b8063361ce97e116101be57806355095bd21161018257806355095bd2146103785780635925e2111461038b5780636252e4e7146103935780636b20c454146103a65780636c749c26146103b957600080fd5b8063361ce97e146103135780633e54bacb1461031b5780633fb27b851461032e5780634e1273f4146103365780634f558e791461035657600080fd5b8063156e29f611610205578063156e29f6146102b45780631c617230146102c757806329cd827d146102da5780632eb2c2d6146102ed5780632ffa2d761461030057600080fd5b8062fdd58e1461023657806301ffc9a71461025c57806302fe53051461027f5780630e89341c14610294575b600080fd5b61024961024436600461207c565b610510565b6040519081526020015b60405180910390f35b61026f61026a3660046120bc565b6105aa565b6040519015158152602001610253565b61029261028d366004612178565b6105fa565b005b6102a76102a23660046121c8565b610630565b604051610253919061222e565b6102926102c2366004612241565b6106c4565b6102496102d53660046121c8565b610719565b6102496102e83660046121c8565b610780565b6102926102fb366004612328565b6107d5565b61029261030e3660046123d1565b6107ff565b610249600381565b610292610329366004612434565b610963565b610292610a94565b610349610344366004612456565b610aca565b6040516102539190612544565b61026f6103643660046121c8565b600090815260036020526040902054151590565b6102496103863660046121c8565b610bf3565b610249601581565b6102496103a1366004612434565b610c24565b6102926103b4366004612557565b610cac565b610249601281565b6102496103cf3660046121c8565b610cec565b610292610d44565b610249600c81565b6004546040516001600160a01b039091168152602001610253565b610249600081565b6102926104153660046125ca565b610d7a565b61024961042836600461207c565b610d89565b61024961043b3660046121c8565b60009081526003602052604090205490565b610249600981565b610349610463366004612606565b610e12565b610249600681565b610249601881565b610292610486366004612557565b610eb9565b610249600f81565b61026f6104a1366004612642565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6102926104dd366004612675565b610f09565b6102926104f03660046126d9565b610f2c565b610249610fc4565b61029261050b366004612241565b611015565b60006001600160a01b0383166105815760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b14806105db57506001600160e01b031982166303a24d0760e21b145b806105a457506301ffc9a760e01b6001600160e01b03198316146105a4565b6004546001600160a01b031633146106245760405162461bcd60e51b8152600401610578906126f4565b61062d81611055565b50565b60606002805461063f90612729565b80601f016020809104026020016040519081016040528092919081815260200182805461066b90612729565b80156106b85780601f1061068d576101008083540402835291602001916106b8565b820191906000526020600020905b81548152906001019060200180831161069b57829003601f168201915b50505050509050919050565b6004546001600160a01b031633146106ee5760405162461bcd60e51b8152600401610578906126f4565b6106f9838383611068565b610714838383604051806020016040528060008152506110fd565b505050565b6000818152600a6020908152604080832054600b909252822054808211156107765760008481526003602052604081205490610755838561277a565b9050806107624284612791565b61076c919061277a565b9695505050505050565b5060009392505050565b600061078d6003836127c6565b156107aa5760405162461bcd60e51b8152600401610578906127da565b606482106107ca5760405162461bcd60e51b815260040161057890612805565b6105a482600a612910565b6107e08584846111d3565b6107eb848484611245565b6107f885858585856112b1565b5050505050565b60075460ff166108445760405162461bcd60e51b815260206004820152601060248201526f1b5a59dc985d1a5bdb881cd9585b195960821b6044820152606401610578565b600654429081111561088a5760405162461bcd60e51b815260206004820152600f60248201526e191958591b1a5b99481c185cdcd959608a1b6044820152606401610578565b600554604051631ac8311560e21b81526001600160a01b0390911690636b20c454906108be9033908790879060040161291c565b600060405180830381600087803b1580156108d857600080fd5b505af11580156108ec573d6000803e3d6000fd5b5050505060005b825181101561094757600083828151811061091057610910612952565b6020026020010151116109355760405162461bcd60e51b815260040161057890612968565b8061093f81612995565b9150506108f3565b5061071433848460405180602001604052806000815250611341565b60075460ff166109a85760405162461bcd60e51b815260206004820152601060248201526f1b5a59dc985d1a5bdb881cd9585b195960821b6044820152606401610578565b60065442908111156109ee5760405162461bcd60e51b815260206004820152600f60248201526e191958591b1a5b99481c185cdcd959608a1b6044820152606401610578565b600554604051637a94c56560e11b815233600482015260248101859052604481018490526001600160a01b039091169063f5298aca90606401600060405180830381600087803b158015610a4157600080fd5b505af1158015610a55573d6000803e3d6000fd5b5050505060008211610a795760405162461bcd60e51b815260040161057890612968565b610714338484604051806020016040528060008152506110fd565b6004546001600160a01b03163314610abe5760405162461bcd60e51b8152600401610578906126f4565b6007805460ff19169055565b60608151835114610b2f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610578565b600083516001600160401b03811115610b4a57610b4a6120d9565b604051908082528060200260200182016040528015610b73578160200160208202803683370190505b50905060005b8451811015610beb57610bbe858281518110610b9757610b97612952565b6020026020010151858381518110610bb157610bb1612952565b6020026020010151610510565b828281518110610bd057610bd0612952565b6020908102919091010152610be481612995565b9050610b79565b509392505050565b600080610c016064846129b0565b90506107b281116105a45760405162461bcd60e51b8152600401610578906129c4565b6000610c316003836127c6565b15610c4e5760405162461bcd60e51b8152600401610578906127da565b60648210610c6e5760405162461bcd60e51b815260040161057890612805565b6107b28311610c8f5760405162461bcd60e51b8152600401610578906129c4565b81610c9b846064612791565b610ca591906129ea565b9392505050565b6004546001600160a01b03163314610cd65760405162461bcd60e51b8152600401610578906126f4565b610ce18383836111d3565b61071483838361149b565b600080610cfa6064846127c6565b9050610d076003826127c6565b15610d245760405162461bcd60e51b8152600401610578906127da565b606481106105a45760405162461bcd60e51b815260040161057890612805565b6004546001600160a01b03163314610d6e5760405162461bcd60e51b8152600401610578906126f4565b610d786000611629565b565b610d8533838361167b565b5050565b6001600160a01b03821660008181526008602090815260408083208584528252808320549383526009825280832085845290915281205490919080821115610e07576000610dd78686610510565b90506000610de5838561277a565b905080610df24284612791565b610dfc919061277a565b9450505050506105a4565b506000949350505050565b6060600082516001600160401b03811115610e2f57610e2f6120d9565b604051908082528060200260200182016040528015610e58578160200160208202803683370190505b50905060005b8351811015610beb57610e8a85858381518110610e7d57610e7d612952565b6020026020010151610c24565b828281518110610e9c57610e9c612952565b602090810291909101015280610eb181612995565b915050610e5e565b6004546001600160a01b03163314610ee35760405162461bcd60e51b8152600401610578906126f4565b610eee838383611245565b61071483838360405180602001604052806000815250611341565b610f1485848461175c565b610f1f848484611068565b6107f885858585856117e7565b6004546001600160a01b03163314610f565760405162461bcd60e51b8152600401610578906126f4565b6001600160a01b038116610fbb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610578565b61062d81611629565b60008063bc191380610fd7426064612791565b610fe191906129b0565b610fed906107b26129ea565b90506107b281116110105760405162461bcd60e51b8152600401610578906129c4565b919050565b6004546001600160a01b0316331461103f5760405162461bcd60e51b8152600401610578906126f4565b61104a83838361175c565b61071483838361186e565b8051610d85906002906020840190611fcc565b600081116110885760405162461bcd60e51b815260040161057890612968565b6110924282612791565b6001600160a01b0384166000908152600860209081526040808320868452909152812080549091906110c59084906129ea565b909155506110d590504282612791565b6000838152600a6020526040812080549091906110f39084906129ea565b9091555050505050565b6001600160a01b0384166111235760405162461bcd60e51b815260040161057890612a02565b33611143816000876111348861196f565b61113d8861196f565b876119ba565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906111739084906129ea565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46107f8816000878787876119d0565b80518251146111e4576111e4612a43565b60005b825181101561123f5761122d8484838151811061120657611206612952565b602002602001015184848151811061122057611220612952565b602002602001015161175c565b8061123781612995565b9150506111e7565b50505050565b805182511461125657611256612a43565b60005b825181101561123f5761129f8484838151811061127857611278612952565b602002602001015184848151811061129257611292612952565b6020026020010151611068565b806112a981612995565b915050611259565b6001600160a01b0385163314806112cd57506112cd85336104a1565b6113345760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610578565b6107f88585858585611b44565b6001600160a01b0384166113675760405162461bcd60e51b815260040161057890612a02565b81518351146113885760405162461bcd60e51b815260040161057890612a59565b33611398816000878787876119ba565b60005b8451811015611433578381815181106113b6576113b6612952565b60200260200101516000808784815181106113d3576113d3612952565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b03168152602001908152602001600020600082825461141b91906129ea565b9091555081905061142b81612995565b91505061139b565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611484929190612aa1565b60405180910390a46107f881600087878787611ce2565b6001600160a01b0383166114c15760405162461bcd60e51b815260040161057890612acf565b80518251146114e25760405162461bcd60e51b815260040161057890612a59565b6000339050611505818560008686604051806020016040528060008152506119ba565b60005b83518110156115ca57600084828151811061152557611525612952565b60200260200101519050600084838151811061154357611543612952565b602090810291909101810151600084815280835260408082206001600160a01b038c1683529093529190912054909150818110156115935760405162461bcd60e51b815260040161057890612b12565b6000928352602083815260408085206001600160a01b038b16865290915290922091039055806115c281612995565b915050611508565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161161b929190612aa1565b60405180910390a450505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156116ef5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610578565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6000811161177c5760405162461bcd60e51b815260040161057890612968565b6117864282612791565b6001600160a01b0384166000908152600960209081526040808320868452909152812080549091906117b99084906129ea565b909155506117c990504282612791565b6000838152600b6020526040812080549091906110f39084906129ea565b6001600160a01b038516331480611803575061180385336104a1565b6118615760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610578565b6107f88585858585611dac565b6001600160a01b0383166118945760405162461bcd60e51b815260040161057890612acf565b336118c3818560006118a58761196f565b6118ae8761196f565b604051806020016040528060008152506119ba565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156119045760405162461bcd60e51b815260040161057890612b12565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106119a9576119a9612952565b602090810291909101015292915050565b6119c8868686868686611ec0565b505050505050565b6001600160a01b0384163b156119c85760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611a149089908990889088908890600401612b56565b602060405180830381600087803b158015611a2e57600080fd5b505af1925050508015611a5e575060408051601f3d908101601f19168201909252611a5b91810190612b9b565b60015b611b0b57611a6a612bb8565b806308c379a01415611aa45750611a7f612bd4565b80611a8a5750611aa6565b8060405162461bcd60e51b8152600401610578919061222e565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610578565b6001600160e01b0319811663f23a6e6160e01b14611b3b5760405162461bcd60e51b815260040161057890612c5d565b50505050505050565b8151835114611b655760405162461bcd60e51b815260040161057890612a59565b6001600160a01b038416611b8b5760405162461bcd60e51b815260040161057890612ca5565b33611b9a8187878787876119ba565b60005b8451811015611c80576000858281518110611bba57611bba612952565b602002602001015190506000858381518110611bd857611bd8612952565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015611c285760405162461bcd60e51b815260040161057890612cea565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611c659084906129ea565b9250508190555050505080611c7990612995565b9050611b9d565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611cd0929190612aa1565b60405180910390a46119c88187878787875b6001600160a01b0384163b156119c85760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611d269089908990889088908890600401612d34565b602060405180830381600087803b158015611d4057600080fd5b505af1925050508015611d70575060408051601f3d908101601f19168201909252611d6d91810190612b9b565b60015b611d7c57611a6a612bb8565b6001600160e01b0319811663bc197c8160e01b14611b3b5760405162461bcd60e51b815260040161057890612c5d565b6001600160a01b038416611dd25760405162461bcd60e51b815260040161057890612ca5565b33611de28187876111348861196f565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611e235760405162461bcd60e51b815260040161057890612cea565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611e609084906129ea565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611b3b8288888888886119d0565b6001600160a01b038516611f475760005b8351811015611f4557828181518110611eec57611eec612952565b602002602001015160036000868481518110611f0a57611f0a612952565b602002602001015181526020019081526020016000206000828254611f2f91906129ea565b90915550611f3e905081612995565b9050611ed1565b505b6001600160a01b0384166119c85760005b8351811015611b3b57828181518110611f7357611f73612952565b602002602001015160036000868481518110611f9157611f91612952565b602002602001015181526020019081526020016000206000828254611fb6919061277a565b90915550611fc5905081612995565b9050611f58565b828054611fd890612729565b90600052602060002090601f016020900481019282611ffa5760008555612040565b82601f1061201357805160ff1916838001178555612040565b82800160010185558215612040579182015b82811115612040578251825591602001919060010190612025565b5061204c929150612050565b5090565b5b8082111561204c5760008155600101612051565b80356001600160a01b038116811461101057600080fd5b6000806040838503121561208f57600080fd5b61209883612065565b946020939093013593505050565b6001600160e01b03198116811461062d57600080fd5b6000602082840312156120ce57600080fd5b8135610ca5816120a6565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715612114576121146120d9565b6040525050565b60006001600160401b03831115612134576121346120d9565b60405161214b601f8501601f1916602001826120ef565b80915083815284848401111561216057600080fd5b83836020830137600060208583010152509392505050565b60006020828403121561218a57600080fd5b81356001600160401b038111156121a057600080fd5b8201601f810184136121b157600080fd5b6121c08482356020840161211b565b949350505050565b6000602082840312156121da57600080fd5b5035919050565b6000815180845260005b81811015612207576020818501810151868301820152016121eb565b81811115612219576000602083870101525b50601f01601f19169290920160200192915050565b602081526000610ca560208301846121e1565b60008060006060848603121561225657600080fd5b61225f84612065565b95602085013595506040909401359392505050565b60006001600160401b0382111561228d5761228d6120d9565b5060051b60200190565b600082601f8301126122a857600080fd5b813560206122b582612274565b6040516122c282826120ef565b83815260059390931b85018201928281019150868411156122e257600080fd5b8286015b848110156122fd57803583529183019183016122e6565b509695505050505050565b600082601f83011261231957600080fd5b610ca58383356020850161211b565b600080600080600060a0868803121561234057600080fd5b61234986612065565b945061235760208701612065565b935060408601356001600160401b038082111561237357600080fd5b61237f89838a01612297565b9450606088013591508082111561239557600080fd5b6123a189838a01612297565b935060808801359150808211156123b757600080fd5b506123c488828901612308565b9150509295509295909350565b600080604083850312156123e457600080fd5b82356001600160401b03808211156123fb57600080fd5b61240786838701612297565b9350602085013591508082111561241d57600080fd5b5061242a85828601612297565b9150509250929050565b6000806040838503121561244757600080fd5b50508035926020909101359150565b6000806040838503121561246957600080fd5b82356001600160401b038082111561248057600080fd5b818501915085601f83011261249457600080fd5b813560206124a182612274565b6040516124ae82826120ef565b83815260059390931b85018201928281019150898411156124ce57600080fd5b948201945b838610156124f3576124e486612065565b825294820194908201906124d3565b9650508601359250508082111561241d57600080fd5b600081518084526020808501945080840160005b838110156125395781518752958201959082019060010161251d565b509495945050505050565b602081526000610ca56020830184612509565b60008060006060848603121561256c57600080fd5b61257584612065565b925060208401356001600160401b038082111561259157600080fd5b61259d87838801612297565b935060408601359150808211156125b357600080fd5b506125c086828701612297565b9150509250925092565b600080604083850312156125dd57600080fd5b6125e683612065565b9150602083013580151581146125fb57600080fd5b809150509250929050565b6000806040838503121561261957600080fd5b8235915060208301356001600160401b0381111561263657600080fd5b61242a85828601612297565b6000806040838503121561265557600080fd5b61265e83612065565b915061266c60208401612065565b90509250929050565b600080600080600060a0868803121561268d57600080fd5b61269686612065565b94506126a460208701612065565b9350604086013592506060860135915060808601356001600160401b038111156126cd57600080fd5b6123c488828901612308565b6000602082840312156126eb57600080fd5b610ca582612065565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061273d57607f821691505b6020821081141561275e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561278c5761278c612764565b500390565b60008160001904831182151516156127ab576127ab612764565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826127d5576127d56127b0565b500690565b6020808252601190820152701b9bdb8b5d195c9b985c9e481b195d995b607a1b604082015260600190565b6020808252600d908201526c1a5b9d985b1a59081b195d995b609a1b604082015260600190565b600181815b8085111561286757816000190482111561284d5761284d612764565b8085161561285a57918102915b93841c9390800290612831565b509250929050565b60008261287e575060016105a4565b8161288b575060006105a4565b81600181146128a157600281146128ab576128c7565b60019150506105a4565b60ff8411156128bc576128bc612764565b50506001821b6105a4565b5060208310610133831016604e8410600b84101617156128ea575081810a6105a4565b6128f4838361282c565b806000190482111561290857612908612764565b029392505050565b6000610ca5838361286f565b6001600160a01b038416815260606020820181905260009061294090830185612509565b828103604084015261076c8185612509565b634e487b7160e01b600052603260045260246000fd5b6020808252601390820152721b9bdb8b5c1bdcda5d1a5d9948185b5bdd5b9d606a1b604082015260600190565b60006000198214156129a9576129a9612764565b5060010190565b6000826129bf576129bf6127b0565b500490565b6020808252600c908201526b34b73b30b634b2103cb2b0b960a11b604082015260600190565b600082198211156129fd576129fd612764565b500190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b604081526000612ab46040830185612509565b8281036020840152612ac68185612509565b95945050505050565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612b90908301846121e1565b979650505050505050565b600060208284031215612bad57600080fd5b8151610ca5816120a6565b600060033d1115612bd15760046000803e5060005160e01c5b90565b600060443d1015612be25790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715612c1157505050505090565b8285019150815181811115612c295750505050505090565b843d8701016020828501011115612c435750505050505090565b612c52602082860101876120ef565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090612d6090830186612509565b8281036060840152612d728186612509565b90508281036080840152612d8681856121e1565b9897505050505050505056fea2646970667358221220220d20f06fc8848e4b7997d9e1bfc69a49876f9532ba3b5a70c65e066b5e5d7864736f6c63430008090033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007861f80000000000000000000000000000000000000000000000000000000000000002e68747470733a2f2f7777772e78706f7765726d696e652e636f6d2f707074732f6f64696e2f7b69647d2e6a736f6e000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007861f80000000000000000000000000000000000000000000000000000000000000002e68747470733a2f2f7777772e78706f7765726d696e652e636f6d2f707074732f6f64696e2f7b69647d2e6a736f6e000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : uri (string): https://www.xpowermine.com/ppts/odin/{id}.json
Arg [1] : base (address): 0x0000000000000000000000000000000000000000
Arg [2] : deadlineIn (uint256): 126230400
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000007861f80
Arg [3] : 000000000000000000000000000000000000000000000000000000000000002e
Arg [4] : 68747470733a2f2f7777772e78706f7765726d696e652e636f6d2f707074732f
Arg [5] : 6f64696e2f7b69647d2e6a736f6e000000000000000000000000000000000000
Deployed ByteCode Sourcemap
51151:341:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20944:231;;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;20944:231:0;;;;;;;;19967:310;;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;19967:310:0;1019:187:1;40182:89:0;;;;;;:::i;:::-;;:::i;:::-;;20688:105;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;47593:194::-;;;;;;:::i;:::-;;:::i;49311:411::-;;;;;;:::i;:::-;;:::i;44141:207::-;;;;;;:::i;:::-;;:::i;47138:368::-;;;;;;:::i;:::-;;:::i;41579:486::-;;;;;;:::i;:::-;;:::i;42613:32::-;;42644:1;42613:32;;41151:372;;;;;;:::i;:::-;;:::i;42111:71::-;;;:::i;21341:524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;36503:122::-;;;;;;:::i;:::-;36560:4;36381:16;;;:12;:16;;;;;;-1:-1:-1;;;36503:122:0;44702:175;;;;;;:::i;:::-;;:::i;42849:34::-;;42881:2;42849:34;;43418:267;;;;;;:::i;:::-;;:::i;48490:244::-;;;;;;:::i;:::-;;:::i;42810:32::-;;42840:2;42810:32;;44407:234;;;;;;:::i;:::-;;:::i;39075:103::-;;;:::i;42730:33::-;;42761:2;42730:33;;38424:87;38497:6;;38424:87;;-1:-1:-1;;;;;38497:6:0;;;9424:51:1;;9412:2;9397:18;38424:87:0;9278:203:1;42574:32:0;;42605:1;42574:32;;21938:155;;;;;;:::i;:::-;;:::i;48819:410::-;;;;;;:::i;:::-;;:::i;36292:113::-;;;;;;:::i;:::-;36354:7;36381:16;;;:12;:16;;;;;;;36292:113;42691:32;;42722:1;42691:32;;43769:295;;;;;;:::i;:::-;;:::i;42652:32::-;;42683:1;42652:32;;42890:34;;42922:2;42890:34;;47876:233;;;;;;:::i;:::-;;:::i;42770:33::-;;42801:2;42770:33;;22165:168;;;;;;:::i;:::-;-1:-1:-1;;;;;22288:27:0;;;22264:4;22288:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;22165:168;46758:322;;;;;;:::i;:::-;;:::i;39333:201::-;;;;;;:::i;:::-;;:::i;44947:195::-;;;:::i;48196:205::-;;;;;;:::i;:::-;;:::i;20944:231::-;21030:7;-1:-1:-1;;;;;21058:21:0;;21050:77;;;;-1:-1:-1;;;21050:77:0;;11528:2:1;21050:77:0;;;11510:21:1;11567:2;11547:18;;;11540:30;11606:34;11586:18;;;11579:62;-1:-1:-1;;;11657:18:1;;;11650:41;11708:19;;21050:77:0;;;;;;;;;-1:-1:-1;21145:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;21145:22:0;;;;;;;;;;20944:231;;;;;:::o;19967:310::-;20069:4;-1:-1:-1;;;;;;20106:41:0;;-1:-1:-1;;;20106:41:0;;:110;;-1:-1:-1;;;;;;;20164:52:0;;-1:-1:-1;;;20164:52:0;20106:110;:163;;;-1:-1:-1;;;;;;;;;;18845:40:0;;;20233:36;18736:157;40182:89;38497:6;;-1:-1:-1;;;;;38497:6:0;17737:10;38644:23;38636:68;;;;-1:-1:-1;;;38636:68:0;;;;;;;:::i;:::-;40248:15:::1;40256:6;40248:7;:15::i;:::-;40182:89:::0;:::o;20688:105::-;20748:13;20781:4;20774:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20688:105;;;:::o;47593:194::-;38497:6;;-1:-1:-1;;;;;38497:6:0;17737:10;38644:23;38636:68;;;;-1:-1:-1;;;38636:68:0;;;;;;;:::i;:::-;47712:28:::1;47722:2;47726:5;47733:6;47712:9;:28::i;:::-;47751;47757:2;47761:5;47768:6;47751:28;;;;;;;;;;;::::0;:5:::1;:28::i;:::-;47593:194:::0;;;:::o;49311:411::-;49367:7;49408:18;;;:11;:18;;;;;;;;;49458:11;:18;;;;;;49491:23;;;49487:209;;;49531:14;36381:16;;;:12;:16;;;;;;;49602:23;49615:10;49602;:23;:::i;:::-;49581:44;-1:-1:-1;49581:44:0;49647:24;49656:15;49647:6;:24;:::i;:::-;:37;;;;:::i;:::-;49640:44;49311:411;-1:-1:-1;;;;;;49311:411:0:o;49487:209::-;-1:-1:-1;49713:1:0;;49311:411;-1:-1:-1;;;49311:411:0:o;44141:207::-;44201:7;44229:9;44237:1;44229:5;:9;:::i;:::-;:14;44221:44;;;;-1:-1:-1;;;44221:44:0;;;;;;;:::i;:::-;44292:3;44284:5;:11;44276:37;;;;-1:-1:-1;;;44276:37:0;;;;;;;:::i;:::-;44331:9;44335:5;44331:2;:9;:::i;47138:368::-;47344:37;47359:4;47365:6;47373:7;47344:14;:37::i;:::-;47392:35;47407:2;47411:6;47419:7;47392:14;:35::i;:::-;47438:60;47466:4;47472:2;47476:6;47484:7;47493:4;47438:27;:60::i;:::-;47138:368;;;;;:::o;41579:486::-;41678:11;;;;41670:40;;;;-1:-1:-1;;;41670:40:0;;15432:2:1;41670:40:0;;;15414:21:1;15471:2;15451:18;;;15444:30;-1:-1:-1;;;15490:18:1;;;15483:46;15546:18;;41670:40:0;15230:340:1;41670:40:0;41775:11;;41741:15;;41775:24;-1:-1:-1;41775:24:0;41767:52;;;;-1:-1:-1;;;41767:52:0;;15777:2:1;41767:52:0;;;15759:21:1;15816:2;15796:18;;;15789:30;-1:-1:-1;;;15835:18:1;;;15828:45;15890:18;;41767:52:0;15575:339:1;41767:52:0;41830:6;;:45;;-1:-1:-1;;;41830:45:0;;-1:-1:-1;;;;;41830:6:0;;;;:16;;:45;;41847:10;;41859:6;;41867:7;;41830:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41891:9;41886:118;41910:7;:14;41906:1;:18;41886:118;;;41967:1;41954:7;41962:1;41954:10;;;;;;;;:::i;:::-;;;;;;;:14;41946:46;;;;-1:-1:-1;;;41946:46:0;;;;;;;:::i;:::-;41926:3;;;;:::i;:::-;;;;41886:118;;;;42014:43;42025:10;42037:6;42045:7;42014:43;;;;;;;;;;;;:10;:43::i;41151:372::-;41225:11;;;;41217:40;;;;-1:-1:-1;;;41217:40:0;;15432:2:1;41217:40:0;;;15414:21:1;15471:2;15451:18;;;15444:30;-1:-1:-1;;;15490:18:1;;;15483:46;15546:18;;41217:40:0;15230:340:1;41217:40:0;41322:11;;41288:15;;41322:24;-1:-1:-1;41322:24:0;41314:52;;;;-1:-1:-1;;;41314:52:0;;15777:2:1;41314:52:0;;;15759:21:1;15816:2;15796:18;;;15789:30;-1:-1:-1;;;15835:18:1;;;15828:45;15890:18;;41314:52:0;15575:339:1;41314:52:0;41377:6;;:38;;-1:-1:-1;;;41377:38:0;;41389:10;41377:38;;;17308:51:1;17375:18;;;17368:34;;;17418:18;;;17411:34;;;-1:-1:-1;;;;;41377:6:0;;;;:11;;17281:18:1;;41377:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41443:1;41434:6;:10;41426:42;;;;-1:-1:-1;;;41426:42:0;;;;;;;:::i;:::-;41479:36;41485:10;41497:5;41504:6;41479:36;;;;;;;;;;;;:5;:36::i;42111:71::-;38497:6;;-1:-1:-1;;;;;38497:6:0;17737:10;38644:23;38636:68;;;;-1:-1:-1;;;38636:68:0;;;;;;;:::i;:::-;42155:11:::1;:19:::0;;-1:-1:-1;;42155:19:0::1;::::0;;42111:71::o;21341:524::-;21497:16;21558:3;:10;21539:8;:15;:29;21531:83;;;;-1:-1:-1;;;21531:83:0;;17658:2:1;21531:83:0;;;17640:21:1;17697:2;17677:18;;;17670:30;17736:34;17716:18;;;17709:62;-1:-1:-1;;;17787:18:1;;;17780:39;17836:19;;21531:83:0;17456:405:1;21531:83:0;21627:30;21674:8;:15;-1:-1:-1;;;;;21660:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21660:30:0;;21627:63;;21708:9;21703:122;21727:8;:15;21723:1;:19;21703:122;;;21783:30;21793:8;21802:1;21793:11;;;;;;;;:::i;:::-;;;;;;;21806:3;21810:1;21806:6;;;;;;;;:::i;:::-;;;;;;;21783:9;:30::i;:::-;21764:13;21778:1;21764:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;21744:3;;;:::i;:::-;;;21703:122;;;-1:-1:-1;21844:13:0;21341:524;-1:-1:-1;;;21341:524:0:o;44702:175::-;44754:7;;44789:11;44797:3;44789:5;:11;:::i;:::-;44774:26;;44826:4;44819;:11;44811:36;;;;-1:-1:-1;;;44811:36:0;;;;;;;:::i;43418:267::-;43482:7;43510:9;43518:1;43510:5;:9;:::i;:::-;:14;43502:44;;;;-1:-1:-1;;;43502:44:0;;;;;;;:::i;:::-;43573:3;43565:5;:11;43557:37;;;;-1:-1:-1;;;43557:37:0;;;;;;;:::i;:::-;43620:4;43613;:11;43605:36;;;;-1:-1:-1;;;43605:36:0;;;;;;;:::i;:::-;43672:5;43659:10;:4;43666:3;43659:10;:::i;:::-;:18;;;;:::i;:::-;43652:25;43418:267;-1:-1:-1;;;43418:267:0:o;48490:244::-;38497:6;;-1:-1:-1;;;;;38497:6:0;17737:10;38644:23;38636:68;;;;-1:-1:-1;;;38636:68:0;;;;;;;:::i;:::-;48645:37:::1;48660:4;48666:6;48674:7;48645:14;:37::i;:::-;48693:33;48704:4;48710:6;48718:7;48693:10;:33::i;44407:234::-:0;44460:7;;44496:11;44504:3;44496:5;:11;:::i;:::-;44480:27;-1:-1:-1;44526:9:0;44534:1;44480:27;44526:9;:::i;:::-;:14;44518:44;;;;-1:-1:-1;;;44518:44:0;;;;;;;:::i;:::-;44589:3;44581:5;:11;44573:37;;;;-1:-1:-1;;;44573:37:0;;;;;;;:::i;39075:103::-;38497:6;;-1:-1:-1;;;;;38497:6:0;17737:10;38644:23;38636:68;;;;-1:-1:-1;;;38636:68:0;;;;;;;:::i;:::-;39140:30:::1;39167:1;39140:18;:30::i;:::-;39075:103::o:0;21938:155::-;22033:52;17737:10;22066:8;22076;22033:18;:52::i;:::-;21938:155;;:::o;48819:410::-;-1:-1:-1;;;;;48923:15:0;;48887:7;48923:15;;;:6;:15;;;;;;;;:22;;;;;;;;;48972:15;;;:6;:15;;;;;:22;;;;;;;;;48887:7;;48923:22;49009:13;;;49005:198;;;49039:15;49057:25;49067:7;49076:5;49057:9;:25::i;:::-;49039:43;-1:-1:-1;49097:18:0;49118:13;49126:5;49118;:13;:::i;:::-;49097:34;-1:-1:-1;49097:34:0;49153:25;49163:15;49153:7;:25;:::i;:::-;:38;;;;:::i;:::-;49146:45;;;;;;;;49005:198;-1:-1:-1;49220:1:0;;48819:410;-1:-1:-1;;;;48819:410:0:o;43769:295::-;43844:16;43873:20;43910:6;:13;-1:-1:-1;;;;;43896:28:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43896:28:0;;43873:51;;43940:9;43935:101;43959:6;:13;43955:1;:17;43935:101;;;44003:21;44008:4;44014:6;44021:1;44014:9;;;;;;;;:::i;:::-;;;;;;;44003:4;:21::i;:::-;43994:3;43998:1;43994:6;;;;;;;;:::i;:::-;;;;;;;;;;:30;43974:3;;;;:::i;:::-;;;;43935:101;;47876:233;38497:6;;-1:-1:-1;;;;;38497:6:0;17737:10;38644:23;38636:68;;;;-1:-1:-1;;;38636:68:0;;;;;;;:::i;:::-;48020:35:::1;48035:2;48039:6;48047:7;48020:14;:35::i;:::-;48066;48077:2;48081:6;48089:7;48066:35;;;;;;;;;;;::::0;:10:::1;:35::i;46758:322::-:0;46939:30;46949:4;46955:5;46962:6;46939:9;:30::i;:::-;46980:28;46990:2;46994:5;47001:6;46980:9;:28::i;:::-;47019:53;47042:4;47048:2;47052:5;47059:6;47067:4;47019:22;:53::i;39333:201::-;38497:6;;-1:-1:-1;;;;;38497:6:0;17737:10;38644:23;38636:68;;;;-1:-1:-1;;;38636:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39422:22:0;::::1;39414:73;;;::::0;-1:-1:-1;;;39414:73:0;;18667:2:1;39414:73:0::1;::::0;::::1;18649:21:1::0;18706:2;18686:18;;;18679:30;18745:34;18725:18;;;18718:62;-1:-1:-1;;;18796:18:1;;;18789:36;18842:19;;39414:73:0::1;18465:402:1::0;39414:73:0::1;39498:28;39517:8;39498:18;:28::i;44947:195::-:0;44984:7;;45053:11;45027:21;45033:15;45027:3;:21;:::i;:::-;45026:39;;;;:::i;:::-;45019:46;;:4;:46;:::i;:::-;45004:61;;45091:4;45084;:11;45076:36;;;;-1:-1:-1;;;45076:36:0;;;;;;;:::i;:::-;45130:4;44947:195;-1:-1:-1;44947:195:0:o;48196:205::-;38497:6;;-1:-1:-1;;;;;38497:6:0;17737:10;38644:23;38636:68;;;;-1:-1:-1;;;38636:68:0;;;;;;;:::i;:::-;48326:30:::1;48336:4;48342:5;48349:6;48326:9;:30::i;:::-;48367:26;48373:4;48379:5;48386:6;48367:5;:26::i;26885:88::-:0;26952:13;;;;:4;;:13;;;;;:::i;49763:289::-;49901:1;49892:6;:10;49884:42;;;;-1:-1:-1;;;49884:42:0;;;;;;;:::i;:::-;49963:24;49972:15;49963:6;:24;:::i;:::-;-1:-1:-1;;;;;49937:15:0;;;;;;:6;:15;;;;;;;;:22;;;;;;;;:50;;:22;;:15;:50;;;;;:::i;:::-;;;;-1:-1:-1;50020:24:0;;-1:-1:-1;50029:15:0;50020:6;:24;:::i;:::-;49998:18;;;;:11;:18;;;;;:46;;:18;;;:46;;;;;:::i;:::-;;;;-1:-1:-1;;;;;49763:289:0:o;27359:569::-;-1:-1:-1;;;;;27512:16:0;;27504:62;;;;-1:-1:-1;;;27504:62:0;;;;;;;:::i;:::-;17737:10;27623:102;17737:10;27579:16;27666:2;27670:21;27688:2;27670:17;:21::i;:::-;27693:25;27711:6;27693:17;:25::i;:::-;27720:4;27623:20;:102::i;:::-;27738:9;:13;;;;;;;;;;;-1:-1:-1;;;;;27738:17:0;;;;;;;;;:27;;27759:6;;27738:9;:27;;27759:6;;27738:27;:::i;:::-;;;;-1:-1:-1;;27781:52:0;;;19448:25:1;;;19504:2;19489:18;;19482:34;;;-1:-1:-1;;;;;27781:52:0;;;;27814:1;;27781:52;;;;;;19421:18:1;27781:52:0;;;;;;;27846:74;27877:8;27895:1;27899:2;27903;27907:6;27915:4;27846:30;:74::i;50781:315::-;50951:7;:14;50934:6;:13;:31;50927:39;;;;:::i;:::-;50982:9;50977:112;51001:6;:13;50997:1;:17;50977:112;;;51036:41;51046:7;51055:6;51062:1;51055:9;;;;;;;;:::i;:::-;;;;;;;51066:7;51074:1;51066:10;;;;;;;;:::i;:::-;;;;;;;51036:9;:41::i;:::-;51016:3;;;;:::i;:::-;;;;50977:112;;;;50781:315;;;:::o;50094:::-;50264:7;:14;50247:6;:13;:31;50240:39;;;;:::i;:::-;50295:9;50290:112;50314:6;:13;50310:1;:17;50290:112;;;50349:41;50359:7;50368:6;50375:1;50368:9;;;;;;;;:::i;:::-;;;;;;;50379:7;50387:1;50379:10;;;;;;;;:::i;:::-;;;;;;;50349:9;:41::i;:::-;50329:3;;;;:::i;:::-;;;;50290:112;;22883:442;-1:-1:-1;;;;;23116:20:0;;17737:10;23116:20;;:60;;-1:-1:-1;23140:36:0;23157:4;17737:10;22165:168;:::i;23140:36::-;23094:160;;;;-1:-1:-1;;;23094:160:0;;19861:2:1;23094:160:0;;;19843:21:1;19900:2;19880:18;;;19873:30;19939:34;19919:18;;;19912:62;-1:-1:-1;;;19990:18:1;;;19983:48;20048:19;;23094:160:0;19659:414:1;23094:160:0;23265:52;23288:4;23294:2;23298:3;23303:7;23312:4;23265:22;:52::i;28284:735::-;-1:-1:-1;;;;;28462:16:0;;28454:62;;;;-1:-1:-1;;;28454:62:0;;;;;;;:::i;:::-;28549:7;:14;28535:3;:10;:28;28527:81;;;;-1:-1:-1;;;28527:81:0;;;;;;;:::i;:::-;17737:10;28665:66;17737:10;28621:16;28708:2;28712:3;28717:7;28726:4;28665:20;:66::i;:::-;28749:9;28744:103;28768:3;:10;28764:1;:14;28744:103;;;28825:7;28833:1;28825:10;;;;;;;;:::i;:::-;;;;;;;28800:9;:17;28810:3;28814:1;28810:6;;;;;;;;:::i;:::-;;;;;;;28800:17;;;;;;;;;;;:21;28818:2;-1:-1:-1;;;;;28800:21:0;-1:-1:-1;;;;;28800:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;28780:3:0;;-1:-1:-1;28780:3:0;;;:::i;:::-;;;;28744:103;;;;28900:2;-1:-1:-1;;;;;28864:53:0;28896:1;-1:-1:-1;;;;;28864:53:0;28878:8;-1:-1:-1;;;;;28864:53:0;;28904:3;28909:7;28864:53;;;;;;;:::i;:::-;;;;;;;;28930:81;28966:8;28984:1;28988:2;28992:3;28997:7;29006:4;28930:35;:81::i;30120:891::-;-1:-1:-1;;;;;30272:18:0;;30264:66;;;;-1:-1:-1;;;30264:66:0;;;;;;;:::i;:::-;30363:7;:14;30349:3;:10;:28;30341:81;;;;-1:-1:-1;;;30341:81:0;;;;;;;:::i;:::-;30435:16;17737:10;30435:31;;30479:66;30500:8;30510:4;30524:1;30528:3;30533:7;30479:66;;;;;;;;;;;;:20;:66::i;:::-;30563:9;30558:373;30582:3;:10;30578:1;:14;30558:373;;;30614:10;30627:3;30631:1;30627:6;;;;;;;;:::i;:::-;;;;;;;30614:19;;30648:14;30665:7;30673:1;30665:10;;;;;;;;:::i;:::-;;;;;;;;;;;;30692:19;30714:13;;;;;;;;;;-1:-1:-1;;;;;30714:19:0;;;;;;;;;;;;30665:10;;-1:-1:-1;30756:21:0;;;;30748:70;;;;-1:-1:-1;;;30748:70:0;;;;;;;:::i;:::-;30862:9;:13;;;;;;;;;;;-1:-1:-1;;;;;30862:19:0;;;;;;;;;;30884:20;;30862:42;;30594:3;;;;:::i;:::-;;;;30558:373;;;;30986:1;-1:-1:-1;;;;;30948:55:0;30972:4;-1:-1:-1;;;;;30948:55:0;30962:8;-1:-1:-1;;;;;30948:55:0;;30990:3;30995:7;30948:55;;;;;;;:::i;:::-;;;;;;;;30253:758;30120:891;;;:::o;39694:191::-;39787:6;;;-1:-1:-1;;;;;39804:17:0;;;-1:-1:-1;;;;;;39804:17:0;;;;;;;39837:40;;39787:6;;;39804:17;39787:6;;39837:40;;39768:16;;39837:40;39757:128;39694:191;:::o;31153:331::-;31308:8;-1:-1:-1;;;;;31299:17:0;:5;-1:-1:-1;;;;;31299:17:0;;;31291:71;;;;-1:-1:-1;;;31291:71:0;;21968:2:1;31291:71:0;;;21950:21:1;22007:2;21987:18;;;21980:30;22046:34;22026:18;;;22019:62;-1:-1:-1;;;22097:18:1;;;22090:39;22146:19;;31291:71:0;21766:405:1;31291:71:0;-1:-1:-1;;;;;31373:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;31373:46:0;;;;;;;;;;31435:41;;1159::1;;;31435::0;;1132:18:1;31435:41:0;;;;;;;31153:331;;;:::o;50450:289::-;50588:1;50579:6;:10;50571:42;;;;-1:-1:-1;;;50571:42:0;;;;;;;:::i;:::-;50650:24;50659:15;50650:6;:24;:::i;:::-;-1:-1:-1;;;;;50624:15:0;;;;;;:6;:15;;;;;;;;:22;;;;;;;;:50;;:22;;:15;:50;;;;;:::i;:::-;;;;-1:-1:-1;50707:24:0;;-1:-1:-1;50716:15:0;50707:6;:24;:::i;:::-;50685:18;;;;:11;:18;;;;;:46;;:18;;;:46;;;;;:::i;22405:401::-;-1:-1:-1;;;;;22613:20:0;;17737:10;22613:20;;:60;;-1:-1:-1;22637:36:0;22654:4;17737:10;22165:168;:::i;22637:36::-;22591:151;;;;-1:-1:-1;;;22591:151:0;;22378:2:1;22591:151:0;;;22360:21:1;22417:2;22397:18;;;22390:30;22456:34;22436:18;;;22429:62;-1:-1:-1;;;22507:18:1;;;22500:39;22556:19;;22591:151:0;22176:405:1;22591:151:0;22753:45;22771:4;22777:2;22781;22785:6;22793:4;22753:17;:45::i;29269:648::-;-1:-1:-1;;;;;29396:18:0;;29388:66;;;;-1:-1:-1;;;29388:66:0;;;;;;;:::i;:::-;17737:10;29511:102;17737:10;29542:4;29467:16;29560:21;29578:2;29560:17;:21::i;:::-;29583:25;29601:6;29583:17;:25::i;:::-;29511:102;;;;;;;;;;;;:20;:102::i;:::-;29626:19;29648:13;;;;;;;;;;;-1:-1:-1;;;;;29648:19:0;;;;;;;;;;29686:21;;;;29678:70;;;;-1:-1:-1;;;29678:70:0;;;;;;;:::i;:::-;29784:9;:13;;;;;;;;;;;-1:-1:-1;;;;;29784:19:0;;;;;;;;;;;;29806:20;;;29784:42;;29855:54;;19448:25:1;;;19489:18;;;19482:34;;;29784:19:0;;29855:54;;;;;;19421:18:1;29855:54:0;;;;;;;29377:540;;29269:648;;;:::o;34242:198::-;34362:16;;;34376:1;34362:16;;;;;;;;;34308;;34337:22;;34362:16;;;;;;;;;;;;-1:-1:-1;34362:16:0;34337:41;;34400:7;34389:5;34395:1;34389:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;34427:5;34242:198;-1:-1:-1;;34242:198:0:o;45235:335::-;45493:69;45520:8;45530:4;45536:2;45540:6;45548:7;45557:4;45493:26;:69::i;:::-;45235:335;;;;;;:::o;32669:744::-;-1:-1:-1;;;;;32884:13:0;;10001:19;:23;32880:526;;32920:72;;-1:-1:-1;;;32920:72:0;;-1:-1:-1;;;;;32920:38:0;;;;;:72;;32959:8;;32969:4;;32975:2;;32979:6;;32987:4;;32920:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32920:72:0;;;;;;;;-1:-1:-1;;32920:72:0;;;;;;;;;;;;:::i;:::-;;;32916:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;33268:6;33261:14;;-1:-1:-1;;;33261:14:0;;;;;;;;:::i;32916:479::-;;;33317:62;;-1:-1:-1;;;33317:62:0;;24468:2:1;33317:62:0;;;24450:21:1;24507:2;24487:18;;;24480:30;24546:34;24526:18;;;24519:62;-1:-1:-1;;;24597:18:1;;;24590:50;24657:19;;33317:62:0;24266:416:1;32916:479:0;-1:-1:-1;;;;;;33042:55:0;;-1:-1:-1;;;33042:55:0;33038:154;;33122:50;;-1:-1:-1;;;33122:50:0;;;;;;;:::i;33038:154::-;32993:214;32669:744;;;;;;:::o;24967:1074::-;25194:7;:14;25180:3;:10;:28;25172:81;;;;-1:-1:-1;;;25172:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25272:16:0;;25264:66;;;;-1:-1:-1;;;25264:66:0;;;;;;;:::i;:::-;17737:10;25387:60;17737:10;25418:4;25424:2;25428:3;25433:7;25442:4;25387:20;:60::i;:::-;25465:9;25460:421;25484:3;:10;25480:1;:14;25460:421;;;25516:10;25529:3;25533:1;25529:6;;;;;;;;:::i;:::-;;;;;;;25516:19;;25550:14;25567:7;25575:1;25567:10;;;;;;;;:::i;:::-;;;;;;;;;;;;25594:19;25616:13;;;;;;;;;;-1:-1:-1;;;;;25616:19:0;;;;;;;;;;;;25567:10;;-1:-1:-1;25658:21:0;;;;25650:76;;;;-1:-1:-1;;;25650:76:0;;;;;;;:::i;:::-;25770:9;:13;;;;;;;;;;;-1:-1:-1;;;;;25770:19:0;;;;;;;;;;25792:20;;;25770:42;;25842:17;;;;;;;:27;;25792:20;;25770:9;25842:27;;25792:20;;25842:27;:::i;:::-;;;;;;;;25501:380;;;25496:3;;;;:::i;:::-;;;25460:421;;;;25928:2;-1:-1:-1;;;;;25898:47:0;25922:4;-1:-1:-1;;;;;25898:47:0;25912:8;-1:-1:-1;;;;;25898:47:0;;25932:3;25937:7;25898:47;;;;;;;:::i;:::-;;;;;;;;25958:75;25994:8;26004:4;26010:2;26014:3;26019:7;26028:4;33421:813;-1:-1:-1;;;;;33661:13:0;;10001:19;:23;33657:570;;33697:79;;-1:-1:-1;;;33697:79:0;;-1:-1:-1;;;;;33697:43:0;;;;;:79;;33741:8;;33751:4;;33757:3;;33762:7;;33771:4;;33697:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33697:79:0;;;;;;;;-1:-1:-1;;33697:79:0;;;;;;;;;;;;:::i;:::-;;;33693:523;;;;:::i;:::-;-1:-1:-1;;;;;;33858:60:0;;-1:-1:-1;;;33858:60:0;33854:159;;33943:50;;-1:-1:-1;;;33943:50:0;;;;;;;:::i;23789:820::-;-1:-1:-1;;;;;23977:16:0;;23969:66;;;;-1:-1:-1;;;23969:66:0;;;;;;;:::i;:::-;17737:10;24092:96;17737:10;24123:4;24129:2;24133:21;24151:2;24133:17;:21::i;24092:96::-;24201:19;24223:13;;;;;;;;;;;-1:-1:-1;;;;;24223:19:0;;;;;;;;;;24261:21;;;;24253:76;;;;-1:-1:-1;;;24253:76:0;;;;;;;:::i;:::-;24365:9;:13;;;;;;;;;;;-1:-1:-1;;;;;24365:19:0;;;;;;;;;;24387:20;;;24365:42;;24429:17;;;;;;;:27;;24387:20;;24365:9;24429:27;;24387:20;;24429:27;:::i;:::-;;;;-1:-1:-1;;24474:46:0;;;19448:25:1;;;19504:2;19489:18;;19482:34;;;-1:-1:-1;;;;;24474:46:0;;;;;;;;;;;;;;19421:18:1;24474:46:0;;;;;;;24533:68;24564:8;24574:4;24580:2;24584;24588:6;24596:4;24533:30;:68::i;36700:655::-;-1:-1:-1;;;;;37022:18:0;;37018:160;;37062:9;37057:110;37081:3;:10;37077:1;:14;37057:110;;;37141:7;37149:1;37141:10;;;;;;;;:::i;:::-;;;;;;;37117:12;:20;37130:3;37134:1;37130:6;;;;;;;;:::i;:::-;;;;;;;37117:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;37093:3:0;;-1:-1:-1;37093:3:0;;:::i;:::-;;;37057:110;;;;37018:160;-1:-1:-1;;;;;37194:16:0;;37190:158;;37232:9;37227:110;37251:3;:10;37247:1;:14;37227:110;;;37311:7;37319:1;37311:10;;;;;;;;:::i;:::-;;;;;;;37287:12;:20;37300:3;37304:1;37300:6;;;;;;;;:::i;:::-;;;;;;;37287:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;37263:3:0;;-1:-1:-1;37263:3:0;;:::i;:::-;;;37227:110;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;192:254;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:127::-;1272:10;1267:3;1263:20;1260:1;1253:31;1303:4;1300:1;1293:15;1327:4;1324:1;1317:15;1343:249;1453:2;1434:13;;-1:-1:-1;;1430:27:1;1418:40;;-1:-1:-1;;;;;1473:34:1;;1509:22;;;1470:62;1467:88;;;1535:18;;:::i;:::-;1571:2;1564:22;-1:-1:-1;;1343:249:1:o;1597:469::-;1662:5;-1:-1:-1;;;;;1688:6:1;1685:30;1682:56;;;1718:18;;:::i;:::-;1767:2;1761:9;1779:69;1836:2;1815:15;;-1:-1:-1;;1811:29:1;1842:4;1807:40;1761:9;1779:69;:::i;:::-;1866:6;1857:15;;1896:6;1888;1881:22;1936:3;1927:6;1922:3;1918:16;1915:25;1912:45;;;1953:1;1950;1943:12;1912:45;2003:6;1998:3;1991:4;1983:6;1979:17;1966:44;2058:1;2051:4;2042:6;2034;2030:19;2026:30;2019:41;;1597:469;;;;;:::o;2071:451::-;2140:6;2193:2;2181:9;2172:7;2168:23;2164:32;2161:52;;;2209:1;2206;2199:12;2161:52;2249:9;2236:23;-1:-1:-1;;;;;2274:6:1;2271:30;2268:50;;;2314:1;2311;2304:12;2268:50;2337:22;;2390:4;2382:13;;2378:27;-1:-1:-1;2368:55:1;;2419:1;2416;2409:12;2368:55;2442:74;2508:7;2503:2;2490:16;2485:2;2481;2477:11;2442:74;:::i;:::-;2432:84;2071:451;-1:-1:-1;;;;2071:451:1:o;2527:180::-;2586:6;2639:2;2627:9;2618:7;2614:23;2610:32;2607:52;;;2655:1;2652;2645:12;2607:52;-1:-1:-1;2678:23:1;;2527:180;-1:-1:-1;2527:180:1:o;2712:472::-;2754:3;2792:5;2786:12;2819:6;2814:3;2807:19;2844:1;2854:162;2868:6;2865:1;2862:13;2854:162;;;2930:4;2986:13;;;2982:22;;2976:29;2958:11;;;2954:20;;2947:59;2883:12;2854:162;;;3034:6;3031:1;3028:13;3025:87;;;3100:1;3093:4;3084:6;3079:3;3075:16;3071:27;3064:38;3025:87;-1:-1:-1;3166:2:1;3145:15;-1:-1:-1;;3141:29:1;3132:39;;;;3173:4;3128:50;;2712:472;-1:-1:-1;;2712:472:1:o;3189:220::-;3338:2;3327:9;3320:21;3301:4;3358:45;3399:2;3388:9;3384:18;3376:6;3358:45;:::i;3414:322::-;3491:6;3499;3507;3560:2;3548:9;3539:7;3535:23;3531:32;3528:52;;;3576:1;3573;3566:12;3528:52;3599:29;3618:9;3599:29;:::i;:::-;3589:39;3675:2;3660:18;;3647:32;;-1:-1:-1;3726:2:1;3711:18;;;3698:32;;3414:322;-1:-1:-1;;;3414:322:1:o;3741:183::-;3801:4;-1:-1:-1;;;;;3826:6:1;3823:30;3820:56;;;3856:18;;:::i;:::-;-1:-1:-1;3901:1:1;3897:14;3913:4;3893:25;;3741:183::o;3929:724::-;3983:5;4036:3;4029:4;4021:6;4017:17;4013:27;4003:55;;4054:1;4051;4044:12;4003:55;4090:6;4077:20;4116:4;4139:43;4179:2;4139:43;:::i;:::-;4211:2;4205:9;4223:31;4251:2;4243:6;4223:31;:::i;:::-;4289:18;;;4381:1;4377:10;;;;4365:23;;4361:32;;;4323:15;;;;-1:-1:-1;4405:15:1;;;4402:35;;;4433:1;4430;4423:12;4402:35;4469:2;4461:6;4457:15;4481:142;4497:6;4492:3;4489:15;4481:142;;;4563:17;;4551:30;;4601:12;;;;4514;;4481:142;;;-1:-1:-1;4641:6:1;3929:724;-1:-1:-1;;;;;;3929:724:1:o;4658:221::-;4700:5;4753:3;4746:4;4738:6;4734:17;4730:27;4720:55;;4771:1;4768;4761:12;4720:55;4793:80;4869:3;4860:6;4847:20;4840:4;4832:6;4828:17;4793:80;:::i;4884:943::-;5038:6;5046;5054;5062;5070;5123:3;5111:9;5102:7;5098:23;5094:33;5091:53;;;5140:1;5137;5130:12;5091:53;5163:29;5182:9;5163:29;:::i;:::-;5153:39;;5211:38;5245:2;5234:9;5230:18;5211:38;:::i;:::-;5201:48;;5300:2;5289:9;5285:18;5272:32;-1:-1:-1;;;;;5364:2:1;5356:6;5353:14;5350:34;;;5380:1;5377;5370:12;5350:34;5403:61;5456:7;5447:6;5436:9;5432:22;5403:61;:::i;:::-;5393:71;;5517:2;5506:9;5502:18;5489:32;5473:48;;5546:2;5536:8;5533:16;5530:36;;;5562:1;5559;5552:12;5530:36;5585:63;5640:7;5629:8;5618:9;5614:24;5585:63;:::i;:::-;5575:73;;5701:3;5690:9;5686:19;5673:33;5657:49;;5731:2;5721:8;5718:16;5715:36;;;5747:1;5744;5737:12;5715:36;;5770:51;5813:7;5802:8;5791:9;5787:24;5770:51;:::i;:::-;5760:61;;;4884:943;;;;;;;;:::o;5832:595::-;5950:6;5958;6011:2;5999:9;5990:7;5986:23;5982:32;5979:52;;;6027:1;6024;6017:12;5979:52;6067:9;6054:23;-1:-1:-1;;;;;6137:2:1;6129:6;6126:14;6123:34;;;6153:1;6150;6143:12;6123:34;6176:61;6229:7;6220:6;6209:9;6205:22;6176:61;:::i;:::-;6166:71;;6290:2;6279:9;6275:18;6262:32;6246:48;;6319:2;6309:8;6306:16;6303:36;;;6335:1;6332;6325:12;6303:36;;6358:63;6413:7;6402:8;6391:9;6387:24;6358:63;:::i;:::-;6348:73;;;5832:595;;;;;:::o;6432:248::-;6500:6;6508;6561:2;6549:9;6540:7;6536:23;6532:32;6529:52;;;6577:1;6574;6567:12;6529:52;-1:-1:-1;;6600:23:1;;;6670:2;6655:18;;;6642:32;;-1:-1:-1;6432:248:1:o;6685:1208::-;6803:6;6811;6864:2;6852:9;6843:7;6839:23;6835:32;6832:52;;;6880:1;6877;6870:12;6832:52;6920:9;6907:23;-1:-1:-1;;;;;6990:2:1;6982:6;6979:14;6976:34;;;7006:1;7003;6996:12;6976:34;7044:6;7033:9;7029:22;7019:32;;7089:7;7082:4;7078:2;7074:13;7070:27;7060:55;;7111:1;7108;7101:12;7060:55;7147:2;7134:16;7169:4;7192:43;7232:2;7192:43;:::i;:::-;7264:2;7258:9;7276:31;7304:2;7296:6;7276:31;:::i;:::-;7342:18;;;7430:1;7426:10;;;;7418:19;;7414:28;;;7376:15;;;;-1:-1:-1;7454:19:1;;;7451:39;;;7486:1;7483;7476:12;7451:39;7510:11;;;;7530:148;7546:6;7541:3;7538:15;7530:148;;;7612:23;7631:3;7612:23;:::i;:::-;7600:36;;7563:12;;;;7656;;;;7530:148;;;7697:6;-1:-1:-1;;7741:18:1;;7728:32;;-1:-1:-1;;7772:16:1;;;7769:36;;;7801:1;7798;7791:12;7898:435;7951:3;7989:5;7983:12;8016:6;8011:3;8004:19;8042:4;8071:2;8066:3;8062:12;8055:19;;8108:2;8101:5;8097:14;8129:1;8139:169;8153:6;8150:1;8147:13;8139:169;;;8214:13;;8202:26;;8248:12;;;;8283:15;;;;8175:1;8168:9;8139:169;;;-1:-1:-1;8324:3:1;;7898:435;-1:-1:-1;;;;;7898:435:1:o;8338:261::-;8517:2;8506:9;8499:21;8480:4;8537:56;8589:2;8578:9;8574:18;8566:6;8537:56;:::i;8604:669::-;8731:6;8739;8747;8800:2;8788:9;8779:7;8775:23;8771:32;8768:52;;;8816:1;8813;8806:12;8768:52;8839:29;8858:9;8839:29;:::i;:::-;8829:39;;8919:2;8908:9;8904:18;8891:32;-1:-1:-1;;;;;8983:2:1;8975:6;8972:14;8969:34;;;8999:1;8996;8989:12;8969:34;9022:61;9075:7;9066:6;9055:9;9051:22;9022:61;:::i;:::-;9012:71;;9136:2;9125:9;9121:18;9108:32;9092:48;;9165:2;9155:8;9152:16;9149:36;;;9181:1;9178;9171:12;9149:36;;9204:63;9259:7;9248:8;9237:9;9233:24;9204:63;:::i;:::-;9194:73;;;8604:669;;;;;:::o;9486:347::-;9551:6;9559;9612:2;9600:9;9591:7;9587:23;9583:32;9580:52;;;9628:1;9625;9618:12;9580:52;9651:29;9670:9;9651:29;:::i;:::-;9641:39;;9730:2;9719:9;9715:18;9702:32;9777:5;9770:13;9763:21;9756:5;9753:32;9743:60;;9799:1;9796;9789:12;9743:60;9822:5;9812:15;;;9486:347;;;;;:::o;9838:416::-;9931:6;9939;9992:2;9980:9;9971:7;9967:23;9963:32;9960:52;;;10008:1;10005;9998:12;9960:52;10044:9;10031:23;10021:33;;10105:2;10094:9;10090:18;10077:32;-1:-1:-1;;;;;10124:6:1;10121:30;10118:50;;;10164:1;10161;10154:12;10118:50;10187:61;10240:7;10231:6;10220:9;10216:22;10187:61;:::i;10259:260::-;10327:6;10335;10388:2;10376:9;10367:7;10363:23;10359:32;10356:52;;;10404:1;10401;10394:12;10356:52;10427:29;10446:9;10427:29;:::i;:::-;10417:39;;10475:38;10509:2;10498:9;10494:18;10475:38;:::i;:::-;10465:48;;10259:260;;;;;:::o;10524:606::-;10628:6;10636;10644;10652;10660;10713:3;10701:9;10692:7;10688:23;10684:33;10681:53;;;10730:1;10727;10720:12;10681:53;10753:29;10772:9;10753:29;:::i;:::-;10743:39;;10801:38;10835:2;10824:9;10820:18;10801:38;:::i;:::-;10791:48;;10886:2;10875:9;10871:18;10858:32;10848:42;;10937:2;10926:9;10922:18;10909:32;10899:42;;10992:3;10981:9;10977:19;10964:33;-1:-1:-1;;;;;11012:6:1;11009:30;11006:50;;;11052:1;11049;11042:12;11006:50;11075:49;11116:7;11107:6;11096:9;11092:22;11075:49;:::i;11135:186::-;11194:6;11247:2;11235:9;11226:7;11222:23;11218:32;11215:52;;;11263:1;11260;11253:12;11215:52;11286:29;11305:9;11286:29;:::i;11738:356::-;11940:2;11922:21;;;11959:18;;;11952:30;12018:34;12013:2;11998:18;;11991:62;12085:2;12070:18;;11738:356::o;12099:380::-;12178:1;12174:12;;;;12221;;;12242:61;;12296:4;12288:6;12284:17;12274:27;;12242:61;12349:2;12341:6;12338:14;12318:18;12315:38;12312:161;;;12395:10;12390:3;12386:20;12383:1;12376:31;12430:4;12427:1;12420:15;12458:4;12455:1;12448:15;12312:161;;12099:380;;;:::o;12484:127::-;12545:10;12540:3;12536:20;12533:1;12526:31;12576:4;12573:1;12566:15;12600:4;12597:1;12590:15;12616:125;12656:4;12684:1;12681;12678:8;12675:34;;;12689:18;;:::i;:::-;-1:-1:-1;12726:9:1;;12616:125::o;12746:168::-;12786:7;12852:1;12848;12844:6;12840:14;12837:1;12834:21;12829:1;12822:9;12815:17;12811:45;12808:71;;;12859:18;;:::i;:::-;-1:-1:-1;12899:9:1;;12746:168::o;12919:127::-;12980:10;12975:3;12971:20;12968:1;12961:31;13011:4;13008:1;13001:15;13035:4;13032:1;13025:15;13051:112;13083:1;13109;13099:35;;13114:18;;:::i;:::-;-1:-1:-1;13148:9:1;;13051:112::o;13168:341::-;13370:2;13352:21;;;13409:2;13389:18;;;13382:30;-1:-1:-1;;;13443:2:1;13428:18;;13421:47;13500:2;13485:18;;13168:341::o;13514:337::-;13716:2;13698:21;;;13755:2;13735:18;;;13728:30;-1:-1:-1;;;13789:2:1;13774:18;;13767:43;13842:2;13827:18;;13514:337::o;13856:422::-;13945:1;13988:5;13945:1;14002:270;14023:7;14013:8;14010:21;14002:270;;;14082:4;14078:1;14074:6;14070:17;14064:4;14061:27;14058:53;;;14091:18;;:::i;:::-;14141:7;14131:8;14127:22;14124:55;;;14161:16;;;;14124:55;14240:22;;;;14200:15;;;;14002:270;;;14006:3;13856:422;;;;;:::o;14283:806::-;14332:5;14362:8;14352:80;;-1:-1:-1;14403:1:1;14417:5;;14352:80;14451:4;14441:76;;-1:-1:-1;14488:1:1;14502:5;;14441:76;14533:4;14551:1;14546:59;;;;14619:1;14614:130;;;;14526:218;;14546:59;14576:1;14567:10;;14590:5;;;14614:130;14651:3;14641:8;14638:17;14635:43;;;14658:18;;:::i;:::-;-1:-1:-1;;14714:1:1;14700:16;;14729:5;;14526:218;;14828:2;14818:8;14815:16;14809:3;14803:4;14800:13;14796:36;14790:2;14780:8;14777:16;14772:2;14766:4;14763:12;14759:35;14756:77;14753:159;;;-1:-1:-1;14865:19:1;;;14897:5;;14753:159;14944:34;14969:8;14963:4;14944:34;:::i;:::-;15014:6;15010:1;15006:6;15002:19;14993:7;14990:32;14987:58;;;15025:18;;:::i;:::-;15063:20;;14283:806;-1:-1:-1;;;14283:806:1:o;15094:131::-;15154:5;15183:36;15210:8;15204:4;15183:36;:::i;15919:562::-;-1:-1:-1;;;;;16204:32:1;;16186:51;;16273:2;16268;16253:18;;16246:30;;;-1:-1:-1;;16299:56:1;;16336:18;;16328:6;16299:56;:::i;:::-;16403:9;16395:6;16391:22;16386:2;16375:9;16371:18;16364:50;16431:44;16468:6;16460;16431:44;:::i;16486:127::-;16547:10;16542:3;16538:20;16535:1;16528:31;16578:4;16575:1;16568:15;16602:4;16599:1;16592:15;16618:343;16820:2;16802:21;;;16859:2;16839:18;;;16832:30;-1:-1:-1;;;16893:2:1;16878:18;;16871:49;16952:2;16937:18;;16618:343::o;16966:135::-;17005:3;-1:-1:-1;;17026:17:1;;17023:43;;;17046:18;;:::i;:::-;-1:-1:-1;17093:1:1;17082:13;;16966:135::o;17866:120::-;17906:1;17932;17922:35;;17937:18;;:::i;:::-;-1:-1:-1;17971:9:1;;17866:120::o;17991:336::-;18193:2;18175:21;;;18232:2;18212:18;;;18205:30;-1:-1:-1;;;18266:2:1;18251:18;;18244:42;18318:2;18303:18;;17991:336::o;18332:128::-;18372:3;18403:1;18399:6;18396:1;18393:13;18390:39;;;18409:18;;:::i;:::-;-1:-1:-1;18445:9:1;;18332:128::o;18872:397::-;19074:2;19056:21;;;19113:2;19093:18;;;19086:30;19152:34;19147:2;19132:18;;19125:62;-1:-1:-1;;;19218:2:1;19203:18;;19196:31;19259:3;19244:19;;18872:397::o;19527:127::-;19588:10;19583:3;19579:20;19576:1;19569:31;19619:4;19616:1;19609:15;19643:4;19640:1;19633:15;20078:404;20280:2;20262:21;;;20319:2;20299:18;;;20292:30;20358:34;20353:2;20338:18;;20331:62;-1:-1:-1;;;20424:2:1;20409:18;;20402:38;20472:3;20457:19;;20078:404::o;20487:465::-;20744:2;20733:9;20726:21;20707:4;20770:56;20822:2;20811:9;20807:18;20799:6;20770:56;:::i;:::-;20874:9;20866:6;20862:22;20857:2;20846:9;20842:18;20835:50;20902:44;20939:6;20931;20902:44;:::i;:::-;20894:52;20487:465;-1:-1:-1;;;;;20487:465:1:o;20957:399::-;21159:2;21141:21;;;21198:2;21178:18;;;21171:30;21237:34;21232:2;21217:18;;21210:62;-1:-1:-1;;;21303:2:1;21288:18;;21281:33;21346:3;21331:19;;20957:399::o;21361:400::-;21563:2;21545:21;;;21602:2;21582:18;;;21575:30;21641:34;21636:2;21621:18;;21614:62;-1:-1:-1;;;21707:2:1;21692:18;;21685:34;21751:3;21736:19;;21361:400::o;22586:561::-;-1:-1:-1;;;;;22883:15:1;;;22865:34;;22935:15;;22930:2;22915:18;;22908:43;22982:2;22967:18;;22960:34;;;23025:2;23010:18;;23003:34;;;22845:3;23068;23053:19;;23046:32;;;22808:4;;23095:46;;23121:19;;23113:6;23095:46;:::i;:::-;23087:54;22586:561;-1:-1:-1;;;;;;;22586:561:1:o;23152:249::-;23221:6;23274:2;23262:9;23253:7;23249:23;23245:32;23242:52;;;23290:1;23287;23280:12;23242:52;23322:9;23316:16;23341:30;23365:5;23341:30;:::i;23406:179::-;23441:3;23483:1;23465:16;23462:23;23459:120;;;23529:1;23526;23523;23508:23;-1:-1:-1;23566:1:1;23560:8;23555:3;23551:18;23459:120;23406:179;:::o;23590:671::-;23629:3;23671:4;23653:16;23650:26;23647:39;;;23590:671;:::o;23647:39::-;23713:2;23707:9;-1:-1:-1;;23778:16:1;23774:25;;23771:1;23707:9;23750:50;23829:4;23823:11;23853:16;-1:-1:-1;;;;;23959:2:1;23952:4;23944:6;23940:17;23937:25;23932:2;23924:6;23921:14;23918:45;23915:58;;;23966:5;;;;;23590:671;:::o;23915:58::-;24003:6;23997:4;23993:17;23982:28;;24039:3;24033:10;24066:2;24058:6;24055:14;24052:27;;;24072:5;;;;;;23590:671;:::o;24052:27::-;24156:2;24137:16;24131:4;24127:27;24123:36;24116:4;24107:6;24102:3;24098:16;24094:27;24091:69;24088:82;;;24163:5;;;;;;23590:671;:::o;24088:82::-;24179:57;24230:4;24221:6;24213;24209:19;24205:30;24199:4;24179:57;:::i;:::-;-1:-1:-1;24252:3:1;;23590:671;-1:-1:-1;;;;;23590:671:1:o;24687:404::-;24889:2;24871:21;;;24928:2;24908:18;;;24901:30;24967:34;24962:2;24947:18;;24940:62;-1:-1:-1;;;25033:2:1;25018:18;;25011:38;25081:3;25066:19;;24687:404::o;25096:401::-;25298:2;25280:21;;;25337:2;25317:18;;;25310:30;25376:34;25371:2;25356:18;;25349:62;-1:-1:-1;;;25442:2:1;25427:18;;25420:35;25487:3;25472:19;;25096:401::o;25502:406::-;25704:2;25686:21;;;25743:2;25723:18;;;25716:30;25782:34;25777:2;25762:18;;25755:62;-1:-1:-1;;;25848:2:1;25833:18;;25826:40;25898:3;25883:19;;25502:406::o;25913:827::-;-1:-1:-1;;;;;26310:15:1;;;26292:34;;26362:15;;26357:2;26342:18;;26335:43;26272:3;26409:2;26394:18;;26387:31;;;26235:4;;26441:57;;26478:19;;26470:6;26441:57;:::i;:::-;26546:9;26538:6;26534:22;26529:2;26518:9;26514:18;26507:50;26580:44;26617:6;26609;26580:44;:::i;:::-;26566:58;;26673:9;26665:6;26661:22;26655:3;26644:9;26640:19;26633:51;26701:33;26727:6;26719;26701:33;:::i;:::-;26693:41;25913:827;-1:-1:-1;;;;;;;;25913:827:1:o
Swarm Source
ipfs://220d20f06fc8848e4b7997d9e1bfc69a49876f9532ba3b5a70c65e066b5e5d78
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.