Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 18 from a total of 18 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint | 12928883 | 1132 days ago | IN | 0 ETH | 0.00600947 | ||||
Mint | 12917544 | 1134 days ago | IN | 0 ETH | 0.00415392 | ||||
Mint | 12914236 | 1135 days ago | IN | 0 ETH | 0.00560779 | ||||
Mint | 12910741 | 1135 days ago | IN | 0 ETH | 0.00826377 | ||||
Mint | 12910736 | 1135 days ago | IN | 0 ETH | 0.00955479 | ||||
Mint | 12904504 | 1136 days ago | IN | 0 ETH | 0.00413151 | ||||
Mint | 12903687 | 1136 days ago | IN | 0 ETH | 0.00805717 | ||||
Mint | 12903492 | 1136 days ago | IN | 0 ETH | 0.00770033 | ||||
Mint | 12903405 | 1136 days ago | IN | 0 ETH | 0.00619726 | ||||
Mint | 12903362 | 1136 days ago | IN | 0 ETH | 0.00657286 | ||||
Mint | 12903355 | 1136 days ago | IN | 0 ETH | 0.00657244 | ||||
Mint | 12903209 | 1136 days ago | IN | 0 ETH | 0.00544573 | ||||
Mint | 12903086 | 1136 days ago | IN | 0 ETH | 0.00751252 | ||||
Mint | 12903029 | 1136 days ago | IN | 0 ETH | 0.00807522 | ||||
Mint | 12903019 | 1136 days ago | IN | 0 ETH | 0.00788743 | ||||
Mint | 12902647 | 1136 days ago | IN | 0 ETH | 0.00893165 | ||||
Mint | 12884071 | 1139 days ago | IN | 0 ETH | 0.00413151 | ||||
Mint | 12809567 | 1151 days ago | IN | 0 ETH | 0.00427112 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
12606930 | 1182 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
ERC1155Main
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-25 */ // File: openzeppelin-solidity/contracts/utils/introspection/IERC165.sol // SPDX-License-Identifier: MIT 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-solidity/contracts/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-solidity/contracts/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. 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. 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-solidity/contracts/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-solidity/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: openzeppelin-solidity/contracts/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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: openzeppelin-solidity/contracts/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-solidity/contracts/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 { require(_msgSender() != operator, "ERC1155: setting approval status for self"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_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(to != address(0), "ERC1155: transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); 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"); _balances[id][from] = fromBalance - amount; _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, 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(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); 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"); _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 `account`. * * Emits a {TransferSingle} event. * * Requirements: * * - `account` cannot be the zero address. * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint(address account, uint256 id, uint256 amount, bytes memory data) internal virtual { require(account != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][account] += amount; emit TransferSingle(operator, address(0), account, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), account, 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 (uint 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 `account` * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens of token type `id`. */ function _burn(address account, uint256 id, uint256 amount) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); _balances[id][account] = accountBalance - amount; emit TransferSingle(operator, account, 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 account, uint256[] memory ids, uint256[] memory amounts) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), ids, amounts, ""); for (uint i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); _balances[id][account] = accountBalance - amount; } emit TransferBatch(operator, account, address(0), ids, amounts); } /** * @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(to).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(to).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-solidity/contracts/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-solidity/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: openzeppelin-solidity/contracts/access/AccessControl.sol pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping (address => bool) members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ */ function _checkRole(bytes32 role, address account) internal view { if(!hasRole(role, account)) { revert(string(abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ))); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: openzeppelin-solidity/contracts/utils/cryptography/ECDSA.sol pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } } else if (signature.length == 64) { // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { let vs := mload(add(signature, 0x40)) r := mload(add(signature, 0x20)) s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } } else { revert("ECDSA: invalid signature length"); } return recover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value"); require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: contracts/exchange-provider/IExchangeProvider.sol pragma solidity ^0.8.0; interface IExchangeProvider { function exchange() external view returns(address); } // File: contracts/ERC1155URIStorage.sol pragma solidity ^0.8.0; abstract contract ERC1155URIStorage is ERC1155 { using Strings for uint256; string private baseUri; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; mapping (uint256 => bool) private _tokenIds; function tokenURI(uint256 tokenId) public view virtual returns (string memory) { require(_tokenIds[tokenId], "ERC1155URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.uri(tokenId); } function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_tokenIds[tokenId], "ERC1155URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } function _setBaseUri(string memory _uri) internal virtual { //require(_uri != "", ""); baseUri = _uri; } function _baseURI() internal view virtual returns (string memory) { return baseUri; } function _markTokenId(uint256 id) internal virtual { _tokenIds[id] = true; } } // File: contracts/ERC1155Main.sol pragma solidity ^0.8.0; contract ERC1155Main is ERC1155Burnable, ERC1155URIStorage, AccessControl { bytes32 public SIGNER_ROLE = keccak256("SIGNER_ROLE"); address public factory; uint256 private _lastMintedId; mapping(string => bool) hasTokenWithURI; constructor(string memory _baseUri, address signer) ERC1155("") { factory = _msgSender(); _setBaseUri(_baseUri); _setupRole(DEFAULT_ADMIN_ROLE, signer); _setupRole(SIGNER_ROLE, signer); } function mint( uint256 amount, string calldata _tokenURI, bytes calldata signature ) external { _verifySigner(_tokenURI, amount, signature); require(!hasTokenWithURI[_tokenURI], "ERC1155Main: URI already exists"); uint256 id = _lastMintedId++; _mint(_msgSender(), id, amount, ""); setApprovalForAll(IExchangeProvider(factory).exchange(), true); _markTokenId(id); hasTokenWithURI[_tokenURI] = true; _setTokenURI(id, _tokenURI); } function mint( uint256 amount, string calldata _tokenURI, bytes memory data, bytes calldata signature ) external { _verifySigner(_tokenURI, amount, signature); require(!hasTokenWithURI[_tokenURI], "ERC1155Main: URI already exists"); uint256 id = _lastMintedId++; _mint(_msgSender(), id, amount, data); setApprovalForAll(IExchangeProvider(factory).exchange(), true); _markTokenId(id); hasTokenWithURI[_tokenURI] = true; _setTokenURI(id,_tokenURI); } function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControl, ERC1155) returns (bool) { return ERC1155.supportsInterface(interfaceId) || AccessControl.supportsInterface(interfaceId); } function tokenURI(uint256 tokenId) public view virtual override(ERC1155URIStorage) returns (string memory) { return ERC1155URIStorage.tokenURI(tokenId); } function _verifySigner( string calldata _tokenURI, uint256 amount, bytes calldata signature ) private view { address signer = ECDSA.recover( keccak256(abi.encodePacked(this, _tokenURI, amount)), signature ); require( hasRole(SIGNER_ROLE, signer), "ERC1155Main: Signer should sign transaction" ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"},{"internalType":"address","name":"signer","type":"address"}],"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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SIGNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"amount","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","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":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040527fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f706007553480156200003557600080fd5b506040516200429b3803806200429b833981016040819052620000589162000252565b6040805160208101909152600081526200007281620000b4565b50600880546001600160a01b031916331790556200009082620000cd565b6200009d600082620000e2565b600754620000ac9082620000e2565b505062000390565b8051620000c99060029060208401906200018f565b5050565b8051620000c99060039060208401906200018f565b60008281526006602090815260408083206001600160a01b0385168452909152902054620000c9908390839060ff16620000c95760008281526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790556200014b3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b8280546200019d906200033d565b90600052602060002090601f016020900481019282620001c157600085556200020c565b82601f10620001dc57805160ff19168380011785556200020c565b828001600101855582156200020c579182015b828111156200020c578251825591602001919060010190620001ef565b506200021a9291506200021e565b5090565b5b808211156200021a57600081556001016200021f565b80516001600160a01b03811681146200024d57600080fd5b919050565b6000806040838503121562000265578182fd5b82516001600160401b03808211156200027c578384fd5b818501915085601f83011262000290578384fd5b815181811115620002a557620002a56200037a565b604051601f8201601f19908116603f01168101908382118183101715620002d057620002d06200037a565b81604052828152602093508884848701011115620002ec578687fd5b8691505b828210156200030f5784820184015181830185015290830190620002f0565b828211156200032057868484830101525b95506200033291505085820162000235565b925050509250929050565b600181811c908216806200035257607f821691505b602082108114156200037457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b613efb80620003a06000396000f3fe608060405234801561001057600080fd5b50600436106101765760003560e01c806391d14854116100d8578063c45a01551161008c578063e985e9c511610066578063e985e9c514610370578063f242432a146103b9578063f5298aca146103cc57610176565b8063c45a015514610305578063c87b56dd1461034a578063d547741f1461035d57610176565b8063a217fddf116100bd578063a217fddf146102d7578063a22cb465146102df578063beb76f5f146102f257610176565b806391d1485414610288578063a1ebf35d146102ce57610176565b80632f2ff15d1161012f5780634e1273f4116101145780634e1273f4146102425780636b20c45414610262578063785cc9971461027557610176565b80632f2ff15d1461021c57806336568abe1461022f57610176565b80630e89341c116101605780630e89341c146101c4578063248a9ca3146101e45780632eb2c2d61461020757610176565b8062fdd58e1461017b57806301ffc9a7146101a1575b600080fd5b61018e610189366004613642565b6103df565b6040519081526020015b60405180910390f35b6101b46101af3660046137aa565b6104bc565b6040519015158152602001610198565b6101d76101d236600461376e565b6104de565b6040516101989190613b6d565b61018e6101f236600461376e565b60009081526006602052604090206001015490565b61021a61021536600461348d565b610572565b005b61021a61022a366004613786565b610a4b565b61021a61023d366004613786565b610a7d565b6102556102503660046136a1565b610b4d565b6040516101989190613b35565b61021a61027036600461359e565b610d41565b61021a6102833660046137e2565b610e20565b6101b4610296366004613786565b600091825260066020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61018e60075481565b61018e600081565b61021a6102ed366004613611565b611065565b61021a610300366004613859565b6111f9565b6008546103259073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610198565b6101d761035836600461376e565b6113f9565b61021a61036b366004613786565b611404565b6101b461037e366004613455565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b61021a6103c7366004613537565b61142c565b61021a6103da36600461366d565b61174c565b600073ffffffffffffffffffffffffffffffffffffffff8316610489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526020818152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052205490565b60006104c78261182b565b806104d657506104d68261190e565b90505b919050565b6060600280546104ed90613c75565b80601f016020809104026020016040519081016040528092919081815260200182805461051990613c75565b80156105665780601f1061053b57610100808354040283529160200191610566565b820191906000526020600020905b81548152906001019060200180831161054957829003601f168201915b50505050509050919050565b8151835114610603576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610480565b73ffffffffffffffffffffffffffffffffffffffff84166106a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610480565b6106ae611964565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806106ee57506106ee8561037e611964565b61077a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610480565b6000610784611964565b905060005b84518110156109b65760008582815181106107cd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000858381518110610812577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908102919091018101516000848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8e1683529093529190912054909150818110156108df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610480565b6108e98282613bf9565b60008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461099b9190613ba4565b92505081905550505050806109af90613d14565b9050610789565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610a2d929190613b48565b60405180910390a4610a43818787878787611969565b505050505050565b600082815260066020526040902060010154610a6e81610a69611964565b611c03565b610a788383611cd5565b505050565b610a85611964565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610480565b610b498282611dca565b5050565b60608151835114610be0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610480565b6000835167ffffffffffffffff811115610c23577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610c4c578160200160208202803683370190505b50905060005b8451811015610d3957610ce5858281518110610c97577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858381518110610cd8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516103df565b828281518110610d1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908102919091010152610d3281613d14565b9050610c52565b509392505050565b610d49611964565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610d895750610d898361037e611964565b610e15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610480565b610a78838383611ebd565b610e2d848487858561223b565b600a8484604051610e3f9291906139ba565b9081526040519081900360200190205460ff1615610eb9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f455243313135354d61696e3a2055524920616c726561647920657869737473006044820152606401610480565b6009805460009182610eca83613d14565b919050559050610ef2610edb611964565b82886040518060200160405280600081525061236e565b600854604080517fd2f7265a0000000000000000000000000000000000000000000000000000000081529051610f9d9273ffffffffffffffffffffffffffffffffffffffff169163d2f7265a916004808301926020929190829003018186803b158015610f5e57600080fd5b505afa158015610f72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f969190613439565b6001611065565b610fda81600090815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6001600a8686604051610fee9291906139ba565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001694151594909417909355601f87018290048202830182019052858252610a4391839188908890819084018382808284376000920191909152506124d792505050565b8173ffffffffffffffffffffffffffffffffffffffff16611084611964565b73ffffffffffffffffffffffffffffffffffffffff161415611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610480565b8060016000611135611964565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091871680825291909352912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016921515929092179091556111a4611964565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111ed911515815260200190565b60405180910390a35050565b611206858588858561223b565b600a85856040516112189291906139ba565b9081526040519081900360200190205460ff1615611292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f455243313135354d61696e3a2055524920616c726561647920657869737473006044820152606401610480565b60098054600091826112a383613d14565b9190505590506112bc6112b4611964565b82898761236e565b600854604080517fd2f7265a00000000000000000000000000000000000000000000000000000000815290516113289273ffffffffffffffffffffffffffffffffffffffff169163d2f7265a916004808301926020929190829003018186803b158015610f5e57600080fd5b61136581600090815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6001600a87876040516113799291906139ba565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001694151594909417909355601f880182900482028301820190528682526113f091839189908990819084018382808284376000920191909152506124d792505050565b50505050505050565b60606104d682612594565b60008281526006602052604090206001015461142281610a69611964565b610a788383611dca565b73ffffffffffffffffffffffffffffffffffffffff84166114cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610480565b6114d7611964565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061151757506115178561037e611964565b6115a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610480565b60006115ad611964565b90506115ce8187876115be8861272f565b6115c78861272f565b5050505050565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8a1684529091529020548381101561168c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610480565b6116968482613bf9565b60008681526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8c811685529252808320939093558816815290812080548692906116df908490613ba4565b9091555050604080518681526020810186905273ffffffffffffffffffffffffffffffffffffffff808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46113f08288888888886127a1565b611754611964565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061179457506117948361037e611964565b611820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610480565b610a7883838361295d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014806118be57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806104d657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146104d6565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806104d657506104d68261182b565b335b90565b73ffffffffffffffffffffffffffffffffffffffff84163b15610a43576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c81906119e09089908990889088908890600401613a7a565b602060405180830381600087803b1580156119fa57600080fd5b505af1925050508015611a48575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611a45918101906137c6565b60015b611b3257611a54613dab565b806308c379a01415611aa85750611a69613dc2565b80611a745750611aaa565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104809190613b6d565b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610480565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146113f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610480565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610b4957611c5b8173ffffffffffffffffffffffffffffffffffffffff166014612b78565b611c66836020612b78565b604051602001611c779291906139f9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261048091600401613b6d565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610b4957600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611d6c611964565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615610b4957600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055611e5f611964565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b73ffffffffffffffffffffffffffffffffffffffff8316611f60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610480565b8051825114611ff1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610480565b6000611ffb611964565b604080516020810190915260009052905060005b83518110156121b5576000848281518110612053577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000848381518110612098577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908102919091018101516000848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8c168352909352919091205490915081811015612164576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610480565b61216e8282613bf9565b60009384526020848152604080862073ffffffffffffffffffffffffffffffffffffffff8c16875290915290932092909255508190506121ad81613d14565b91505061200f565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161222d929190613b48565b60405180910390a450505050565b60006122a9308787876040516020016122579493929190613977565b6040516020818303038152906040528051906020012084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e8592505050565b600754600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205490915060ff16610a43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243313135354d61696e3a205369676e65722073686f756c64207369676e2060448201527f7472616e73616374696f6e0000000000000000000000000000000000000000006064820152608401610480565b73ffffffffffffffffffffffffffffffffffffffff8416612411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610480565b600061241b611964565b905061242d816000876115be8861272f565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff891684529091528120805485929061246a908490613ba4565b9091555050604080518581526020810185905273ffffffffffffffffffffffffffffffffffffffff80881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46115c7816000878787876127a1565b60008281526005602052604090205460ff16612575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4552433131353555524953746f726167653a2055524920736574206f66206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610480565b60008281526004602090815260409091208251610a7892840190613258565b60008181526005602052604090205460609060ff16612635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433131353555524953746f726167653a2055524920717565727920666f7260448201527f206e6f6e6578697374656e7420746f6b656e00000000000000000000000000006064820152608401610480565b6000828152600460205260408120805461264e90613c75565b80601f016020809104026020016040519081016040528092919081815260200182805461267a90613c75565b80156126c75780601f1061269c576101008083540402835291602001916126c7565b820191906000526020600020905b8154815290600101906020018083116126aa57829003601f168201915b5050505050905060006126d8612f6e565b90508051600014156126ec575090506104d9565b81511561271e5780826040516020016127069291906139ca565b604051602081830303815290604052925050506104d9565b612727846104de565b949350505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110612790577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602090810291909101015292915050565b73ffffffffffffffffffffffffffffffffffffffff84163b15610a43576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e61906128189089908990889088908890600401613ae5565b602060405180830381600087803b15801561283257600080fd5b505af1925050508015612880575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261287d918101906137c6565b60015b61288c57611a54613dab565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146113f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610480565b73ffffffffffffffffffffffffffffffffffffffff8316612a00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610480565b6000612a0a611964565b9050612a3b81856000612a1c8761272f565b612a258761272f565b5050604080516020810190915260009052505050565b60008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8816845290915290205482811015612af8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610480565b612b028382613bf9565b60008581526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8a811680865291845282852095909555815189815292830188905292938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b60606000612b87836002613bbc565b612b92906002613ba4565b67ffffffffffffffff811115612bd1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612bfb576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612c59577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612ce3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000612d1f846002613bbc565b612d2a906001613ba4565b90505b6001811115612e15577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110612d92577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110612dcf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93612e0e81613c40565b9050612d2d565b508315612e7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610480565b9392505050565b600080600080845160411415612eaf5750505060208201516040830151606084015160001a612f58565b845160401415612ef65750505060408201516020830151907f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81169060ff1c601b01612f58565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610480565b612f6486828585613000565b9695505050505050565b606060038054612f7d90613c75565b80601f0160208091040260200160405190810160405280929190818152602001828054612fa990613c75565b8015612ff65780601f10612fcb57610100808354040283529160200191612ff6565b820191906000526020600020905b815481529060010190602001808311612fd957829003601f168201915b5050505050905090565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156130b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610480565b8360ff16601b14806130c757508360ff16601c145b613153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610480565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156131a7573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661324f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610480565b95945050505050565b82805461326490613c75565b90600052602060002090601f01602090048101928261328657600085556132cc565b82601f1061329f57805160ff19168380011785556132cc565b828001600101855582156132cc579182015b828111156132cc5782518255916020019190600101906132b1565b506132d89291506132dc565b5090565b5b808211156132d857600081556001016132dd565b600082601f830112613301578081fd5b8135602061330e82613b80565b60405161331b8282613cc9565b8381528281019150858301600585901b8701840188101561333a578586fd5b855b858110156133585781358452928401929084019060010161333c565b5090979650505050505050565b60008083601f840112613376578182fd5b50813567ffffffffffffffff81111561338d578182fd5b6020830191508360208285010111156133a557600080fd5b9250929050565b600082601f8301126133bc578081fd5b813567ffffffffffffffff8111156133d6576133d6613d7c565b60405161340b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160182613cc9565b81815284602083860101111561341f578283fd5b816020850160208301379081016020019190915292915050565b60006020828403121561344a578081fd5b8151612e7e81613e72565b60008060408385031215613467578081fd5b823561347281613e72565b9150602083013561348281613e72565b809150509250929050565b600080600080600060a086880312156134a4578081fd5b85356134af81613e72565b945060208601356134bf81613e72565b9350604086013567ffffffffffffffff808211156134db578283fd5b6134e789838a016132f1565b945060608801359150808211156134fc578283fd5b61350889838a016132f1565b9350608088013591508082111561351d578283fd5b5061352a888289016133ac565b9150509295509295909350565b600080600080600060a0868803121561354e578081fd5b853561355981613e72565b9450602086013561356981613e72565b93506040860135925060608601359150608086013567ffffffffffffffff811115613592578182fd5b61352a888289016133ac565b6000806000606084860312156135b2578283fd5b83356135bd81613e72565b9250602084013567ffffffffffffffff808211156135d9578384fd5b6135e5878388016132f1565b935060408601359150808211156135fa578283fd5b50613607868287016132f1565b9150509250925092565b60008060408385031215613623578182fd5b823561362e81613e72565b915060208301358015158114613482578182fd5b60008060408385031215613654578182fd5b823561365f81613e72565b946020939093013593505050565b600080600060608486031215613681578081fd5b833561368c81613e72565b95602085013595506040909401359392505050565b600080604083850312156136b3578182fd5b823567ffffffffffffffff808211156136ca578384fd5b818501915085601f8301126136dd578384fd5b813560206136ea82613b80565b6040516136f78282613cc9565b8381528281019150858301600585901b870184018b1015613716578889fd5b8896505b8487101561374157803561372d81613e72565b83526001969096019591830191830161371a565b5096505086013592505080821115613757578283fd5b50613764858286016132f1565b9150509250929050565b60006020828403121561377f578081fd5b5035919050565b60008060408385031215613798578182fd5b82359150602083013561348281613e72565b6000602082840312156137bb578081fd5b8135612e7e81613e97565b6000602082840312156137d7578081fd5b8151612e7e81613e97565b6000806000806000606086880312156137f9578283fd5b85359450602086013567ffffffffffffffff80821115613817578485fd5b61382389838a01613365565b9096509450604088013591508082111561383b578283fd5b5061384888828901613365565b969995985093965092949392505050565b60008060008060008060808789031215613871578384fd5b86359550602087013567ffffffffffffffff8082111561388f578586fd5b61389b8a838b01613365565b909750955060408901359150808211156138b3578283fd5b6138bf8a838b016133ac565b945060608901359150808211156138d4578283fd5b506138e189828a01613365565b979a9699509497509295939492505050565b6000815180845260208085019450808401835b8381101561392257815187529582019590820190600101613906565b509495945050505050565b60008151808452613945816020860160208601613c10565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60007fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008660601b1682528385601484013750601492019182015260340192915050565b6000828483379101908152919050565b600083516139dc818460208801613c10565b8351908301906139f0818360208801613c10565b01949350505050565b60007f416363657373436f6e74726f6c3a206163636f756e742000000000000000000082528351613a31816017850160208801613c10565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351613a6e816028840160208801613c10565b01602801949350505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a06040830152613ab360a08301866138f3565b8281036060840152613ac581866138f3565b90508281036080840152613ad9818561392d565b98975050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a06080830152613b2a60a083018461392d565b979650505050505050565b600060208252612e7e60208301846138f3565b600060408252613b5b60408301856138f3565b828103602084015261324f81856138f3565b600060208252612e7e602083018461392d565b600067ffffffffffffffff821115613b9a57613b9a613d7c565b5060051b60200190565b60008219821115613bb757613bb7613d4d565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bf457613bf4613d4d565b500290565b600082821015613c0b57613c0b613d4d565b500390565b60005b83811015613c2b578181015183820152602001613c13565b83811115613c3a576000848401525b50505050565b600081613c4f57613c4f613d4d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c90821680613c8957607f821691505b60208210811415613cc3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff82111715613d0d57613d0d613d7c565b6040525050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d4657613d46613d4d565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561196657600481823e5160e01c90565b600060443d1015613dd257611966565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff8160248401118184111715613e22575050505050611966565b8285019150815181811115613e3c57505050505050611966565b843d8701016020828501011115613e5857505050505050611966565b613e6760208286010187613cc9565b509094505050505090565b73ffffffffffffffffffffffffffffffffffffffff81168114613e9457600080fd5b50565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114613e9457600080fdfea2646970667358221220e5ccbc6de4296570de31e184ae4dc0062728749c4f10d4e865b8042950186aaa64736f6c63430008030033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000052930964f648b24b3402a70d265d6a23ed8d591100000000000000000000000000000000000000000000000000000000000000062f697066732f0000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101765760003560e01c806391d14854116100d8578063c45a01551161008c578063e985e9c511610066578063e985e9c514610370578063f242432a146103b9578063f5298aca146103cc57610176565b8063c45a015514610305578063c87b56dd1461034a578063d547741f1461035d57610176565b8063a217fddf116100bd578063a217fddf146102d7578063a22cb465146102df578063beb76f5f146102f257610176565b806391d1485414610288578063a1ebf35d146102ce57610176565b80632f2ff15d1161012f5780634e1273f4116101145780634e1273f4146102425780636b20c45414610262578063785cc9971461027557610176565b80632f2ff15d1461021c57806336568abe1461022f57610176565b80630e89341c116101605780630e89341c146101c4578063248a9ca3146101e45780632eb2c2d61461020757610176565b8062fdd58e1461017b57806301ffc9a7146101a1575b600080fd5b61018e610189366004613642565b6103df565b6040519081526020015b60405180910390f35b6101b46101af3660046137aa565b6104bc565b6040519015158152602001610198565b6101d76101d236600461376e565b6104de565b6040516101989190613b6d565b61018e6101f236600461376e565b60009081526006602052604090206001015490565b61021a61021536600461348d565b610572565b005b61021a61022a366004613786565b610a4b565b61021a61023d366004613786565b610a7d565b6102556102503660046136a1565b610b4d565b6040516101989190613b35565b61021a61027036600461359e565b610d41565b61021a6102833660046137e2565b610e20565b6101b4610296366004613786565b600091825260066020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61018e60075481565b61018e600081565b61021a6102ed366004613611565b611065565b61021a610300366004613859565b6111f9565b6008546103259073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610198565b6101d761035836600461376e565b6113f9565b61021a61036b366004613786565b611404565b6101b461037e366004613455565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b61021a6103c7366004613537565b61142c565b61021a6103da36600461366d565b61174c565b600073ffffffffffffffffffffffffffffffffffffffff8316610489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526020818152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052205490565b60006104c78261182b565b806104d657506104d68261190e565b90505b919050565b6060600280546104ed90613c75565b80601f016020809104026020016040519081016040528092919081815260200182805461051990613c75565b80156105665780601f1061053b57610100808354040283529160200191610566565b820191906000526020600020905b81548152906001019060200180831161054957829003601f168201915b50505050509050919050565b8151835114610603576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610480565b73ffffffffffffffffffffffffffffffffffffffff84166106a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610480565b6106ae611964565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806106ee57506106ee8561037e611964565b61077a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610480565b6000610784611964565b905060005b84518110156109b65760008582815181106107cd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000858381518110610812577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908102919091018101516000848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8e1683529093529190912054909150818110156108df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610480565b6108e98282613bf9565b60008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461099b9190613ba4565b92505081905550505050806109af90613d14565b9050610789565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610a2d929190613b48565b60405180910390a4610a43818787878787611969565b505050505050565b600082815260066020526040902060010154610a6e81610a69611964565b611c03565b610a788383611cd5565b505050565b610a85611964565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610480565b610b498282611dca565b5050565b60608151835114610be0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610480565b6000835167ffffffffffffffff811115610c23577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610c4c578160200160208202803683370190505b50905060005b8451811015610d3957610ce5858281518110610c97577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858381518110610cd8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516103df565b828281518110610d1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908102919091010152610d3281613d14565b9050610c52565b509392505050565b610d49611964565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610d895750610d898361037e611964565b610e15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610480565b610a78838383611ebd565b610e2d848487858561223b565b600a8484604051610e3f9291906139ba565b9081526040519081900360200190205460ff1615610eb9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f455243313135354d61696e3a2055524920616c726561647920657869737473006044820152606401610480565b6009805460009182610eca83613d14565b919050559050610ef2610edb611964565b82886040518060200160405280600081525061236e565b600854604080517fd2f7265a0000000000000000000000000000000000000000000000000000000081529051610f9d9273ffffffffffffffffffffffffffffffffffffffff169163d2f7265a916004808301926020929190829003018186803b158015610f5e57600080fd5b505afa158015610f72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f969190613439565b6001611065565b610fda81600090815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6001600a8686604051610fee9291906139ba565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001694151594909417909355601f87018290048202830182019052858252610a4391839188908890819084018382808284376000920191909152506124d792505050565b8173ffffffffffffffffffffffffffffffffffffffff16611084611964565b73ffffffffffffffffffffffffffffffffffffffff161415611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610480565b8060016000611135611964565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091871680825291909352912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016921515929092179091556111a4611964565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111ed911515815260200190565b60405180910390a35050565b611206858588858561223b565b600a85856040516112189291906139ba565b9081526040519081900360200190205460ff1615611292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f455243313135354d61696e3a2055524920616c726561647920657869737473006044820152606401610480565b60098054600091826112a383613d14565b9190505590506112bc6112b4611964565b82898761236e565b600854604080517fd2f7265a00000000000000000000000000000000000000000000000000000000815290516113289273ffffffffffffffffffffffffffffffffffffffff169163d2f7265a916004808301926020929190829003018186803b158015610f5e57600080fd5b61136581600090815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6001600a87876040516113799291906139ba565b908152604080516020928190038301812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001694151594909417909355601f880182900482028301820190528682526113f091839189908990819084018382808284376000920191909152506124d792505050565b50505050505050565b60606104d682612594565b60008281526006602052604090206001015461142281610a69611964565b610a788383611dca565b73ffffffffffffffffffffffffffffffffffffffff84166114cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610480565b6114d7611964565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061151757506115178561037e611964565b6115a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610480565b60006115ad611964565b90506115ce8187876115be8861272f565b6115c78861272f565b5050505050565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8a1684529091529020548381101561168c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610480565b6116968482613bf9565b60008681526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8c811685529252808320939093558816815290812080548692906116df908490613ba4565b9091555050604080518681526020810186905273ffffffffffffffffffffffffffffffffffffffff808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46113f08288888888886127a1565b611754611964565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061179457506117948361037e611964565b611820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610480565b610a7883838361295d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014806118be57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806104d657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146104d6565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806104d657506104d68261182b565b335b90565b73ffffffffffffffffffffffffffffffffffffffff84163b15610a43576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c81906119e09089908990889088908890600401613a7a565b602060405180830381600087803b1580156119fa57600080fd5b505af1925050508015611a48575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611a45918101906137c6565b60015b611b3257611a54613dab565b806308c379a01415611aa85750611a69613dc2565b80611a745750611aaa565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104809190613b6d565b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610480565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146113f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610480565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610b4957611c5b8173ffffffffffffffffffffffffffffffffffffffff166014612b78565b611c66836020612b78565b604051602001611c779291906139f9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261048091600401613b6d565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610b4957600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611d6c611964565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615610b4957600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055611e5f611964565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b73ffffffffffffffffffffffffffffffffffffffff8316611f60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610480565b8051825114611ff1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610480565b6000611ffb611964565b604080516020810190915260009052905060005b83518110156121b5576000848281518110612053577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000848381518110612098577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908102919091018101516000848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8c168352909352919091205490915081811015612164576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610480565b61216e8282613bf9565b60009384526020848152604080862073ffffffffffffffffffffffffffffffffffffffff8c16875290915290932092909255508190506121ad81613d14565b91505061200f565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161222d929190613b48565b60405180910390a450505050565b60006122a9308787876040516020016122579493929190613977565b6040516020818303038152906040528051906020012084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e8592505050565b600754600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205490915060ff16610a43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243313135354d61696e3a205369676e65722073686f756c64207369676e2060448201527f7472616e73616374696f6e0000000000000000000000000000000000000000006064820152608401610480565b73ffffffffffffffffffffffffffffffffffffffff8416612411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610480565b600061241b611964565b905061242d816000876115be8861272f565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff891684529091528120805485929061246a908490613ba4565b9091555050604080518581526020810185905273ffffffffffffffffffffffffffffffffffffffff80881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46115c7816000878787876127a1565b60008281526005602052604090205460ff16612575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4552433131353555524953746f726167653a2055524920736574206f66206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610480565b60008281526004602090815260409091208251610a7892840190613258565b60008181526005602052604090205460609060ff16612635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433131353555524953746f726167653a2055524920717565727920666f7260448201527f206e6f6e6578697374656e7420746f6b656e00000000000000000000000000006064820152608401610480565b6000828152600460205260408120805461264e90613c75565b80601f016020809104026020016040519081016040528092919081815260200182805461267a90613c75565b80156126c75780601f1061269c576101008083540402835291602001916126c7565b820191906000526020600020905b8154815290600101906020018083116126aa57829003601f168201915b5050505050905060006126d8612f6e565b90508051600014156126ec575090506104d9565b81511561271e5780826040516020016127069291906139ca565b604051602081830303815290604052925050506104d9565b612727846104de565b949350505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110612790577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602090810291909101015292915050565b73ffffffffffffffffffffffffffffffffffffffff84163b15610a43576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e61906128189089908990889088908890600401613ae5565b602060405180830381600087803b15801561283257600080fd5b505af1925050508015612880575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261287d918101906137c6565b60015b61288c57611a54613dab565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146113f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610480565b73ffffffffffffffffffffffffffffffffffffffff8316612a00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610480565b6000612a0a611964565b9050612a3b81856000612a1c8761272f565b612a258761272f565b5050604080516020810190915260009052505050565b60008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8816845290915290205482811015612af8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610480565b612b028382613bf9565b60008581526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8a811680865291845282852095909555815189815292830188905292938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b60606000612b87836002613bbc565b612b92906002613ba4565b67ffffffffffffffff811115612bd1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612bfb576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612c59577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612ce3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000612d1f846002613bbc565b612d2a906001613ba4565b90505b6001811115612e15577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110612d92577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110612dcf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93612e0e81613c40565b9050612d2d565b508315612e7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610480565b9392505050565b600080600080845160411415612eaf5750505060208201516040830151606084015160001a612f58565b845160401415612ef65750505060408201516020830151907f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81169060ff1c601b01612f58565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610480565b612f6486828585613000565b9695505050505050565b606060038054612f7d90613c75565b80601f0160208091040260200160405190810160405280929190818152602001828054612fa990613c75565b8015612ff65780601f10612fcb57610100808354040283529160200191612ff6565b820191906000526020600020905b815481529060010190602001808311612fd957829003601f168201915b5050505050905090565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156130b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610480565b8360ff16601b14806130c757508360ff16601c145b613153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610480565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156131a7573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661324f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610480565b95945050505050565b82805461326490613c75565b90600052602060002090601f01602090048101928261328657600085556132cc565b82601f1061329f57805160ff19168380011785556132cc565b828001600101855582156132cc579182015b828111156132cc5782518255916020019190600101906132b1565b506132d89291506132dc565b5090565b5b808211156132d857600081556001016132dd565b600082601f830112613301578081fd5b8135602061330e82613b80565b60405161331b8282613cc9565b8381528281019150858301600585901b8701840188101561333a578586fd5b855b858110156133585781358452928401929084019060010161333c565b5090979650505050505050565b60008083601f840112613376578182fd5b50813567ffffffffffffffff81111561338d578182fd5b6020830191508360208285010111156133a557600080fd5b9250929050565b600082601f8301126133bc578081fd5b813567ffffffffffffffff8111156133d6576133d6613d7c565b60405161340b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160182613cc9565b81815284602083860101111561341f578283fd5b816020850160208301379081016020019190915292915050565b60006020828403121561344a578081fd5b8151612e7e81613e72565b60008060408385031215613467578081fd5b823561347281613e72565b9150602083013561348281613e72565b809150509250929050565b600080600080600060a086880312156134a4578081fd5b85356134af81613e72565b945060208601356134bf81613e72565b9350604086013567ffffffffffffffff808211156134db578283fd5b6134e789838a016132f1565b945060608801359150808211156134fc578283fd5b61350889838a016132f1565b9350608088013591508082111561351d578283fd5b5061352a888289016133ac565b9150509295509295909350565b600080600080600060a0868803121561354e578081fd5b853561355981613e72565b9450602086013561356981613e72565b93506040860135925060608601359150608086013567ffffffffffffffff811115613592578182fd5b61352a888289016133ac565b6000806000606084860312156135b2578283fd5b83356135bd81613e72565b9250602084013567ffffffffffffffff808211156135d9578384fd5b6135e5878388016132f1565b935060408601359150808211156135fa578283fd5b50613607868287016132f1565b9150509250925092565b60008060408385031215613623578182fd5b823561362e81613e72565b915060208301358015158114613482578182fd5b60008060408385031215613654578182fd5b823561365f81613e72565b946020939093013593505050565b600080600060608486031215613681578081fd5b833561368c81613e72565b95602085013595506040909401359392505050565b600080604083850312156136b3578182fd5b823567ffffffffffffffff808211156136ca578384fd5b818501915085601f8301126136dd578384fd5b813560206136ea82613b80565b6040516136f78282613cc9565b8381528281019150858301600585901b870184018b1015613716578889fd5b8896505b8487101561374157803561372d81613e72565b83526001969096019591830191830161371a565b5096505086013592505080821115613757578283fd5b50613764858286016132f1565b9150509250929050565b60006020828403121561377f578081fd5b5035919050565b60008060408385031215613798578182fd5b82359150602083013561348281613e72565b6000602082840312156137bb578081fd5b8135612e7e81613e97565b6000602082840312156137d7578081fd5b8151612e7e81613e97565b6000806000806000606086880312156137f9578283fd5b85359450602086013567ffffffffffffffff80821115613817578485fd5b61382389838a01613365565b9096509450604088013591508082111561383b578283fd5b5061384888828901613365565b969995985093965092949392505050565b60008060008060008060808789031215613871578384fd5b86359550602087013567ffffffffffffffff8082111561388f578586fd5b61389b8a838b01613365565b909750955060408901359150808211156138b3578283fd5b6138bf8a838b016133ac565b945060608901359150808211156138d4578283fd5b506138e189828a01613365565b979a9699509497509295939492505050565b6000815180845260208085019450808401835b8381101561392257815187529582019590820190600101613906565b509495945050505050565b60008151808452613945816020860160208601613c10565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60007fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008660601b1682528385601484013750601492019182015260340192915050565b6000828483379101908152919050565b600083516139dc818460208801613c10565b8351908301906139f0818360208801613c10565b01949350505050565b60007f416363657373436f6e74726f6c3a206163636f756e742000000000000000000082528351613a31816017850160208801613c10565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351613a6e816028840160208801613c10565b01602801949350505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a06040830152613ab360a08301866138f3565b8281036060840152613ac581866138f3565b90508281036080840152613ad9818561392d565b98975050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a06080830152613b2a60a083018461392d565b979650505050505050565b600060208252612e7e60208301846138f3565b600060408252613b5b60408301856138f3565b828103602084015261324f81856138f3565b600060208252612e7e602083018461392d565b600067ffffffffffffffff821115613b9a57613b9a613d7c565b5060051b60200190565b60008219821115613bb757613bb7613d4d565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bf457613bf4613d4d565b500290565b600082821015613c0b57613c0b613d4d565b500390565b60005b83811015613c2b578181015183820152602001613c13565b83811115613c3a576000848401525b50505050565b600081613c4f57613c4f613d4d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c90821680613c8957607f821691505b60208210811415613cc3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff82111715613d0d57613d0d613d7c565b6040525050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d4657613d46613d4d565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561196657600481823e5160e01c90565b600060443d1015613dd257611966565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff8160248401118184111715613e22575050505050611966565b8285019150815181811115613e3c57505050505050611966565b843d8701016020828501011115613e5857505050505050611966565b613e6760208286010187613cc9565b509094505050505090565b73ffffffffffffffffffffffffffffffffffffffff81168114613e9457600080fd5b50565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114613e9457600080fdfea2646970667358221220e5ccbc6de4296570de31e184ae4dc0062728749c4f10d4e865b8042950186aaa64736f6c63430008030033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000052930964f648b24b3402a70d265d6a23ed8d591100000000000000000000000000000000000000000000000000000000000000062f697066732f0000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _baseUri (string): /ipfs/
Arg [1] : signer (address): 0x52930964f648B24b3402A70d265D6A23ed8D5911
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000052930964f648b24b3402a70d265d6a23ed8d5911
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [3] : 2f697066732f0000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
50468:2602:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19907:231;;;;;;:::i;:::-;;:::i;:::-;;;16311:25:1;;;16299:2;16284:18;19907:231:0;;;;;;;;52083:303;;;;;;:::i;:::-;;:::i;:::-;;;16138:14:1;;16131:22;16113:41;;16101:2;16086:18;52083:303:0;16068:92:1;19651:105:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;40152:123::-;;;;;;:::i;:::-;40218:7;40245:12;;;:6;:12;;;;;:22;;;;40152:123;22610:1239;;;;;;:::i;:::-;;:::i;:::-;;40537:147;;;;;;:::i;:::-;;:::i;41585:218::-;;;;;;:::i;:::-;;:::i;20304:549::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;32329:319::-;;;;;;:::i;:::-;;:::i;50960:539::-;;;;;;:::i;:::-;;:::i;39150:139::-;;;;;;:::i;:::-;39228:4;39252:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;;;;;;;39150:139;50549:53;;;;;;37115:49;;37160:4;37115:49;;20926:311;;;;;;:::i;:::-;;:::i;51507:568::-;;;;;;:::i;:::-;;:::i;50609:22::-;;;;;;;;;;;;13740:42:1;13728:55;;;13710:74;;13698:2;13683:18;50609:22:0;13665:125:1;52394:218:0;;;;;;:::i;:::-;;:::i;40929:149::-;;;;;;:::i;:::-;;:::i;21309:168::-;;;;;;:::i;:::-;21432:27;;;;21408:4;21432:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;21309:168;21549:984;;;;;;:::i;:::-;;:::i;32034:287::-;;;;;;:::i;:::-;;:::i;19907:231::-;19993:7;20021:21;;;20013:77;;;;;;;19080:2:1;20013:77:0;;;19062:21:1;19119:2;19099:18;;;19092:30;19158:34;19138:18;;;19131:62;19229:13;19209:18;;;19202:41;19260:19;;20013:77:0;;;;;;;;;-1:-1:-1;20108:9:0;:13;;;;;;;;;;;:22;;;;;;;;;;;;;19907:231::o;52083:303::-;52237:4;52279:38;52305:11;52279:25;:38::i;:::-;:99;;;;52334:44;52366:11;52334:31;:44::i;:::-;52259:119;;52083:303;;;;:::o;19651:105::-;19711:13;19744:4;19737:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19651:105;;;:::o;22610:1239::-;22875:7;:14;22861:3;:10;:28;22853:81;;;;;;;24764:2:1;22853:81:0;;;24746:21:1;24803:2;24783:18;;;24776:30;24842:34;24822:18;;;24815:62;24913:10;24893:18;;;24886:38;24941:19;;22853:81:0;24736:230:1;22853:81:0;22953:16;;;22945:66;;;;;;;21541:2:1;22945:66:0;;;21523:21:1;21580:2;21560:18;;;21553:30;21619:34;21599:18;;;21592:62;21690:7;21670:18;;;21663:35;21715:19;;22945:66:0;21513:227:1;22945:66:0;23052:12;:10;:12::i;:::-;23044:20;;:4;:20;;;:60;;;;23068:36;23085:4;23091:12;:10;:12::i;23068:36::-;23022:160;;;;;;;21947:2:1;23022:160:0;;;21929:21:1;21986:2;21966:18;;;21959:30;22025:34;22005:18;;;21998:62;22096:20;22076:18;;;22069:48;22134:19;;23022:160:0;21919:240:1;23022:160:0;23195:16;23214:12;:10;:12::i;:::-;23195:31;;23317:9;23312:377;23336:3;:10;23332:1;:14;23312:377;;;23368:10;23381:3;23385:1;23381:6;;;;;;;;;;;;;;;;;;;;;;23368:19;;23402:14;23419:7;23427:1;23419:10;;;;;;;;;;;;;;;;;;;;;;;;;;;23446:19;23468:13;;;;;;;;;;:19;;;;;;;;;;;;;23419:10;;-1:-1:-1;23510:21:0;;;;23502:76;;;;;;;23173:2:1;23502:76:0;;;23155:21:1;23212:2;23192:18;;;23185:30;23251:34;23231:18;;;23224:62;23322:12;23302:18;;;23295:40;23352:19;;23502:76:0;23145:232:1;23502:76:0;23615:20;23629:6;23615:11;:20;:::i;:::-;23593:9;:13;23603:2;23593:13;;;;;;;;;;;:19;23607:4;23593:19;;;;;;;;;;;;;;;:42;;;;23671:6;23650:9;:13;23660:2;23650:13;;;;;;;;;;;:17;23664:2;23650:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;23312:377;;;23348:3;;;;:::i;:::-;;;23312:377;;;;23736:2;23706:47;;23730:4;23706:47;;23720:8;23706:47;;;23740:3;23745:7;23706:47;;;;;;;:::i;:::-;;;;;;;;23766:75;23802:8;23812:4;23818:2;23822:3;23827:7;23836:4;23766:35;:75::i;:::-;22610:1239;;;;;;:::o;40537:147::-;40218:7;40245:12;;;:6;:12;;;;;:22;;;38719:30;38730:4;38736:12;:10;:12::i;:::-;38719:10;:30::i;:::-;40651:25:::1;40662:4;40668:7;40651:10;:25::i;:::-;40537:147:::0;;;:::o;41585:218::-;41692:12;:10;:12::i;:::-;41681:23;;:7;:23;;;41673:83;;;;;;;25991:2:1;41673:83:0;;;25973:21:1;26030:2;26010:18;;;26003:30;26069:34;26049:18;;;26042:62;26140:17;26120:18;;;26113:45;26175:19;;41673:83:0;25963:237:1;41673:83:0;41769:26;41781:4;41787:7;41769:11;:26::i;:::-;41585:218;;:::o;20304:549::-;20485:16;20546:3;:10;20527:8;:15;:29;20519:83;;;;;;;24354:2:1;20519:83:0;;;24336:21:1;24393:2;24373:18;;;24366:30;24432:34;24412:18;;;24405:62;24503:11;24483:18;;;24476:39;24532:19;;20519:83:0;24326:231:1;20519:83:0;20615:30;20662:8;:15;20648:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20648:30:0;;20615:63;;20696:9;20691:122;20715:8;:15;20711:1;:19;20691:122;;;20771:30;20781:8;20790:1;20781:11;;;;;;;;;;;;;;;;;;;;;;20794:3;20798:1;20794:6;;;;;;;;;;;;;;;;;;;;;;20771:9;:30::i;:::-;20752:13;20766:1;20752:16;;;;;;;;;;;;;;;;;;;;;;;;;:49;20732:3;;;:::i;:::-;;;20691:122;;;-1:-1:-1;20832:13:0;20304:549;-1:-1:-1;;;20304:549:0:o;32329:319::-;32471:12;:10;:12::i;:::-;32460:23;;:7;:23;;;:66;;;;32487:39;32504:7;32513:12;:10;:12::i;32487:39::-;32438:157;;;;;;;20309:2:1;32438:157:0;;;20291:21:1;20348:2;20328:18;;;20321:30;20387:34;20367:18;;;20360:62;20458:11;20438:18;;;20431:39;20487:19;;32438:157:0;20281:231:1;32438:157:0;32608:32;32619:7;32628:3;32633:6;32608:10;:32::i;50960:539::-;51097:43;51111:9;;51122:6;51130:9;;51097:13;:43::i;:::-;51160:15;51176:9;;51160:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;51159:27;51151:71;;;;;;;23584:2:1;51151:71:0;;;23566:21:1;23623:2;23603:18;;;23596:30;23662:33;23642:18;;;23635:61;23713:18;;51151:71:0;23556:181:1;51151:71:0;51248:13;:15;;51235:10;;;51248:15;;;:::i;:::-;;;;;51235:28;;51274:35;51280:12;:10;:12::i;:::-;51294:2;51298:6;51274:35;;;;;;;;;;;;:5;:35::i;:::-;51356:7;;51338:37;;;;;;;;51320:62;;51356:7;;;51338:35;;:37;;;;;;;;;;;;;;51356:7;51338:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51377:4;51320:17;:62::i;:::-;51393:16;51406:2;50356:13;;;;:9;:13;;;;;:20;;;;50372:4;50356:20;;;50294:90;51393:16;51449:4;51420:15;51436:9;;51420:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;51464:27;;;;;;;;;;;;;;;;;;;51477:2;;51481:9;;51464:27;;;;;;51481:9;51464:27;;51481:9;51464:27;;;;;;;;;-1:-1:-1;51464:12:0;;-1:-1:-1;;;51464:27:0:i;20926:311::-;21045:8;21029:24;;:12;:10;:12::i;:::-;:24;;;;21021:78;;;;;;;23944:2:1;21021:78:0;;;23926:21:1;23983:2;23963:18;;;23956:30;24022:34;24002:18;;;23995:62;24093:11;24073:18;;;24066:39;24122:19;;21021:78:0;23916:231:1;21021:78:0;21157:8;21112:18;:32;21131:12;:10;:12::i;:::-;21112:32;;;;;;;;;;;;;;;;;;-1:-1:-1;21112:32:0;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;;21196:12;:10;:12::i;:::-;21181:48;;;21220:8;21181:48;;;;16138:14:1;16131:22;16113:41;;16101:2;16086:18;;16068:92;21181:48:0;;;;;;;;20926:311;;:::o;51507:568::-;51672:43;51686:9;;51697:6;51705:9;;51672:13;:43::i;:::-;51735:15;51751:9;;51735:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;51734:27;51726:71;;;;;;;23584:2:1;51726:71:0;;;23566:21:1;23623:2;23603:18;;;23596:30;23662:33;23642:18;;;23635:61;23713:18;;51726:71:0;23556:181:1;51726:71:0;51823:13;:15;;51810:10;;;51823:15;;;:::i;:::-;;;;;51810:28;;51849:37;51855:12;:10;:12::i;:::-;51869:2;51873:6;51881:4;51849:5;:37::i;:::-;51933:7;;51915:37;;;;;;;;51897:62;;51933:7;;;51915:35;;:37;;;;;;;;;;;;;;51933:7;51915:37;;;;;;;;;;51897:62;51970:16;51983:2;50356:13;;;;:9;:13;;;;;:20;;;;50372:4;50356:20;;;50294:90;51970:16;52026:4;51997:15;52013:9;;51997:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;52041:26;;;;;;;;;;;;;;;;;;;52054:2;;52057:9;;52041:26;;;;;;52057:9;52041:26;;52057:9;52041:26;;;;;;;;;-1:-1:-1;52041:12:0;;-1:-1:-1;;;52041:26:0:i;:::-;51507:568;;;;;;;:::o;52394:218::-;52531:13;52569:35;52596:7;52569:26;:35::i;40929:149::-;40218:7;40245:12;;;:6;:12;;;;;:22;;;38719:30;38730:4;38736:12;:10;:12::i;38719:30::-;41044:26:::1;41056:4;41062:7;41044:11;:26::i;21549:984::-:0;21775:16;;;21767:66;;;;;;;21541:2:1;21767:66:0;;;21523:21:1;21580:2;21560:18;;;21553:30;21619:34;21599:18;;;21592:62;21690:7;21670:18;;;21663:35;21715:19;;21767:66:0;21513:227:1;21767:66:0;21874:12;:10;:12::i;:::-;21866:20;;:4;:20;;;:60;;;;21890:36;21907:4;21913:12;:10;:12::i;21890:36::-;21844:151;;;;;;;20309:2:1;21844:151:0;;;20291:21:1;20348:2;20328:18;;;20321:30;20387:34;20367:18;;;20360:62;20458:11;20438:18;;;20431:39;20487:19;;21844:151:0;20281:231:1;21844:151:0;22008:16;22027:12;:10;:12::i;:::-;22008:31;;22052:96;22073:8;22083:4;22089:2;22093:21;22111:2;22093:17;:21::i;:::-;22116:25;22134:6;22116:17;:25::i;:::-;22610:1239;;;;;;22052:96;22161:19;22183:13;;;;;;;;;;;:19;;;;;;;;;;;22221:21;;;;22213:76;;;;;;;23173:2:1;22213:76:0;;;23155:21:1;23212:2;23192:18;;;23185:30;23251:34;23231:18;;;23224:62;23322:12;23302:18;;;23295:40;23352:19;;22213:76:0;23145:232:1;22213:76:0;22322:20;22336:6;22322:11;:20;:::i;:::-;22300:9;:13;;;;;;;;;;;:19;;;;;;;;;;;:42;;;;22353:17;;;;;;;:27;;22374:6;;22300:9;22353:27;;22374:6;;22353:27;:::i;:::-;;;;-1:-1:-1;;22398:46:0;;;26561:25:1;;;26617:2;26602:18;;26595:34;;;22398:46:0;;;;;;;;;;;;;;;26534:18:1;22398:46:0;;;;;;;22457:68;22488:8;22498:4;22504:2;22508;22512:6;22520:4;22457:30;:68::i;32034:287::-;32151:12;:10;:12::i;:::-;32140:23;;:7;:23;;;:66;;;;32167:39;32184:7;32193:12;:10;:12::i;32167:39::-;32118:157;;;;;;;20309:2:1;32118:157:0;;;20291:21:1;20348:2;20328:18;;;20321:30;20387:34;20367:18;;;20360:62;20458:11;20438:18;;;20431:39;20487:19;;32118:157:0;20281:231:1;32118:157:0;32288:25;32294:7;32303:2;32307:5;32288;:25::i;18943:297::-;19045:4;19069:41;;;19084:26;19069:41;;:110;;-1:-1:-1;19127:52:0;;;19142:37;19127:52;19069:110;:163;;;-1:-1:-1;17879:25:0;17864:40;;;;19196:36;17755:157;38841:217;38926:4;38950:47;;;38965:32;38950:47;;:100;;;39014:36;39038:11;39014:23;:36::i;16603:98::-;16683:10;16603:98;;:::o;30666:799::-;30920:13;;;9081:20;9120:8;30916:542;;30956:79;;;;;:43;;;;;;:79;;31000:8;;31010:4;;31016:3;;31021:7;;31030:4;;30956:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30956:79:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30952:495;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;31320:6;31313:14;;;;;;;;;;;:::i;30952:495::-;;;31369:62;;;;;17529:2:1;31369:62:0;;;17511:21:1;17568:2;17548:18;;;17541:30;17607:34;17587:18;;;17580:62;17678:22;17658:18;;;17651:50;17718:19;;31369:62:0;17501:242:1;30952:495:0;31085:64;;;31097:52;31085:64;31081:163;;31174:50;;;;;18311:2:1;31174:50:0;;;18293:21:1;18350:2;18330:18;;;18323:30;18389:34;18369:18;;;18362:62;18460:10;18440:18;;;18433:38;18488:19;;31174:50:0;18283:230:1;39579:384:0;39228:4;39252:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;;;;39655:301;;39791:41;39819:7;39791:41;;39829:2;39791:19;:41::i;:::-;39889:38;39917:4;39924:2;39889:19;:38::i;:::-;39712:230;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;39698:246;;;;;;;;:::i;42833:229::-;39228:4;39252:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;;;;42903:152;;42947:12;;;;:6;:12;;;;;;;;:29;;;;;;;;;;:36;;;;42979:4;42947:36;;;43030:12;:10;:12::i;:::-;43003:40;;43021:7;43003:40;;43015:4;43003:40;;;;;;;;;;42833:229;;:::o;43070:230::-;39228:4;39252:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;;;;43141:152;;;43216:5;43184:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;:37;;;;;;43268:12;:10;:12::i;:::-;43241:40;;43259:7;43241:40;;43253:4;43241:40;;;;;;;;;;43070:230;;:::o;27850:837::-;27971:21;;;27963:69;;;;;;;22769:2:1;27963:69:0;;;22751:21:1;22808:2;22788:18;;;22781:30;22847:34;22827:18;;;22820:62;22918:5;22898:18;;;22891:33;22941:19;;27963:69:0;22741:225:1;27963:69:0;28065:7;:14;28051:3;:10;:28;28043:81;;;;;;;24764:2:1;28043:81:0;;;24746:21:1;24803:2;24783:18;;;24776:30;24842:34;24822:18;;;24815:62;24913:10;24893:18;;;24886:38;24941:19;;28043:81:0;24736:230:1;28043:81:0;28137:16;28156:12;:10;:12::i;:::-;28181:69;;;;;;;;;28229:1;28181:69;;28137:31;-1:-1:-1;28268:6:0;28263:341;28284:3;:10;28280:1;:14;28263:341;;;28316:10;28329:3;28333:1;28329:6;;;;;;;;;;;;;;;;;;;;;;28316:19;;28350:14;28367:7;28375:1;28367:10;;;;;;;;;;;;;;;;;;;;;;;;;;;28394:22;28419:13;;;;;;;;;;:22;;;;;;;;;;;;;28367:10;;-1:-1:-1;28464:24:0;;;;28456:73;;;;;;;19904:2:1;28456:73:0;;;19886:21:1;19943:2;19923:18;;;19916:30;19982:34;19962:18;;;19955:62;20053:6;20033:18;;;20026:34;20077:19;;28456:73:0;19876:226:1;28456:73:0;28569:23;28586:6;28569:14;:23;:::i;:::-;28544:9;:13;;;;;;;;;;;:22;;;;;;;;;;;:48;;;;-1:-1:-1;28296:3:0;;-1:-1:-1;28296:3:0;;;:::i;:::-;;;;28263:341;;;;28662:1;28621:58;;28645:7;28621:58;;28635:8;28621:58;;;28666:3;28671:7;28621:58;;;;;;;:::i;:::-;;;;;;;;27850:837;;;;:::o;52620:447::-;52770:14;52800:127;52859:4;52865:9;;52876:6;52842:41;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52832:52;;;;;;52903:9;;52800:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52800:13:0;;-1:-1:-1;;;52800:127:0:i;:::-;52968:11;;39228:4;39252:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;;52770:157;;-1:-1:-1;39252:29:0;;52938:121;;;;;;;19492:2:1;52938:121:0;;;19474:21:1;19531:2;19511:18;;;19504:30;19570:34;19550:18;;;19543:62;19641:13;19621:18;;;19614:41;19672:19;;52938:121:0;19464:233:1;25182:556:0;25297:21;;;25289:67;;;;;;;25173:2:1;25289:67:0;;;25155:21:1;25212:2;25192:18;;;25185:30;25251:34;25231:18;;;25224:62;25322:3;25302:18;;;25295:31;25343:19;;25289:67:0;25145:223:1;25289:67:0;25369:16;25388:12;:10;:12::i;:::-;25369:31;;25413:107;25434:8;25452:1;25456:7;25465:21;25483:2;25465:17;:21::i;25413:107::-;25533:9;:13;;;;;;;;;;;:22;;;;;;;;;;:32;;25559:6;;25533:9;:32;;25559:6;;25533:32;:::i;:::-;;;;-1:-1:-1;;25581:57:0;;;26561:25:1;;;26617:2;26602:18;;26595:34;;;25581:57:0;;;;;25614:1;;25581:57;;;;;;26534:18:1;25581:57:0;;;;;;;25651:79;25682:8;25700:1;25704:7;25713:2;25717:6;25725:4;25651:30;:79::i;49824:220::-;49924:18;;;;:9;:18;;;;;;;;49916:78;;;;;;;25575:2:1;49916:78:0;;;25557:21:1;25614:2;25594:18;;;25587:30;25653:34;25633:18;;;25626:62;25724:17;25704:18;;;25697:45;25759:19;;49916:78:0;25547:237:1;49916:78:0;50005:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;49148:668::-;49246:18;;;;:9;:18;;;;;;49212:13;;49246:18;;49238:81;;;;;;;20719:2:1;49238:81:0;;;20701:21:1;20758:2;20738:18;;;20731:30;20797:34;20777:18;;;20770:62;20868:20;20848:18;;;20841:48;20906:19;;49238:81:0;20691:240:1;49238:81:0;49332:23;49358:19;;;:10;:19;;;;;49332:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49388:18;49409:10;:8;:10::i;:::-;49388:31;;49501:4;49495:18;49517:1;49495:23;49491:72;;;-1:-1:-1;49542:9:0;-1:-1:-1;49535:16:0;;49491:72;49667:23;;:27;49663:108;;49742:4;49748:9;49725:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49711:48;;;;;;49663:108;49790:18;49800:7;49790:9;:18::i;:::-;49783:25;49148:668;-1:-1:-1;;;;49148:668:0:o;31473:198::-;31593:16;;;31607:1;31593:16;;;;;;;;;31539;;31568:22;;31593:16;;;;;;;;;;;;-1:-1:-1;31593:16:0;31568:41;;31631:7;31620:5;31626:1;31620:8;;;;;;;;;;;;;;;;;;;;;;;;;:18;31658:5;31473:198;-1:-1:-1;;31473:198:0:o;29896:762::-;30125:13;;;9081:20;9120:8;30121:530;;30161:72;;;;;:38;;;;;;:72;;30200:8;;30210:4;;30216:2;;30220:6;;30228:4;;30161:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30161:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30157:483;;;;:::i;:::-;30283:59;;;30295:47;30283:59;30279:158;;30367:50;;;;;18311:2:1;30367:50:0;;;18293:21:1;18350:2;18330:18;;;18323:30;18389:34;18369:18;;;18362:62;18460:10;18440:18;;;18433:38;18488:19;;30367:50:0;18283:230:1;27042:605:0;27138:21;;;27130:69;;;;;;;22769:2:1;27130:69:0;;;22751:21:1;22808:2;22788:18;;;22781:30;22847:34;22827:18;;;22820:62;22918:5;22898:18;;;22891:33;22941:19;;27130:69:0;22741:225:1;27130:69:0;27212:16;27231:12;:10;:12::i;:::-;27212:31;;27256:105;27277:8;27287:7;27304:1;27308:21;27326:2;27308:17;:21::i;:::-;27331:25;27349:6;27331:17;:25::i;:::-;-1:-1:-1;;27256:105:0;;;;;;;;;-1:-1:-1;27256:105:0;;-1:-1:-1;;;22610:1239:0;27256:105;27374:22;27399:13;;;;;;;;;;;:22;;;;;;;;;;;27440:24;;;;27432:73;;;;;;;19904:2:1;27432:73:0;;;19886:21:1;19943:2;19923:18;;;19916:30;19982:34;19962:18;;;19955:62;20053:6;20033:18;;;20026:34;20077:19;;27432:73:0;19876:226:1;27432:73:0;27541:23;27558:6;27541:14;:23;:::i;:::-;27516:9;:13;;;;;;;;;;;:22;;;;;;;;;;;;;:48;;;;27582:57;;26561:25:1;;;26602:18;;;26595:34;;;27516:9:0;;27582:57;;;;;26534:18:1;27582:57:0;;;;;;;27042:605;;;;;:::o;34269:447::-;34344:13;34370:19;34402:10;34406:6;34402:1;:10;:::i;:::-;:14;;34415:1;34402:14;:::i;:::-;34392:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34392:25:0;;34370:47;;34428:15;:6;34435:1;34428:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;34454;:6;34461:1;34454:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;-1:-1:-1;34485:9:0;34497:10;34501:6;34497:1;:10;:::i;:::-;:14;;34510:1;34497:14;:::i;:::-;34485:26;;34480:131;34517:1;34513;:5;34480:131;;;34552:8;34561:5;34569:3;34561:11;34552:21;;;;;;;;;;;;;;;;;;34540:6;34547:1;34540:9;;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;-1:-1:-1;34598:1:0;34588:11;;;;;34520:3;;;:::i;:::-;;;34480:131;;;-1:-1:-1;34629:10:0;;34621:55;;;;;;;17950:2:1;34621:55:0;;;17932:21:1;;;17969:18;;;17962:30;18028:34;18008:18;;;18001:62;18080:18;;34621:55:0;17922:182:1;34621:55:0;34701:6;34269:447;-1:-1:-1;;;34269:447:0:o;44436:1492::-;44514:7;44591:9;44611;44631:7;44851:9;:16;44871:2;44851:22;44847:1032;;;-1:-1:-1;;;45138:4:0;45123:20;;45117:27;45188:4;45173:20;;45167:27;45246:4;45231:20;;45225:27;45222:1;45217:36;45093:175;;;45289:9;:16;45309:2;45289:22;45285:594;;;-1:-1:-1;;;45581:4:0;45566:20;;45560:27;45631:4;45616:20;;45610:27;;45668:66;45660:75;;;45766:3;45762:12;45776:2;45758:21;45531:263;;;45826:41;;;;;18720:2:1;45826:41:0;;;18702:21:1;18759:2;18739:18;;;18732:30;18798:33;18778:18;;;18771:61;18849:18;;45826:41:0;18692:181:1;45285:594:0;45898:22;45906:4;45912:1;45915;45918;45898:7;:22::i;:::-;45891:29;44436:1492;-1:-1:-1;;;;;;44436:1492:0:o;50187:99::-;50238:13;50271:7;50264:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50187:99;:::o;46067:1432::-;46152:7;47077:66;47063:80;;;47055:127;;;;;;;21138:2:1;47055:127:0;;;21120:21:1;21177:2;21157:18;;;21150:30;21216:34;21196:18;;;21189:62;21287:4;21267:18;;;21260:32;21309:19;;47055:127:0;21110:224:1;47055:127:0;47201:1;:7;;47206:2;47201:7;:18;;;;47212:1;:7;;47217:2;47212:7;47201:18;47193:65;;;;;;;22366:2:1;47193:65:0;;;22348:21:1;22405:2;22385:18;;;22378:30;22444:34;22424:18;;;22417:62;22515:4;22495:18;;;22488:32;22537:19;;47193:65:0;22338:224:1;47193:65:0;47373:24;;;47356:14;47373:24;;;;;;;;;16574:25:1;;;16647:4;16635:17;;16615:18;;;16608:45;;;;16669:18;;;16662:34;;;16712:18;;;16705:34;;;47373:24:0;;16546:19:1;;47373:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47373:24:0;;;;;;-1:-1:-1;;47416:20:0;;;47408:57;;;;;;;17176:2:1;47408:57:0;;;17158:21:1;17215:2;17195:18;;;17188:30;17254:26;17234:18;;;17227:54;17298:18;;47408:57:0;17148:174:1;47408:57:0;47485:6;46067:1432;-1:-1:-1;;;;;46067:1432:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:755:1;;121:3;114:4;106:6;102:17;98:27;88:2;;143:5;136;129:20;88:2;183:6;170:20;209:4;232:43;272:2;232:43;:::i;:::-;304:2;298:9;316:31;344:2;336:6;316:31;:::i;:::-;382:18;;;416:15;;;;-1:-1:-1;451:15:1;;;501:1;497:10;;;485:23;;481:32;;478:41;-1:-1:-1;475:2:1;;;536:5;529;522:20;475:2;562:5;576:163;590:2;587:1;584:9;576:163;;;647:17;;635:30;;685:12;;;;717;;;;608:1;601:9;576:163;;;-1:-1:-1;757:6:1;;78:691;-1:-1:-1;;;;;;;78:691:1:o;774:375::-;;;889:3;882:4;874:6;870:17;866:27;856:2;;914:8;904;897:26;856:2;-1:-1:-1;944:20:1;;987:18;976:30;;973:2;;;1026:8;1016;1009:26;973:2;1070:4;1062:6;1058:17;1046:29;;1122:3;1115:4;1106:6;1098;1094:19;1090:30;1087:39;1084:2;;;1139:1;1136;1129:12;1084:2;846:303;;;;;:::o;1154:634::-;;1249:3;1242:4;1234:6;1230:17;1226:27;1216:2;;1271:5;1264;1257:20;1216:2;1311:6;1298:20;1337:18;1333:2;1330:26;1327:2;;;1359:18;;:::i;:::-;1408:2;1402:9;1420:126;1540:4;1471:66;1464:4;1460:2;1456:13;1452:86;1448:97;1440:6;1420:126;:::i;:::-;1570:2;1562:6;1555:18;1616:3;1609:4;1604:2;1596:6;1592:15;1588:26;1585:35;1582:2;;;1637:5;1630;1623:20;1582:2;1705;1698:4;1690:6;1686:17;1679:4;1671:6;1667:17;1654:54;1728:15;;;1745:4;1724:26;1717:41;;;;1732:6;1206:582;-1:-1:-1;;1206:582:1:o;1793:261::-;;1916:2;1904:9;1895:7;1891:23;1887:32;1884:2;;;1937:6;1929;1922:22;1884:2;1974:9;1968:16;1993:31;2018:5;1993:31;:::i;2059:398::-;;;2188:2;2176:9;2167:7;2163:23;2159:32;2156:2;;;2209:6;2201;2194:22;2156:2;2253:9;2240:23;2272:31;2297:5;2272:31;:::i;:::-;2322:5;-1:-1:-1;2379:2:1;2364:18;;2351:32;2392:33;2351:32;2392:33;:::i;:::-;2444:7;2434:17;;;2146:311;;;;;:::o;2462:1111::-;;;;;;2701:3;2689:9;2680:7;2676:23;2672:33;2669:2;;;2723:6;2715;2708:22;2669:2;2767:9;2754:23;2786:31;2811:5;2786:31;:::i;:::-;2836:5;-1:-1:-1;2893:2:1;2878:18;;2865:32;2906:33;2865:32;2906:33;:::i;:::-;2958:7;-1:-1:-1;3016:2:1;3001:18;;2988:32;3039:18;3069:14;;;3066:2;;;3101:6;3093;3086:22;3066:2;3129:61;3182:7;3173:6;3162:9;3158:22;3129:61;:::i;:::-;3119:71;;3243:2;3232:9;3228:18;3215:32;3199:48;;3272:2;3262:8;3259:16;3256:2;;;3293:6;3285;3278:22;3256:2;3321:63;3376:7;3365:8;3354:9;3350:24;3321:63;:::i;:::-;3311:73;;3437:3;3426:9;3422:19;3409:33;3393:49;;3467:2;3457:8;3454:16;3451:2;;;3488:6;3480;3473:22;3451:2;;3516:51;3559:7;3548:8;3537:9;3533:24;3516:51;:::i;:::-;3506:61;;;2659:914;;;;;;;;:::o;3578:754::-;;;;;;3767:3;3755:9;3746:7;3742:23;3738:33;3735:2;;;3789:6;3781;3774:22;3735:2;3833:9;3820:23;3852:31;3877:5;3852:31;:::i;:::-;3902:5;-1:-1:-1;3959:2:1;3944:18;;3931:32;3972:33;3931:32;3972:33;:::i;:::-;4024:7;-1:-1:-1;4078:2:1;4063:18;;4050:32;;-1:-1:-1;4129:2:1;4114:18;;4101:32;;-1:-1:-1;4184:3:1;4169:19;;4156:33;4212:18;4201:30;;4198:2;;;4249:6;4241;4234:22;4198:2;4277:49;4318:7;4309:6;4298:9;4294:22;4277:49;:::i;4337:760::-;;;;4533:2;4521:9;4512:7;4508:23;4504:32;4501:2;;;4554:6;4546;4539:22;4501:2;4598:9;4585:23;4617:31;4642:5;4617:31;:::i;:::-;4667:5;-1:-1:-1;4723:2:1;4708:18;;4695:32;4746:18;4776:14;;;4773:2;;;4808:6;4800;4793:22;4773:2;4836:61;4889:7;4880:6;4869:9;4865:22;4836:61;:::i;:::-;4826:71;;4950:2;4939:9;4935:18;4922:32;4906:48;;4979:2;4969:8;4966:16;4963:2;;;5000:6;4992;4985:22;4963:2;;5028:63;5083:7;5072:8;5061:9;5057:24;5028:63;:::i;:::-;5018:73;;;4491:606;;;;;:::o;5102:436::-;;;5228:2;5216:9;5207:7;5203:23;5199:32;5196:2;;;5249:6;5241;5234:22;5196:2;5293:9;5280:23;5312:31;5337:5;5312:31;:::i;:::-;5362:5;-1:-1:-1;5419:2:1;5404:18;;5391:32;5461:15;;5454:23;5442:36;;5432:2;;5497:6;5489;5482:22;5543:325;;;5672:2;5660:9;5651:7;5647:23;5643:32;5640:2;;;5693:6;5685;5678:22;5640:2;5737:9;5724:23;5756:31;5781:5;5756:31;:::i;:::-;5806:5;5858:2;5843:18;;;;5830:32;;-1:-1:-1;;;5630:238:1:o;5873:393::-;;;;6019:2;6007:9;5998:7;5994:23;5990:32;5987:2;;;6040:6;6032;6025:22;5987:2;6084:9;6071:23;6103:31;6128:5;6103:31;:::i;:::-;6153:5;6205:2;6190:18;;6177:32;;-1:-1:-1;6256:2:1;6241:18;;;6228:32;;5977:289;-1:-1:-1;;;5977:289:1:o;6271:1343::-;;;6450:2;6438:9;6429:7;6425:23;6421:32;6418:2;;;6471:6;6463;6456:22;6418:2;6516:9;6503:23;6545:18;6586:2;6578:6;6575:14;6572:2;;;6607:6;6599;6592:22;6572:2;6650:6;6639:9;6635:22;6625:32;;6695:7;6688:4;6684:2;6680:13;6676:27;6666:2;;6722:6;6714;6707:22;6666:2;6763;6750:16;6785:4;6808:43;6848:2;6808:43;:::i;:::-;6880:2;6874:9;6892:31;6920:2;6912:6;6892:31;:::i;:::-;6958:18;;;6992:15;;;;-1:-1:-1;7027:11:1;;;7069:1;7065:10;;;7057:19;;7053:28;;7050:41;-1:-1:-1;7047:2:1;;;7109:6;7101;7094:22;7047:2;7136:6;7127:15;;7151:238;7165:2;7162:1;7159:9;7151:238;;;7236:3;7223:17;7253:31;7278:5;7253:31;:::i;:::-;7297:18;;7183:1;7176:9;;;;;7335:12;;;;7367;;7151:238;;;-1:-1:-1;7408:6:1;-1:-1:-1;;7452:18:1;;7439:32;;-1:-1:-1;;7483:16:1;;;7480:2;;;7517:6;7509;7502:22;7480:2;;7545:63;7600:7;7589:8;7578:9;7574:24;7545:63;:::i;:::-;7535:73;;;6408:1206;;;;;:::o;7619:190::-;;7731:2;7719:9;7710:7;7706:23;7702:32;7699:2;;;7752:6;7744;7737:22;7699:2;-1:-1:-1;7780:23:1;;7689:120;-1:-1:-1;7689:120:1:o;7814:325::-;;;7943:2;7931:9;7922:7;7918:23;7914:32;7911:2;;;7964:6;7956;7949:22;7911:2;8005:9;7992:23;7982:33;;8065:2;8054:9;8050:18;8037:32;8078:31;8103:5;8078:31;:::i;8144:255::-;;8255:2;8243:9;8234:7;8230:23;8226:32;8223:2;;;8276:6;8268;8261:22;8223:2;8320:9;8307:23;8339:30;8363:5;8339:30;:::i;8404:259::-;;8526:2;8514:9;8505:7;8501:23;8497:32;8494:2;;;8547:6;8539;8532:22;8494:2;8584:9;8578:16;8603:30;8627:5;8603:30;:::i;8863:816::-;;;;;;9048:2;9036:9;9027:7;9023:23;9019:32;9016:2;;;9069:6;9061;9054:22;9016:2;9110:9;9097:23;9087:33;;9171:2;9160:9;9156:18;9143:32;9194:18;9235:2;9227:6;9224:14;9221:2;;;9256:6;9248;9241:22;9221:2;9300:58;9350:7;9341:6;9330:9;9326:22;9300:58;:::i;:::-;9377:8;;-1:-1:-1;9274:84:1;-1:-1:-1;9465:2:1;9450:18;;9437:32;;-1:-1:-1;9481:16:1;;;9478:2;;;9515:6;9507;9500:22;9478:2;;9559:60;9611:7;9600:8;9589:9;9585:24;9559:60;:::i;:::-;9006:673;;;;-1:-1:-1;9006:673:1;;-1:-1:-1;9638:8:1;;9533:86;9006:673;-1:-1:-1;;;9006:673:1:o;9684:1025::-;;;;;;;9895:3;9883:9;9874:7;9870:23;9866:33;9863:2;;;9917:6;9909;9902:22;9863:2;9958:9;9945:23;9935:33;;10019:2;10008:9;10004:18;9991:32;10042:18;10083:2;10075:6;10072:14;10069:2;;;10104:6;10096;10089:22;10069:2;10148:58;10198:7;10189:6;10178:9;10174:22;10148:58;:::i;:::-;10225:8;;-1:-1:-1;10122:84:1;-1:-1:-1;10313:2:1;10298:18;;10285:32;;-1:-1:-1;10329:16:1;;;10326:2;;;10363:6;10355;10348:22;10326:2;10391:51;10434:7;10423:8;10412:9;10408:24;10391:51;:::i;:::-;10381:61;;10495:2;10484:9;10480:18;10467:32;10451:48;;10524:2;10514:8;10511:16;10508:2;;;10545:6;10537;10530:22;10508:2;;10589:60;10641:7;10630:8;10619:9;10615:24;10589:60;:::i;:::-;9853:856;;;;-1:-1:-1;9853:856:1;;-1:-1:-1;9853:856:1;;10668:8;;9853:856;-1:-1:-1;;;9853:856:1:o;10714:437::-;;10805:5;10799:12;10832:6;10827:3;10820:19;10858:4;10887:2;10882:3;10878:12;10871:19;;10924:2;10917:5;10913:14;10945:3;10957:169;10971:6;10968:1;10965:13;10957:169;;;11032:13;;11020:26;;11066:12;;;;11101:15;;;;10993:1;10986:9;10957:169;;;-1:-1:-1;11142:3:1;;10775:376;-1:-1:-1;;;;;10775:376:1:o;11156:316::-;;11235:5;11229:12;11262:6;11257:3;11250:19;11278:63;11334:6;11327:4;11322:3;11318:14;11311:4;11304:5;11300:16;11278:63;:::i;:::-;11386:2;11374:15;11391:66;11370:88;11361:98;;;;11461:4;11357:109;;11205:267;-1:-1:-1;;11205:267:1:o;11477:536::-;;11745:66;11736:6;11732:2;11728:15;11724:88;11719:3;11712:101;11857:6;11849;11844:2;11839:3;11835:12;11822:42;-1:-1:-1;11926:2:1;11883:16;;11918:11;;;11962:18;12004:2;11996:11;;11702:311;-1:-1:-1;;11702:311:1:o;12018:275::-;;12203:6;12195;12190:3;12177:33;12229:16;;12254:15;;;12229:16;12167:126;-1:-1:-1;12167:126:1:o;12298:470::-;;12515:6;12509:13;12531:53;12577:6;12572:3;12565:4;12557:6;12553:17;12531:53;:::i;:::-;12647:13;;12606:16;;;;12669:57;12647:13;12606:16;12703:4;12691:17;;12669:57;:::i;:::-;12742:20;;12485:283;-1:-1:-1;;;;12485:283:1:o;12773:786::-;;13184:25;13179:3;13172:38;13239:6;13233:13;13255:62;13310:6;13305:2;13300:3;13296:12;13289:4;13281:6;13277:17;13255:62;:::i;:::-;13381:19;13376:2;13336:16;;;13368:11;;;13361:40;13426:13;;13448:63;13426:13;13497:2;13489:11;;13482:4;13470:17;;13448:63;:::i;:::-;13531:17;13550:2;13527:26;;13162:397;-1:-1:-1;;;;13162:397:1:o;13795:849::-;;14146:42;14227:2;14219:6;14215:15;14204:9;14197:34;14279:2;14271:6;14267:15;14262:2;14251:9;14247:18;14240:43;;14319:3;14314:2;14303:9;14299:18;14292:31;14346:57;14398:3;14387:9;14383:19;14375:6;14346:57;:::i;:::-;14451:9;14443:6;14439:22;14434:2;14423:9;14419:18;14412:50;14485:44;14522:6;14514;14485:44;:::i;:::-;14471:58;;14578:9;14570:6;14566:22;14560:3;14549:9;14545:19;14538:51;14606:32;14631:6;14623;14606:32;:::i;:::-;14598:40;14126:518;-1:-1:-1;;;;;;;;14126:518:1:o;14649:583::-;;14900:42;14981:2;14973:6;14969:15;14958:9;14951:34;15033:2;15025:6;15021:15;15016:2;15005:9;15001:18;14994:43;;15073:6;15068:2;15057:9;15053:18;15046:34;15116:6;15111:2;15100:9;15096:18;15089:34;15160:3;15154;15143:9;15139:19;15132:32;15181:45;15221:3;15210:9;15206:19;15198:6;15181:45;:::i;:::-;15173:53;14880:352;-1:-1:-1;;;;;;;14880:352:1:o;15237:261::-;;15416:2;15405:9;15398:21;15436:56;15488:2;15477:9;15473:18;15465:6;15436:56;:::i;15503:465::-;;15760:2;15749:9;15742:21;15786:56;15838:2;15827:9;15823:18;15815:6;15786:56;:::i;:::-;15890:9;15882:6;15878:22;15873:2;15862:9;15858:18;15851:50;15918:44;15955:6;15947;15918:44;:::i;16750:219::-;;16899:2;16888:9;16881:21;16919:44;16959:2;16948:9;16944:18;16936:6;16919:44;:::i;26640:183::-;;26733:18;26725:6;26722:30;26719:2;;;26755:18;;:::i;:::-;-1:-1:-1;26800:1:1;26796:14;26812:4;26792:25;;26709:114::o;26828:128::-;;26899:1;26895:6;26892:1;26889:13;26886:2;;;26905:18;;:::i;:::-;-1:-1:-1;26941:9:1;;26876:80::o;26961:228::-;;27127:1;27059:66;27055:74;27052:1;27049:81;27044:1;27037:9;27030:17;27026:105;27023:2;;;27134:18;;:::i;:::-;-1:-1:-1;27174:9:1;;27013:176::o;27194:125::-;;27262:1;27259;27256:8;27253:2;;;27267:18;;:::i;:::-;-1:-1:-1;27304:9:1;;27243:76::o;27324:258::-;27396:1;27406:113;27420:6;27417:1;27414:13;27406:113;;;27496:11;;;27490:18;27477:11;;;27470:39;27442:2;27435:10;27406:113;;;27537:6;27534:1;27531:13;27528:2;;;27572:1;27563:6;27558:3;27554:16;27547:27;27528:2;;27377:205;;;:::o;27587:196::-;;27654:5;27644:2;;27663:18;;:::i;:::-;-1:-1:-1;27710:66:1;27699:78;;27634:149::o;27788:437::-;27867:1;27863:12;;;;27910;;;27931:2;;27985:4;27977:6;27973:17;27963:27;;27931:2;28038;28030:6;28027:14;28007:18;28004:38;28001:2;;;28075:77;28072:1;28065:88;28176:4;28173:1;28166:15;28204:4;28201:1;28194:15;28001:2;;27843:382;;;:::o;28230:308::-;28336:66;28331:2;28325:4;28321:13;28317:86;28309:6;28305:99;28470:6;28458:10;28455:22;28434:18;28422:10;28419:34;28416:62;28413:2;;;28481:18;;:::i;:::-;28517:2;28510:22;-1:-1:-1;;28277:261:1:o;28543:195::-;;28613:66;28606:5;28603:77;28600:2;;;28683:18;;:::i;:::-;-1:-1:-1;28730:1:1;28719:13;;28590:148::o;28743:184::-;28795:77;28792:1;28785:88;28892:4;28889:1;28882:15;28916:4;28913:1;28906:15;28932:184;28984:77;28981:1;28974:88;29081:4;29078:1;29071:15;29105:4;29102:1;29095:15;29121:185;;29198:1;29180:16;29177:23;29174:2;;;29248:1;29243:3;29238;29223:27;29279:10;29274:3;29270:20;29164:142;:::o;29311:731::-;;29392:4;29374:16;29371:26;29368:2;;;29400:5;;29368:2;29434;29428:9;29456:66;29577:2;29559:16;29555:25;29552:1;29546:4;29531:50;29610:4;29604:11;29634:16;29669:18;29740:2;29733:4;29725:6;29721:17;29718:25;29713:2;29705:6;29702:14;29699:45;29696:2;;;29747:5;;;;;;;29696:2;29784:6;29778:4;29774:17;29763:28;;29820:3;29814:10;29847:2;29839:6;29836:14;29833:2;;;29853:5;;;;;;;;29833:2;29937;29918:16;29912:4;29908:27;29904:36;29897:4;29888:6;29883:3;29879:16;29875:27;29872:69;29869:2;;;29944:5;;;;;;;;29869:2;29960:57;30011:4;30002:6;29994;29990:19;29986:30;29980:4;29960:57;:::i;:::-;-1:-1:-1;30033:3:1;;-1:-1:-1;;;;;29358:684:1;:::o;30047:154::-;30133:42;30126:5;30122:54;30115:5;30112:65;30102:2;;30191:1;30188;30181:12;30102:2;30092:109;:::o;30206:177::-;30291:66;30284:5;30280:78;30273:5;30270:89;30260:2;;30373:1;30370;30363:12
Swarm Source
ipfs://e5ccbc6de4296570de31e184ae4dc0062728749c4f10d4e865b8042950186aaa
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.