Token
Overview ERC-1155
Total Supply:
0 N/A
Holders:
2 addresses
Profile Summary
Contract:
Balance
0 N/A
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x8d56f047Def1bA8061c8317eDF2542DC338234d1
Contract Name:
Tatum1155
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-16 */ pragma solidity ^0.8.0; // SPDX-License-Identifier: MIT /** * @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); } /** * @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; } /** * _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); } /** * @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); } /** * @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); } } } } /* * @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; } } // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @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; } } /** * * @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 Ownable, 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) external 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; } } /** * @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); } } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } /** * @dev ERC1155 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. * * _Available since v3.1._ */ abstract contract ERC1155Pausable is ERC1155, Pausable { /** * @dev See {ERC1155-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); require(!paused(), "ERC1155Pausable: token transfer while paused"); } } /** * @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 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 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 { require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to grant"); _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 { require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to revoke"); _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()); } } } /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) {// Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable { function getRoleMember(bytes32 role, uint256 index) external view returns (address); function getRoleMemberCount(bytes32 role) external view returns (uint256); } /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {grantRole} to track enumerable memberships */ function grantRole(bytes32 role, address account) public virtual override { super.grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {revokeRole} to track enumerable memberships */ function revokeRole(bytes32 role, address account) public virtual override { super.revokeRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {_setupRole} to track enumerable memberships */ function _setupRole(bytes32 role, address account) internal virtual override { super._setupRole(role, account); _roleMembers[role].add(account); } } /** * @dev {ERC1155} token, including: * * - ability for holders to burn (destroy) their tokens * - a minter role that allows for token minting (creation) * - a pauser role that allows to stop all token transfers * * This contract uses {AccessControl} to lock permissioned functions using the * different roles - head to its documentation for details. * * The account that deploys the contract will be granted the minter and pauser * roles, as well as the default admin role, which will let it grant both minter * and pauser roles to other accounts. */ contract ERC1155PresetMinterPauser is Context, AccessControlEnumerable, ERC1155Burnable, ERC1155Pausable { bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); /** * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE`, and `PAUSER_ROLE` to the account that * deploys the contract. */ constructor(string memory uri) ERC1155(uri) { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); _setupRole(PAUSER_ROLE, _msgSender()); } /** * @dev Creates `amount` new tokens for `to`, of token type `id`. * * See {ERC1155-_mint}. * * Requirements: * * - the caller must have the `MINTER_ROLE`. */ function mint(address to, uint256 id, uint256 amount, bytes memory data) public virtual { require(hasRole(MINTER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have minter role to mint"); _mint(to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] variant of {mint}. */ function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) public virtual { require(hasRole(MINTER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have minter role to mint"); _mintBatch(to, ids, amounts, data); } /** * @dev Pauses all token transfers. * * See {ERC1155Pausable} and {Pausable-_pause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function pause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have pauser role to pause"); _pause(); } /** * @dev Unpauses all token transfers. * * See {ERC1155Pausable} and {Pausable-_unpause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function unpause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have pauser role to unpause"); _unpause(); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControlEnumerable, ERC1155) returns (bool) { return super.supportsInterface(interfaceId); } function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override(ERC1155, ERC1155Pausable) { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); } } contract Tatum1155 is ERC1155PresetMinterPauser { bool _publicMint; constructor(string memory uri, bool publicMint) ERC1155PresetMinterPauser(uri) { _publicMint = publicMint; } function safeTransfer( address to, uint256 id, uint256 amount, bytes memory data ) public virtual { return safeTransferFrom(_msgSender(), to, id, amount, data); } function safeBatchTransfer( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual { return safeBatchTransferFrom(_msgSender(), to, ids, amounts, data); } function mintBatch(address[] memory to, uint256[][] memory ids, uint256[][] memory amounts, bytes memory data) public virtual { if (!_publicMint) { require(hasRole(MINTER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have minter role to mint"); } for (uint i = 0; i < to.length; i++) { _mintBatch(to[i], ids[i], amounts[i], data); } } function mint(address to, uint256 id, uint256 amount, bytes memory data) public virtual override { if (!_publicMint) { require(hasRole(MINTER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have minter role to mint"); } _mint(to, id, amount, data); } function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) public virtual override { if (!_publicMint) { require(hasRole(MINTER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have minter role to mint"); } _mintBatch(to, ids, amounts, data); } }
[{"inputs":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"bool","name":"publicMint","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_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":[{"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":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransfer","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":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransfer","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620030d6380380620030d683398101604081905262000034916200034a565b81806200004133620000dc565b6200004c816200012c565b506006805460ff191690556200006460003362000145565b620000907f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a63362000145565b620000bc7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a3362000145565b50600680549115156101000261ff0019909216919091179055506200048e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8051620001419060059060208401906200028e565b5050565b6200015c82826200018860201b6200116e1760201c565b6000828152600260209081526040909120620001839183906200117862000194821b17901c565b505050565b620001418282620001b4565b6000620001ab836001600160a01b0384166200023c565b90505b92915050565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff16620001415760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b60008181526001830160205260408120546200028557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620001ae565b506000620001ae565b8280546200029c906200043b565b90600052602060002090601f016020900481019282620002c057600085556200030b565b82601f10620002db57805160ff19168380011785556200030b565b828001600101855582156200030b579182015b828111156200030b578251825591602001919060010190620002ee565b50620003199291506200031d565b5090565b5b808211156200031957600081556001016200031e565b805180151581146200034557600080fd5b919050565b600080604083850312156200035e57600080fd5b82516001600160401b03808211156200037657600080fd5b818501915085601f8301126200038b57600080fd5b815181811115620003a057620003a062000478565b604051601f8201601f19908116603f01168101908382118183101715620003cb57620003cb62000478565b81604052828152602093508884848701011115620003e857600080fd5b600091505b828210156200040c5784820184015181830185015290830190620003ed565b828211156200041e5760008484830101525b95506200043091505085820162000334565b925050509250929050565b600181811c908216806200045057607f821691505b602082108114156200047257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b612c38806200049e6000396000f3fe608060405234801561001057600080fd5b50600436106101e45760003560e01c80638456cb591161010f578063d5391393116100a2578063e985e9c511610071578063e985e9c51461042e578063f242432a1461046a578063f2fde38b1461047d578063f5298aca1461049057600080fd5b8063d5391393146103cc578063d547741f146103e1578063d74b8c42146103f4578063e63ab1e91461040757600080fd5b8063a217fddf116100de578063a217fddf1461038b578063a22cb46514610393578063ae28b68c146103a6578063ca15c873146103b957600080fd5b80638456cb59146103385780638da5cb5b146103405780639010d07c1461036557806391d148541461037857600080fd5b806336568abe116101875780635c975abb116101565780635c975abb146102ff5780636b20c4541461030a578063715018a61461031d578063731133e91461032557600080fd5b806336568abe146102b1578063368b2842146102c45780633f4ba83a146102d75780634e1273f4146102df57600080fd5b80631f7fdffa116101c35780631f7fdffa14610252578063248a9ca3146102675780632eb2c2d61461028b5780632f2ff15d1461029e57600080fd5b8062fdd58e146101e957806301ffc9a71461020f5780630e89341c14610232575b600080fd5b6101fc6101f73660046123c6565b6104a3565b6040519081526020015b60405180910390f35b61022261021d3660046125b5565b61053f565b6040519015158152602001610206565b610245610240366004612557565b61054a565b604051610206919061275b565b6102656102603660046122f2565b6105de565b005b6101fc610275366004612557565b6000908152600160208190526040909120015490565b610265610299366004612172565b610633565b6102656102ac366004612570565b6108ae565b6102656102bf366004612570565b6108d5565b6102656102d23660046122f2565b610953565b610265610960565b6102f26102ed3660046124f4565b610a06565b604051610206919061271a565b60065460ff16610222565b61026561031836600461227f565b610b2f565b610265610b72565b610265610333366004612423565b610bd6565b610265610c25565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610206565b61034d610373366004612593565b610cc9565b610222610386366004612570565b610ce8565b6101fc600081565b6102656103a136600461238a565b610d13565b6102656103b4366004612423565b610dea565b6101fc6103c7366004612557565b610df7565b6101fc600080516020612be383398151915281565b6102656103ef366004612570565b610e0e565b610265610402366004612477565b610e30565b6101fc7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61022261043c36600461213f565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b61026561047836600461221b565b610eef565b61026561048b366004612124565b611060565b61026561049e3660046123f0565b61112b565b60006001600160a01b0383166105145760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b5060008181526003602090815260408083206001600160a01b03861684529091529020545b92915050565b60006105398261118d565b60606005805461055990612a4d565b80601f016020809104026020016040519081016040528092919081815260200182805461058590612a4d565b80156105d25780601f106105a7576101008083540402835291602001916105d2565b820191906000526020600020905b8154815290600101906020018083116105b557829003601f168201915b50505050509050919050565b600654610100900460ff1661062157610605600080516020612be383398151915233610ce8565b6106215760405162461bcd60e51b815260040161050b906128cb565b61062d848484846111cd565b50505050565b81518351146106545760405162461bcd60e51b815260040161050b90612972565b6001600160a01b03841661067a5760405162461bcd60e51b815260040161050b90612843565b6001600160a01b0385163314806106965750610696853361043c565b6106fd5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161050b565b3361070c818787878787611328565b60005b845181101561084057600085828151811061072c5761072c612afb565b60200260200101519050600085838151811061074a5761074a612afb565b60209081029190910181015160008481526003835260408082206001600160a01b038e16835290935291909120549091508181101561079b5760405162461bcd60e51b815260040161050b90612928565b6107a58282612a36565b6003600085815260200190815260200160002060008c6001600160a01b03166001600160a01b0316815260200190815260200160002081905550816003600085815260200190815260200160002060008b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546108259190612a1e565b925050819055505050508061083990612ab4565b905061070f565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161089092919061272d565b60405180910390a46108a6818787878787611336565b505050505050565b6108b882826114a1565b60008281526002602052604090206108d09082611178565b505050565b6001600160a01b03811633146109455760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161050b565b61094f8282611523565b5050565b61062d3385858585610633565b61098a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610ce8565b6109fc5760405162461bcd60e51b815260206004820152603b60248201527f455243313135355072657365744d696e7465725061757365723a206d7573742060448201527f686176652070617573657220726f6c6520746f20756e70617573650000000000606482015260840161050b565b610a0461158a565b565b60608151835114610a6b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161050b565b600083516001600160401b03811115610a8657610a86612b11565b604051908082528060200260200182016040528015610aaf578160200160208202803683370190505b50905060005b8451811015610b2757610afa858281518110610ad357610ad3612afb565b6020026020010151858381518110610aed57610aed612afb565b60200260200101516104a3565b828281518110610b0c57610b0c612afb565b6020908102919091010152610b2081612ab4565b9050610ab5565b509392505050565b6001600160a01b038316331480610b4b5750610b4b833361043c565b610b675760405162461bcd60e51b815260040161050b906127fa565b6108d083838361161d565b6000546001600160a01b03163314610bcc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161050b565b610a0460006117bb565b600654610100900460ff16610c1957610bfd600080516020612be383398151915233610ce8565b610c195760405162461bcd60e51b815260040161050b906128cb565b61062d8484848461180b565b610c4f7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610ce8565b610cc15760405162461bcd60e51b815260206004820152603960248201527f455243313135355072657365744d696e7465725061757365723a206d7573742060448201527f686176652070617573657220726f6c6520746f20706175736500000000000000606482015260840161050b565b610a046118d4565b6000828152600260205260408120610ce1908361194f565b9392505050565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b336001600160a01b0383161415610d7e5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161050b565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61062d3385858585610eef565b60008181526002602052604081206105399061195b565b610e188282611965565b60008281526002602052604090206108d090826119e6565b600654610100900460ff16610e7357610e57600080516020612be383398151915233610ce8565b610e735760405162461bcd60e51b815260040161050b906128cb565b60005b8451811015610ee857610ed6858281518110610e9457610e94612afb565b6020026020010151858381518110610eae57610eae612afb565b6020026020010151858481518110610ec857610ec8612afb565b6020026020010151856111cd565b80610ee081612ab4565b915050610e76565b5050505050565b6001600160a01b038416610f155760405162461bcd60e51b815260040161050b90612843565b6001600160a01b038516331480610f315750610f31853361043c565b610f4d5760405162461bcd60e51b815260040161050b906127fa565b33610f6c818787610f5d886119fb565b610f66886119fb565b87611328565b60008481526003602090815260408083206001600160a01b038a16845290915290205483811015610faf5760405162461bcd60e51b815260040161050b90612928565b610fb98482612a36565b60008681526003602090815260408083206001600160a01b038c81168552925280832093909355881681529081208054869290610ff7908490612a1e565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611057828888888888611a46565b50505050505050565b6000546001600160a01b031633146110ba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161050b565b6001600160a01b03811661111f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161050b565b611128816117bb565b50565b6001600160a01b0383163314806111475750611147833361043c565b6111635760405162461bcd60e51b815260040161050b906127fa565b6108d0838383611b10565b61094f8282611c1d565b6000610ce1836001600160a01b038416611c88565b60006001600160e01b03198216636cdb3d1360e11b14806111be57506001600160e01b031982166303a24d0760e21b145b80610539575061053982611cd7565b6001600160a01b0384166111f35760405162461bcd60e51b815260040161050b906129ba565b81518351146112145760405162461bcd60e51b815260040161050b90612972565b3361122481600087878787611328565b60005b84518110156112c05783818151811061124257611242612afb565b60200260200101516003600087848151811061126057611260612afb565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546112a89190612a1e565b909155508190506112b881612ab4565b915050611227565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161131192919061272d565b60405180910390a4610ee881600087878787611336565b6108a6868686868686611cfc565b6001600160a01b0384163b156108a65760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061137a9089908990889088908890600401612677565b602060405180830381600087803b15801561139457600080fd5b505af19250505080156113c4575060408051601f3d908101601f191682019092526113c1918101906125d2565b60015b611471576113d0612b27565b806308c379a0141561140a57506113e5612b43565b806113f0575061140c565b8060405162461bcd60e51b815260040161050b919061275b565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161050b565b6001600160e01b0319811663bc197c8160e01b146110575760405162461bcd60e51b815260040161050b9061276e565b600082815260016020819052604090912001546114bf905b33610ce8565b61116e5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526e0818591b5a5b881d1bc819dc985b9d608a1b606482015260840161050b565b61152d8282610ce8565b1561094f5760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60065460ff166115d35760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161050b565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0383166116435760405162461bcd60e51b815260040161050b90612888565b80518251146116645760405162461bcd60e51b815260040161050b90612972565b600033905061168781856000868660405180602001604052806000815250611328565b60005b835181101561175c5760008482815181106116a7576116a7612afb565b6020026020010151905060008483815181106116c5576116c5612afb565b60209081029190910181015160008481526003835260408082206001600160a01b038c1683529093529190912054909150818110156117165760405162461bcd60e51b815260040161050b906127b6565b6117208282612a36565b60009384526003602090815260408086206001600160a01b038c168752909152909320929092555081905061175481612ab4565b91505061168a565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516117ad92919061272d565b60405180910390a450505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0384166118315760405162461bcd60e51b815260040161050b906129ba565b3361184281600087610f5d886119fb565b60008481526003602090815260408083206001600160a01b038916845290915281208054859290611874908490612a1e565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610ee881600087878787611a46565b60065460ff161561191a5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161050b565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586116003390565b6000610ce18383611d64565b6000610539825490565b60008281526001602081905260409091200154611981906114b9565b6109455760405162461bcd60e51b815260206004820152603060248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526f2061646d696e20746f207265766f6b6560801b606482015260840161050b565b6000610ce1836001600160a01b038416611dea565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611a3557611a35612afb565b602090810291909101015292915050565b6001600160a01b0384163b156108a65760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611a8a90899089908890889088906004016126d5565b602060405180830381600087803b158015611aa457600080fd5b505af1925050508015611ad4575060408051601f3d908101601f19168201909252611ad1918101906125d2565b60015b611ae0576113d0612b27565b6001600160e01b0319811663f23a6e6160e01b146110575760405162461bcd60e51b815260040161050b9061276e565b6001600160a01b038316611b365760405162461bcd60e51b815260040161050b90612888565b33611b6581856000611b47876119fb565b611b50876119fb565b60405180602001604052806000815250611328565b60008381526003602090815260408083206001600160a01b038816845290915290205482811015611ba85760405162461bcd60e51b815260040161050b906127b6565b611bb28382612a36565b60008581526003602090815260408083206001600160a01b038a811680865291845282852095909555815189815292830188905292938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b611c278282610ce8565b61094f5760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6000818152600183016020526040812054611ccf57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610539565b506000610539565b60006001600160e01b03198216635a05180f60e01b1480610539575061053982611edd565b60065460ff16156108a65760405162461bcd60e51b815260206004820152602c60248201527f455243313135355061757361626c653a20746f6b656e207472616e736665722060448201526b1dda1a5b19481c185d5cd95960a21b606482015260840161050b565b81546000908210611dc25760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161050b565b826000018281548110611dd757611dd7612afb565b9060005260206000200154905092915050565b60008181526001830160205260408120548015611ed3576000611e0e600183612a36565b8554909150600090611e2290600190612a36565b90506000866000018281548110611e3b57611e3b612afb565b9060005260206000200154905080876000018481548110611e5e57611e5e612afb565b600091825260209091200155611e75836001612a1e565b60008281526001890160205260409020558654879080611e9757611e97612ae5565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610539565b6000915050610539565b60006001600160e01b03198216637965db0b60e01b148061053957506301ffc9a760e01b6001600160e01b0319831614610539565b80356001600160a01b0381168114611f2957600080fd5b919050565b600082601f830112611f3f57600080fd5b81356020611f4c826129fb565b604051611f598282612a88565b8381528281019150858301600585901b87018401881015611f7957600080fd5b60005b85811015611f9f57611f8d82611f12565b84529284019290840190600101611f7c565b5090979650505050505050565b600082601f830112611fbd57600080fd5b81356020611fca826129fb565b604051611fd78282612a88565b8381528281019150858301600585901b87018401881015611ff757600080fd5b6000805b868110156120395782356001600160401b03811115612018578283fd5b6120268b88838d0101612047565b8652509385019391850191600101611ffb565b509198975050505050505050565b600082601f83011261205857600080fd5b81356020612065826129fb565b6040516120728282612a88565b8381528281019150858301600585901b8701840188101561209257600080fd5b60005b85811015611f9f57813584529284019290840190600101612095565b600082601f8301126120c257600080fd5b81356001600160401b038111156120db576120db612b11565b6040516120f2601f8301601f191660200182612a88565b81815284602083860101111561210757600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561213657600080fd5b610ce182611f12565b6000806040838503121561215257600080fd5b61215b83611f12565b915061216960208401611f12565b90509250929050565b600080600080600060a0868803121561218a57600080fd5b61219386611f12565b94506121a160208701611f12565b935060408601356001600160401b03808211156121bd57600080fd5b6121c989838a01612047565b945060608801359150808211156121df57600080fd5b6121eb89838a01612047565b9350608088013591508082111561220157600080fd5b5061220e888289016120b1565b9150509295509295909350565b600080600080600060a0868803121561223357600080fd5b61223c86611f12565b945061224a60208701611f12565b9350604086013592506060860135915060808601356001600160401b0381111561227357600080fd5b61220e888289016120b1565b60008060006060848603121561229457600080fd5b61229d84611f12565b925060208401356001600160401b03808211156122b957600080fd5b6122c587838801612047565b935060408601359150808211156122db57600080fd5b506122e886828701612047565b9150509250925092565b6000806000806080858703121561230857600080fd5b61231185611f12565b935060208501356001600160401b038082111561232d57600080fd5b61233988838901612047565b9450604087013591508082111561234f57600080fd5b61235b88838901612047565b9350606087013591508082111561237157600080fd5b5061237e878288016120b1565b91505092959194509250565b6000806040838503121561239d57600080fd5b6123a683611f12565b9150602083013580151581146123bb57600080fd5b809150509250929050565b600080604083850312156123d957600080fd5b6123e283611f12565b946020939093013593505050565b60008060006060848603121561240557600080fd5b61240e84611f12565b95602085013595506040909401359392505050565b6000806000806080858703121561243957600080fd5b61244285611f12565b9350602085013592506040850135915060608501356001600160401b0381111561246b57600080fd5b61237e878288016120b1565b6000806000806080858703121561248d57600080fd5b84356001600160401b03808211156124a457600080fd5b6124b088838901611f2e565b955060208701359150808211156124c657600080fd5b6124d288838901611fac565b945060408701359150808211156124e857600080fd5b61235b88838901611fac565b6000806040838503121561250757600080fd5b82356001600160401b038082111561251e57600080fd5b61252a86838701611f2e565b9350602085013591508082111561254057600080fd5b5061254d85828601612047565b9150509250929050565b60006020828403121561256957600080fd5b5035919050565b6000806040838503121561258357600080fd5b8235915061216960208401611f12565b600080604083850312156125a657600080fd5b50508035926020909101359150565b6000602082840312156125c757600080fd5b8135610ce181612bcc565b6000602082840312156125e457600080fd5b8151610ce181612bcc565b600081518084526020808501945080840160005b8381101561261f57815187529582019590820190600101612603565b509495945050505050565b6000815180845260005b8181101561265057602081850181015186830182015201612634565b81811115612662576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0386811682528516602082015260a0604082018190526000906126a3908301866125ef565b82810360608401526126b581866125ef565b905082810360808401526126c9818561262a565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061270f9083018461262a565b979650505050505050565b602081526000610ce160208301846125ef565b60408152600061274060408301856125ef565b828103602084015261275281856125ef565b95945050505050565b602081526000610ce1602083018461262a565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526038908201527f455243313135355072657365744d696e7465725061757365723a206d7573742060408201527f68617665206d696e74657220726f6c6520746f206d696e740000000000000000606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60006001600160401b03821115612a1457612a14612b11565b5060051b60200190565b60008219821115612a3157612a31612acf565b500190565b600082821015612a4857612a48612acf565b500390565b600181811c90821680612a6157607f821691505b60208210811415612a8257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b0381118282101715612aad57612aad612b11565b6040525050565b6000600019821415612ac857612ac8612acf565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612b405760046000803e5060005160e01c5b90565b600060443d1015612b515790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715612b8057505050505090565b8285019150815181811115612b985750505050505090565b843d8701016020828501011115612bb25750505050505090565b612bc160208286010187612a88565b509095945050505050565b6001600160e01b03198116811461112857600080fdfe9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a26469706673582212208c65299741a7ff131f7bf0cece35a9fa6fc325df14d9e40f9a6427d737b8aa2164736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a68747470733a2f2f6170692e64656c746c6162732e636f6d2f6170692f6a736f6e2f6c726e2f7b69647d00000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
60579:1784:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21540:231;;;;;;:::i;:::-;;:::i;:::-;;;14894:25:1;;;14882:2;14867:18;21540:231:0;;;;;;;;60026:187;;;;;;:::i;:::-;;:::i;:::-;;;14721:14:1;;14714:22;14696:41;;14684:2;14669:18;60026:187:0;14556::1;21282:107:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;62025:333::-;;;;;;:::i;:::-;;:::i;:::-;;41385:123;;;;;;:::i;:::-;41451:7;41478:12;;;:6;:12;;;;;;;;:22;;;41385:123;24211:1227;;;;;;:::i;:::-;;:::i;56421:165::-;;;;;;:::i;:::-;;:::i;42989:218::-;;;;;;:::i;:::-;;:::i;61027:264::-;;;;;;:::i;:::-;;:::i;59774:180::-;;;:::i;21937:529::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35095:86::-;35166:7;;;;35095:86;;33783:319;;;;;;:::i;:::-;;:::i;17984:103::-;;;:::i;61716:301::-;;;;;;:::i;:::-;;:::i;59380:174::-;;;:::i;17333:87::-;17379:7;17406:6;-1:-1:-1;;;;;17406:6:0;17333:87;;;-1:-1:-1;;;;;12380:32:1;;;12362:51;;12350:2;12335:18;17333:87:0;12216:203:1;55876:145:0;;;;;;:::i;:::-;;:::i;41057:139::-;;;;;;:::i;:::-;;:::i;39517:49::-;;39562:4;39517:49;;22539:311;;;;;;:::i;:::-;;:::i;60787:232::-;;;;;;:::i;:::-;;:::i;56195:134::-;;;;;;:::i;:::-;;:::i;57815:62::-;;-1:-1:-1;;;;;;;;;;;57815:62:0;;56679:170;;;;;;:::i;:::-;;:::i;61299:409::-;;;;;;:::i;:::-;;:::i;57884:62::-;;57922:24;57884:62;;22922:168;;;;;;:::i;:::-;-1:-1:-1;;;;;23045:27:0;;;23021:4;23045:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;22922:168;23162:972;;;;;;:::i;:::-;;:::i;18242:201::-;;;;;;:::i;:::-;;:::i;33488:287::-;;;;;;:::i;:::-;;:::i;21540:231::-;21626:7;-1:-1:-1;;;;;21654:21:0;;21646:77;;;;-1:-1:-1;;;21646:77:0;;17354:2:1;21646:77:0;;;17336:21:1;17393:2;17373:18;;;17366:30;17432:34;17412:18;;;17405:62;-1:-1:-1;;;17483:18:1;;;17476:41;17534:19;;21646:77:0;;;;;;;;;-1:-1:-1;21741:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;21741:22:0;;;;;;;;;;21540:231;;;;;:::o;60026:187::-;60145:4;60169:36;60193:11;60169:23;:36::i;21282:107::-;21344:13;21377:4;21370:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21282:107;;;:::o;62025:333::-;62163:11;;;;;;;62158:148;;62199:34;-1:-1:-1;;;;;;;;;;;16080:10:0;41057:139;:::i;62199:34::-;62191:103;;;;-1:-1:-1;;;62191:103:0;;;;;;;:::i;:::-;62316:34;62327:2;62331:3;62336:7;62345:4;62316:10;:34::i;:::-;62025:333;;;;:::o;24211:1227::-;24464:7;:14;24450:3;:10;:28;24442:81;;;;-1:-1:-1;;;24442:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24542:16:0;;24534:66;;;;-1:-1:-1;;;24534:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24633:20:0;;16080:10;24633:20;;:60;;-1:-1:-1;24657:36:0;24674:4;16080:10;22922:168;:::i;24657:36::-;24611:160;;;;-1:-1:-1;;;24611:160:0;;20569:2:1;24611:160:0;;;20551:21:1;20608:2;20588:18;;;20581:30;20647:34;20627:18;;;20620:62;-1:-1:-1;;;20698:18:1;;;20691:48;20756:19;;24611:160:0;20367:414:1;24611:160:0;16080:10;24828:60;16080:10;24859:4;24865:2;24869:3;24874:7;24883:4;24828:20;:60::i;:::-;24906:9;24901:377;24925:3;:10;24921:1;:14;24901:377;;;24957:10;24970:3;24974:1;24970:6;;;;;;;;:::i;:::-;;;;;;;24957:19;;24991:14;25008:7;25016:1;25008:10;;;;;;;;:::i;:::-;;;;;;;;;;;;25035:19;25057:13;;;:9;:13;;;;;;-1:-1:-1;;;;;25057:19:0;;;;;;;;;;;;25008:10;;-1:-1:-1;25099:21:0;;;;25091:76;;;;-1:-1:-1;;;25091:76:0;;;;;;;:::i;:::-;25204:20;25218:6;25204:11;:20;:::i;:::-;25182:9;:13;25192:2;25182:13;;;;;;;;;;;:19;25196:4;-1:-1:-1;;;;;25182:19:0;-1:-1:-1;;;;;25182:19:0;;;;;;;;;;;;:42;;;;25260:6;25239:9;:13;25249:2;25239:13;;;;;;;;;;;:17;25253:2;-1:-1:-1;;;;;25239:17:0;-1:-1:-1;;;;;25239:17:0;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;24942:336;;;24937:3;;;;:::i;:::-;;;24901:377;;;;25325:2;-1:-1:-1;;;;;25295:47:0;25319:4;-1:-1:-1;;;;;25295:47:0;25309:8;-1:-1:-1;;;;;25295:47:0;;25329:3;25334:7;25295:47;;;;;;;:::i;:::-;;;;;;;;25355:75;25391:8;25401:4;25407:2;25411:3;25416:7;25425:4;25355:35;:75::i;:::-;24431:1007;24211:1227;;;;;:::o;56421:165::-;56506:30;56522:4;56528:7;56506:15;:30::i;:::-;56547:18;;;;:12;:18;;;;;:31;;56570:7;56547:22;:31::i;:::-;;56421:165;;:::o;42989:218::-;-1:-1:-1;;;;;43085:23:0;;16080:10;43085:23;43077:83;;;;-1:-1:-1;;;43077:83:0;;25074:2:1;43077:83:0;;;25056:21:1;25113:2;25093:18;;;25086:30;25152:34;25132:18;;;25125:62;-1:-1:-1;;;25203:18:1;;;25196:45;25258:19;;43077:83:0;24872:411:1;43077:83:0;43173:26;43185:4;43191:7;43173:11;:26::i;:::-;42989:218;;:::o;61027:264::-;61224:59;16080:10;61260:2;61264:3;61269:7;61278:4;61224:21;:59::i;59774:180::-;59827:34;57922:24;16080:10;41057:139;:::i;59827:34::-;59819:106;;;;-1:-1:-1;;;59819:106:0;;22589:2:1;59819:106:0;;;22571:21:1;22628:2;22608:18;;;22601:30;22667:34;22647:18;;;22640:62;22738:29;22718:18;;;22711:57;22785:19;;59819:106:0;22387:423:1;59819:106:0;59936:10;:8;:10::i;:::-;59774:180::o;21937:529::-;22098:16;22159:3;:10;22140:8;:15;:29;22132:83;;;;-1:-1:-1;;;22132:83:0;;23853:2:1;22132:83:0;;;23835:21:1;23892:2;23872:18;;;23865:30;23931:34;23911:18;;;23904:62;-1:-1:-1;;;23982:18:1;;;23975:39;24031:19;;22132:83:0;23651:405:1;22132:83:0;22228:30;22275:8;:15;-1:-1:-1;;;;;22261:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22261:30:0;;22228:63;;22309:9;22304:122;22328:8;:15;22324:1;:19;22304:122;;;22384:30;22394:8;22403:1;22394:11;;;;;;;;:::i;:::-;;;;;;;22407:3;22411:1;22407:6;;;;;;;;:::i;:::-;;;;;;;22384:9;:30::i;:::-;22365:13;22379:1;22365:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;22345:3;;;:::i;:::-;;;22304:122;;;-1:-1:-1;22445:13:0;21937:529;-1:-1:-1;;;21937:529:0:o;33783:319::-;-1:-1:-1;;;;;33914:23:0;;16080:10;33914:23;;:66;;-1:-1:-1;33941:39:0;33958:7;16080:10;22922:168;:::i;33941:39::-;33892:157;;;;-1:-1:-1;;;33892:157:0;;;;;;;:::i;:::-;34062:32;34073:7;34082:3;34087:6;34062:10;:32::i;17984:103::-;17379:7;17406:6;-1:-1:-1;;;;;17406:6:0;16080:10;17553:23;17545:68;;;;-1:-1:-1;;;17545:68:0;;22228:2:1;17545:68:0;;;22210:21:1;;;22247:18;;;22240:30;22306:34;22286:18;;;22279:62;22358:18;;17545:68:0;22026:356:1;17545:68:0;18049:30:::1;18076:1;18049:18;:30::i;61716:301::-:0;61829:11;;;;;;;61824:148;;61865:34;-1:-1:-1;;;;;;;;;;;16080:10:0;41057:139;:::i;61865:34::-;61857:103;;;;-1:-1:-1;;;61857:103:0;;;;;;;:::i;:::-;61982:27;61988:2;61992;61996:6;62004:4;61982:5;:27::i;59380:174::-;59431:34;57922:24;16080:10;41057:139;:::i;59431:34::-;59423:104;;;;-1:-1:-1;;;59423:104:0;;23017:2:1;59423:104:0;;;22999:21:1;23056:2;23036:18;;;23029:30;23095:34;23075:18;;;23068:62;23166:27;23146:18;;;23139:55;23211:19;;59423:104:0;22815:421:1;59423:104:0;59538:8;:6;:8::i;55876:145::-;55958:7;55985:18;;;:12;:18;;;;;:28;;56007:5;55985:21;:28::i;:::-;55978:35;55876:145;-1:-1:-1;;;55876:145:0:o;41057:139::-;41135:4;41159:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;41159:29:0;;;;;;;;;;;;;;;41057:139::o;22539:311::-;16080:10;-1:-1:-1;;;;;22642:24:0;;;;22634:78;;;;-1:-1:-1;;;22634:78:0;;23443:2:1;22634:78:0;;;23425:21:1;23482:2;23462:18;;;23455:30;23521:34;23501:18;;;23494:62;-1:-1:-1;;;23572:18:1;;;23565:39;23621:19;;22634:78:0;23241:405:1;22634:78:0;16080:10;22725:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;22725:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;22725:53:0;;;;;;;;;;22794:48;;14696:41:1;;;22725:42:0;;16080:10;22794:48;;14669:18:1;22794:48:0;;;;;;;22539:311;;:::o;60787:232::-;60959:52;16080:10;60990:2;60994;60998:6;61006:4;60959:16;:52::i;56195:134::-;56267:7;56294:18;;;:12;:18;;;;;:27;;:25;:27::i;56679:170::-;56765:31;56782:4;56788:7;56765:16;:31::i;:::-;56807:18;;;;:12;:18;;;;;:34;;56833:7;56807:25;:34::i;61299:409::-;61441:11;;;;;;;61436:148;;61477:34;-1:-1:-1;;;;;;;;;;;16080:10:0;41057:139;:::i;61477:34::-;61469:103;;;;-1:-1:-1;;;61469:103:0;;;;;;;:::i;:::-;61599:6;61594:107;61615:2;:9;61611:1;:13;61594:107;;;61646:43;61657:2;61660:1;61657:5;;;;;;;;:::i;:::-;;;;;;;61664:3;61668:1;61664:6;;;;;;;;:::i;:::-;;;;;;;61672:7;61680:1;61672:10;;;;;;;;:::i;:::-;;;;;;;61684:4;61646:10;:43::i;:::-;61626:3;;;;:::i;:::-;;;;61594:107;;;;61299:409;;;;:::o;23162:972::-;-1:-1:-1;;;;;23376:16:0;;23368:66;;;;-1:-1:-1;;;23368:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23467:20:0;;16080:10;23467:20;;:60;;-1:-1:-1;23491:36:0;23508:4;16080:10;22922:168;:::i;23491:36::-;23445:151;;;;-1:-1:-1;;;23445:151:0;;;;;;;:::i;:::-;16080:10;23653:96;16080:10;23684:4;23690:2;23694:21;23712:2;23694:17;:21::i;:::-;23717:25;23735:6;23717:17;:25::i;:::-;23744:4;23653:20;:96::i;:::-;23762:19;23784:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;23784:19:0;;;;;;;;;;23822:21;;;;23814:76;;;;-1:-1:-1;;;23814:76:0;;;;;;;:::i;:::-;23923:20;23937:6;23923:11;:20;:::i;:::-;23901:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;23901:19:0;;;;;;;;;;:42;;;;23954:17;;;;;;;:27;;23975:6;;23901:13;23954:27;;23975:6;;23954:27;:::i;:::-;;;;-1:-1:-1;;23999:46:0;;;25644:25:1;;;25700:2;25685:18;;25678:34;;;-1:-1:-1;;;;;23999:46:0;;;;;;;;;;;;;;25617:18:1;23999:46:0;;;;;;;24058:68;24089:8;24099:4;24105:2;24109;24113:6;24121:4;24058:30;:68::i;:::-;23357:777;;23162:972;;;;;:::o;18242:201::-;17379:7;17406:6;-1:-1:-1;;;;;17406:6:0;16080:10;17553:23;17545:68;;;;-1:-1:-1;;;17545:68:0;;22228:2:1;17545:68:0;;;22210:21:1;;;22247:18;;;22240:30;22306:34;22286:18;;;22279:62;22358:18;;17545:68:0;22026:356:1;17545:68:0;-1:-1:-1;;;;;18331:22:0;::::1;18323:73;;;::::0;-1:-1:-1;;;18323:73:0;;17766:2:1;18323:73:0::1;::::0;::::1;17748:21:1::0;17805:2;17785:18;;;17778:30;17844:34;17824:18;;;17817:62;-1:-1:-1;;;17895:18:1;;;17888:36;17941:19;;18323:73:0::1;17564:402:1::0;18323:73:0::1;18407:28;18426:8;18407:18;:28::i;:::-;18242:201:::0;:::o;33488:287::-;-1:-1:-1;;;;;33594:23:0;;16080:10;33594:23;;:66;;-1:-1:-1;33621:39:0;33638:7;16080:10;22922:168;:::i;33621:39::-;33572:157;;;;-1:-1:-1;;;33572:157:0;;;;;;;:::i;:::-;33742:25;33748:7;33757:2;33761:5;33742;:25::i;43790:112::-;43869:25;43880:4;43886:7;43869:10;:25::i;51287:152::-;51357:4;51381:50;51386:3;-1:-1:-1;;;;;51406:23:0;;51381:4;:50::i;20582:289::-;20684:4;-1:-1:-1;;;;;;20708:41:0;;-1:-1:-1;;;20708:41:0;;:106;;-1:-1:-1;;;;;;;20762:52:0;;-1:-1:-1;;;20762:52:0;20708:106;:155;;;;20827:36;20851:11;20827:23;:36::i;27683:689::-;-1:-1:-1;;;;;27818:16:0;;27810:62;;;;-1:-1:-1;;;27810:62:0;;;;;;;:::i;:::-;27905:7;:14;27891:3;:10;:28;27883:81;;;;-1:-1:-1;;;27883:81:0;;;;;;;:::i;:::-;16080:10;28021:66;16080:10;27977:16;28064:2;28068:3;28073:7;28082:4;28021:20;:66::i;:::-;28105:6;28100:100;28121:3;:10;28117:1;:14;28100:100;;;28178:7;28186:1;28178:10;;;;;;;;:::i;:::-;;;;;;;28153:9;:17;28163:3;28167:1;28163:6;;;;;;;;:::i;:::-;;;;;;;28153:17;;;;;;;;;;;:21;28171:2;-1:-1:-1;;;;;28153:21:0;-1:-1:-1;;;;;28153:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;28133:3:0;;-1:-1:-1;28133:3:0;;;:::i;:::-;;;;28100:100;;;;28253:2;-1:-1:-1;;;;;28217:53:0;28249:1;-1:-1:-1;;;;;28217:53:0;28231:8;-1:-1:-1;;;;;28217:53:0;;28257:3;28262:7;28217:53;;;;;;;:::i;:::-;;;;;;;;28283:81;28319:8;28337:1;28341:2;28345:3;28350:7;28359:4;28283:35;:81::i;60221:349::-;60496:66;60523:8;60533:4;60539:2;60543:3;60548:7;60557:4;60496:26;:66::i;32242:795::-;-1:-1:-1;;;;;32492:13:0;;8568:20;8606:8;32488:542;;32528:79;;-1:-1:-1;;;32528:79:0;;-1:-1:-1;;;;;32528:43:0;;;;;:79;;32572:8;;32582:4;;32588:3;;32593:7;;32602:4;;32528:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32528:79:0;;;;;;;;-1:-1:-1;;32528:79:0;;;;;;;;;;;;:::i;:::-;;;32524:495;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;32892:6;32885:14;;-1:-1:-1;;;32885:14:0;;;;;;;;:::i;32524:495::-;;;32941:62;;-1:-1:-1;;;32941:62:0;;15356:2:1;32941:62:0;;;15338:21:1;15395:2;15375:18;;;15368:30;15434:34;15414:18;;;15407:62;-1:-1:-1;;;15485:18:1;;;15478:50;15545:19;;32941:62:0;15154:416:1;32524:495:0;-1:-1:-1;;;;;;32657:64:0;;-1:-1:-1;;;32657:64:0;32653:163;;32746:50;;-1:-1:-1;;;32746:50:0;;;;;;;:::i;41770:232::-;41451:7;41478:12;;;:6;:12;;;;;;;;:22;;41863:41;;41871:18;16080:10;41057:139;:::i;41863:41::-;41855:101;;;;-1:-1:-1;;;41855:101:0;;16589:2:1;41855:101:0;;;16571:21:1;16628:2;16608:18;;;16601:30;16667:34;16647:18;;;16640:62;-1:-1:-1;;;16718:18:1;;;16711:45;16773:19;;41855:101:0;16387:411:1;44474:230:0;44549:22;44557:4;44563:7;44549;:22::i;:::-;44545:152;;;44620:5;44588:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;44588:29:0;;;;;;;;;;:37;;-1:-1:-1;;44588:37:0;;;44645:40;16080:10;;44588:12;;44645:40;;44620:5;44645:40;44474:230;;:::o;36154:120::-;35166:7;;;;35690:41;;;;-1:-1:-1;;;35690:41:0;;17005:2:1;35690:41:0;;;16987:21:1;17044:2;17024:18;;;17017:30;-1:-1:-1;;;17063:18:1;;;17056:50;17123:18;;35690:41:0;16803:344:1;35690:41:0;36213:7:::1;:15:::0;;-1:-1:-1;;36213:15:0::1;::::0;;36244:22:::1;16080:10:::0;36253:12:::1;36244:22;::::0;-1:-1:-1;;;;;12380:32:1;;;12362:51;;12350:2;12335:18;36244:22:0::1;;;;;;;36154:120::o:0;29439:837::-;-1:-1:-1;;;;;29560:21:0;;29552:69;;;;-1:-1:-1;;;29552:69:0;;;;;;;:::i;:::-;29654:7;:14;29640:3;:10;:28;29632:81;;;;-1:-1:-1;;;29632:81:0;;;;;;;:::i;:::-;29726:16;16080:10;29726:31;;29770:69;29791:8;29801:7;29818:1;29822:3;29827:7;29770:69;;;;;;;;;;;;:20;:69::i;:::-;29857:6;29852:341;29873:3;:10;29869:1;:14;29852:341;;;29905:10;29918:3;29922:1;29918:6;;;;;;;;:::i;:::-;;;;;;;29905:19;;29939:14;29956:7;29964:1;29956:10;;;;;;;;:::i;:::-;;;;;;;;;;;;29983:22;30008:13;;;:9;:13;;;;;;-1:-1:-1;;;;;30008:22:0;;;;;;;;;;;;29956:10;;-1:-1:-1;30053:24:0;;;;30045:73;;;;-1:-1:-1;;;30045:73:0;;;;;;;:::i;:::-;30158:23;30175:6;30158:14;:23;:::i;:::-;30133:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;30133:22:0;;;;;;;;;;:48;;;;-1:-1:-1;29885:3:0;;-1:-1:-1;29885:3:0;;;:::i;:::-;;;;29852:341;;;;30251:1;-1:-1:-1;;;;;30210:58:0;30234:7;-1:-1:-1;;;;;30210:58:0;30224:8;-1:-1:-1;;;;;30210:58:0;;30255:3;30260:7;30210:58;;;;;;;:::i;:::-;;;;;;;;29541:735;29439:837;;;:::o;18603:191::-;18677:16;18696:6;;-1:-1:-1;;;;;18713:17:0;;;-1:-1:-1;;;;;;18713:17:0;;;;;;18746:40;;18696:6;;;;;;;18746:40;;18677:16;18746:40;18666:128;18603:191;:::o;26771:556::-;-1:-1:-1;;;;;26886:21:0;;26878:67;;;;-1:-1:-1;;;26878:67:0;;;;;;;:::i;:::-;16080:10;27002:107;16080:10;26958:16;27045:7;27054:21;27072:2;27054:17;:21::i;27002:107::-;27122:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;27122:22:0;;;;;;;;;:32;;27148:6;;27122:13;:32;;27148:6;;27122:32;:::i;:::-;;;;-1:-1:-1;;27170:57:0;;;25644:25:1;;;25700:2;25685:18;;25678:34;;;-1:-1:-1;;;;;27170:57:0;;;;27203:1;;27170:57;;;;;;25617:18:1;27170:57:0;;;;;;;27240:79;27271:8;27289:1;27293:7;27302:2;27306:6;27314:4;27240:30;:79::i;35895:118::-;35166:7;;;;35420:9;35412:38;;;;-1:-1:-1;;;35412:38:0;;19818:2:1;35412:38:0;;;19800:21:1;19857:2;19837:18;;;19830:30;-1:-1:-1;;;19876:18:1;;;19869:46;19932:18;;35412:38:0;19616:340:1;35412:38:0;35955:7:::1;:14:::0;;-1:-1:-1;;35955:14:0::1;35965:4;35955:14;::::0;;35985:20:::1;35992:12;16080:10:::0;;16000:98;52575:158;52649:7;52700:22;52704:3;52716:5;52700:3;:22::i;52112:117::-;52175:7;52202:19;52210:3;48865:18;;48782:109;42247:235;41451:7;41478:12;;;:6;:12;;;;;;;;:22;;42341:41;;42349:18;41385:123;42341:41;42333:102;;;;-1:-1:-1;;;42333:102:0;;19401:2:1;42333:102:0;;;19383:21:1;19440:2;19420:18;;;19413:30;19479:34;19459:18;;;19452:62;-1:-1:-1;;;19530:18:1;;;19523:46;19586:19;;42333:102:0;19199:412:1;51615:158:0;51688:4;51712:53;51720:3;-1:-1:-1;;;;;51740:23:0;;51712:7;:53::i;33045:198::-;33165:16;;;33179:1;33165:16;;;;;;;;;33111;;33140:22;;33165:16;;;;;;;;;;;;-1:-1:-1;33165:16:0;33140:41;;33203:7;33192:5;33198:1;33192:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;33230:5;33045:198;-1:-1:-1;;33045:198:0:o;31476:758::-;-1:-1:-1;;;;;31701:13:0;;8568:20;8606:8;31697:530;;31737:72;;-1:-1:-1;;;31737:72:0;;-1:-1:-1;;;;;31737:38:0;;;;;:72;;31776:8;;31786:4;;31792:2;;31796:6;;31804:4;;31737:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31737:72:0;;;;;;;;-1:-1:-1;;31737:72:0;;;;;;;;;;;;:::i;:::-;;;31733:483;;;;:::i;:::-;-1:-1:-1;;;;;;31859:59:0;;-1:-1:-1;;;31859:59:0;31855:158;;31943:50;;-1:-1:-1;;;31943:50:0;;;;;;;:::i;28631:605::-;-1:-1:-1;;;;;28727:21:0;;28719:69;;;;-1:-1:-1;;;28719:69:0;;;;;;;:::i;:::-;16080:10;28845:105;16080:10;28876:7;28801:16;28897:21;28915:2;28897:17;:21::i;:::-;28920:25;28938:6;28920:17;:25::i;:::-;28845:105;;;;;;;;;;;;:20;:105::i;:::-;28963:22;28988:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;28988:22:0;;;;;;;;;;29029:24;;;;29021:73;;;;-1:-1:-1;;;29021:73:0;;;;;;;:::i;:::-;29130:23;29147:6;29130:14;:23;:::i;:::-;29105:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;29105:22:0;;;;;;;;;;;;:48;;;;29171:57;;25644:25:1;;;25685:18;;;25678:34;;;29105:13:0;;29171:57;;;;;25617:18:1;29171:57:0;;;;;;;28708:528;;28631:605;;;:::o;44237:229::-;44312:22;44320:4;44326:7;44312;:22::i;:::-;44307:152;;44351:12;;;;44383:4;44351:12;;;;;;;;-1:-1:-1;;;;;44351:29:0;;;;;;;;;;:36;;-1:-1:-1;;44351:36:0;;;;;;;44407:40;;16080:10;;44351:12;;44407:40;;44351:12;44407:40;44237:229;;:::o;46335:414::-;46398:4;48664:19;;;:12;;;:19;;;;;;46415:327;;-1:-1:-1;46458:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;46641:18;;46619:19;;;:12;;;:19;;;;;;:40;;;;46674:11;;46415:327;-1:-1:-1;46725:5:0;46718:12;;55054:223;55139:4;-1:-1:-1;;;;;;55163:57:0;;-1:-1:-1;;;55163:57:0;;:106;;;55233:36;55257:11;55233:23;:36::i;36804:412::-;35166:7;;;;37150:9;37142:66;;;;-1:-1:-1;;;37142:66:0;;18578:2:1;37142:66:0;;;18560:21:1;18617:2;18597:18;;;18590:30;18656:34;18636:18;;;18629:62;-1:-1:-1;;;18707:18:1;;;18700:42;18759:19;;37142:66:0;18376:408:1;49237:204:0;49332:18;;49304:7;;49332:26;-1:-1:-1;49324:73:0;;;;-1:-1:-1;;;49324:73:0;;15777:2:1;49324:73:0;;;15759:21:1;15816:2;15796:18;;;15789:30;15855:34;15835:18;;;15828:62;-1:-1:-1;;;15906:18:1;;;15899:32;15948:19;;49324:73:0;15575:398:1;49324:73:0;49415:3;:11;;49427:5;49415:18;;;;;;;;:::i;:::-;;;;;;;;;49408:25;;49237:204;;;;:::o;46925:1556::-;46991:4;47130:19;;;:12;;;:19;;;;;;47166:15;;47162:1312;;47527:21;47551:14;47564:1;47551:10;:14;:::i;:::-;47600:18;;47527:38;;-1:-1:-1;47580:17:0;;47600:22;;47621:1;;47600:22;:::i;:::-;47580:42;;47867:17;47887:3;:11;;47899:9;47887:22;;;;;;;;:::i;:::-;;;;;;;;;47867:42;;48033:9;48004:3;:11;;48016:13;48004:26;;;;;;;;:::i;:::-;;;;;;;;;;:38;48136:17;:13;48152:1;48136:17;:::i;:::-;48110:23;;;;:12;;;:23;;;;;:43;48275:17;;48110:3;;48275:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;48370:3;:12;;:19;48383:5;48370:19;;;;;;;;;;;48363:26;;;48413:4;48406:11;;;;;;;;47162:1312;48457:5;48450:12;;;;;40752:213;40837:4;-1:-1:-1;;;;;;40861:47:0;;-1:-1:-1;;;40861:47:0;;:96;;-1:-1:-1;;;;;;;;;;19610:40:0;;;40921:36;19501:157;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:741::-;246:5;299:3;292:4;284:6;280:17;276:27;266:55;;317:1;314;307:12;266:55;353:6;340:20;379:4;402:43;442:2;402:43;:::i;:::-;474:2;468:9;486:31;514:2;506:6;486:31;:::i;:::-;552:18;;;586:15;;;;-1:-1:-1;621:15:1;;;671:1;667:10;;;655:23;;651:32;;648:41;-1:-1:-1;645:61:1;;;702:1;699;692:12;645:61;724:1;734:169;748:2;745:1;742:9;734:169;;;805:23;824:3;805:23;:::i;:::-;793:36;;849:12;;;;881;;;;766:1;759:9;734:169;;;-1:-1:-1;921:6:1;;192:741;-1:-1:-1;;;;;;;192:741:1:o;938:940::-;1002:5;1055:3;1048:4;1040:6;1036:17;1032:27;1022:55;;1073:1;1070;1063:12;1022:55;1109:6;1096:20;1135:4;1158:43;1198:2;1158:43;:::i;:::-;1230:2;1224:9;1242:31;1270:2;1262:6;1242:31;:::i;:::-;1308:18;;;1342:15;;;;-1:-1:-1;1377:15:1;;;1427:1;1423:10;;;1411:23;;1407:32;;1404:41;-1:-1:-1;1401:61:1;;;1458:1;1455;1448:12;1401:61;1480:1;1501;1511:337;1527:2;1522:3;1519:11;1511:337;;;1608:3;1595:17;-1:-1:-1;;;;;1631:11:1;1628:35;1625:55;;;1676:1;1673;1666:12;1625:55;1705:68;1769:3;1764:2;1750:11;1742:6;1738:24;1734:33;1705:68;:::i;:::-;1693:81;;-1:-1:-1;1794:12:1;;;;1826;;;;1549:1;1540:11;1511:337;;;-1:-1:-1;1866:6:1;;938:940;-1:-1:-1;;;;;;;;938:940:1:o;1883:735::-;1937:5;1990:3;1983:4;1975:6;1971:17;1967:27;1957:55;;2008:1;2005;1998:12;1957:55;2044:6;2031:20;2070:4;2093:43;2133:2;2093:43;:::i;:::-;2165:2;2159:9;2177:31;2205:2;2197:6;2177:31;:::i;:::-;2243:18;;;2277:15;;;;-1:-1:-1;2312:15:1;;;2362:1;2358:10;;;2346:23;;2342:32;;2339:41;-1:-1:-1;2336:61:1;;;2393:1;2390;2383:12;2336:61;2415:1;2425:163;2439:2;2436:1;2433:9;2425:163;;;2496:17;;2484:30;;2534:12;;;;2566;;;;2457:1;2450:9;2425:163;;2623:555;2665:5;2718:3;2711:4;2703:6;2699:17;2695:27;2685:55;;2736:1;2733;2726:12;2685:55;2772:6;2759:20;-1:-1:-1;;;;;2794:2:1;2791:26;2788:52;;;2820:18;;:::i;:::-;2869:2;2863:9;2881:67;2936:2;2917:13;;-1:-1:-1;;2913:27:1;2942:4;2909:38;2863:9;2881:67;:::i;:::-;2972:2;2964:6;2957:18;3018:3;3011:4;3006:2;2998:6;2994:15;2990:26;2987:35;2984:55;;;3035:1;3032;3025:12;2984:55;3099:2;3092:4;3084:6;3080:17;3073:4;3065:6;3061:17;3048:54;3146:1;3122:15;;;3139:4;3118:26;3111:37;;;;3126:6;2623:555;-1:-1:-1;;;2623:555:1:o;3183:186::-;3242:6;3295:2;3283:9;3274:7;3270:23;3266:32;3263:52;;;3311:1;3308;3301:12;3263:52;3334:29;3353:9;3334:29;:::i;3374:260::-;3442:6;3450;3503:2;3491:9;3482:7;3478:23;3474:32;3471:52;;;3519:1;3516;3509:12;3471:52;3542:29;3561:9;3542:29;:::i;:::-;3532:39;;3590:38;3624:2;3613:9;3609:18;3590:38;:::i;:::-;3580:48;;3374:260;;;;;:::o;3639:943::-;3793:6;3801;3809;3817;3825;3878:3;3866:9;3857:7;3853:23;3849:33;3846:53;;;3895:1;3892;3885:12;3846:53;3918:29;3937:9;3918:29;:::i;:::-;3908:39;;3966:38;4000:2;3989:9;3985:18;3966:38;:::i;:::-;3956:48;;4055:2;4044:9;4040:18;4027:32;-1:-1:-1;;;;;4119:2:1;4111:6;4108:14;4105:34;;;4135:1;4132;4125:12;4105:34;4158:61;4211:7;4202:6;4191:9;4187:22;4158:61;:::i;:::-;4148:71;;4272:2;4261:9;4257:18;4244:32;4228:48;;4301:2;4291:8;4288:16;4285:36;;;4317:1;4314;4307:12;4285:36;4340:63;4395:7;4384:8;4373:9;4369:24;4340:63;:::i;:::-;4330:73;;4456:3;4445:9;4441:19;4428:33;4412:49;;4486:2;4476:8;4473:16;4470:36;;;4502:1;4499;4492:12;4470:36;;4525:51;4568:7;4557:8;4546:9;4542:24;4525:51;:::i;:::-;4515:61;;;3639:943;;;;;;;;:::o;4587:606::-;4691:6;4699;4707;4715;4723;4776:3;4764:9;4755:7;4751:23;4747:33;4744:53;;;4793:1;4790;4783:12;4744:53;4816:29;4835:9;4816:29;:::i;:::-;4806:39;;4864:38;4898:2;4887:9;4883:18;4864:38;:::i;:::-;4854:48;;4949:2;4938:9;4934:18;4921:32;4911:42;;5000:2;4989:9;4985:18;4972:32;4962:42;;5055:3;5044:9;5040:19;5027:33;-1:-1:-1;;;;;5075:6:1;5072:30;5069:50;;;5115:1;5112;5105:12;5069:50;5138:49;5179:7;5170:6;5159:9;5155:22;5138:49;:::i;5198:669::-;5325:6;5333;5341;5394:2;5382:9;5373:7;5369:23;5365:32;5362:52;;;5410:1;5407;5400:12;5362:52;5433:29;5452:9;5433:29;:::i;:::-;5423:39;;5513:2;5502:9;5498:18;5485:32;-1:-1:-1;;;;;5577:2:1;5569:6;5566:14;5563:34;;;5593:1;5590;5583:12;5563:34;5616:61;5669:7;5660:6;5649:9;5645:22;5616:61;:::i;:::-;5606:71;;5730:2;5719:9;5715:18;5702:32;5686:48;;5759:2;5749:8;5746:16;5743:36;;;5775:1;5772;5765:12;5743:36;;5798:63;5853:7;5842:8;5831:9;5827:24;5798:63;:::i;:::-;5788:73;;;5198:669;;;;;:::o;5872:868::-;6017:6;6025;6033;6041;6094:3;6082:9;6073:7;6069:23;6065:33;6062:53;;;6111:1;6108;6101:12;6062:53;6134:29;6153:9;6134:29;:::i;:::-;6124:39;;6214:2;6203:9;6199:18;6186:32;-1:-1:-1;;;;;6278:2:1;6270:6;6267:14;6264:34;;;6294:1;6291;6284:12;6264:34;6317:61;6370:7;6361:6;6350:9;6346:22;6317:61;:::i;:::-;6307:71;;6431:2;6420:9;6416:18;6403:32;6387:48;;6460:2;6450:8;6447:16;6444:36;;;6476:1;6473;6466:12;6444:36;6499:63;6554:7;6543:8;6532:9;6528:24;6499:63;:::i;:::-;6489:73;;6615:2;6604:9;6600:18;6587:32;6571:48;;6644:2;6634:8;6631:16;6628:36;;;6660:1;6657;6650:12;6628:36;;6683:51;6726:7;6715:8;6704:9;6700:24;6683:51;:::i;:::-;6673:61;;;5872:868;;;;;;;:::o;6745:347::-;6810:6;6818;6871:2;6859:9;6850:7;6846:23;6842:32;6839:52;;;6887:1;6884;6877:12;6839:52;6910:29;6929:9;6910:29;:::i;:::-;6900:39;;6989:2;6978:9;6974:18;6961:32;7036:5;7029:13;7022:21;7015:5;7012:32;7002:60;;7058:1;7055;7048:12;7002:60;7081:5;7071:15;;;6745:347;;;;;:::o;7097:254::-;7165:6;7173;7226:2;7214:9;7205:7;7201:23;7197:32;7194:52;;;7242:1;7239;7232:12;7194:52;7265:29;7284:9;7265:29;:::i;:::-;7255:39;7341:2;7326:18;;;;7313:32;;-1:-1:-1;;;7097:254:1:o;7356:322::-;7433:6;7441;7449;7502:2;7490:9;7481:7;7477:23;7473:32;7470:52;;;7518:1;7515;7508:12;7470:52;7541:29;7560:9;7541:29;:::i;:::-;7531:39;7617:2;7602:18;;7589:32;;-1:-1:-1;7668:2:1;7653:18;;;7640:32;;7356:322;-1:-1:-1;;;7356:322:1:o;7683:531::-;7778:6;7786;7794;7802;7855:3;7843:9;7834:7;7830:23;7826:33;7823:53;;;7872:1;7869;7862:12;7823:53;7895:29;7914:9;7895:29;:::i;:::-;7885:39;;7971:2;7960:9;7956:18;7943:32;7933:42;;8022:2;8011:9;8007:18;7994:32;7984:42;;8077:2;8066:9;8062:18;8049:32;-1:-1:-1;;;;;8096:6:1;8093:30;8090:50;;;8136:1;8133;8126:12;8090:50;8159:49;8200:7;8191:6;8180:9;8176:22;8159:49;:::i;8219:1090::-;8439:6;8447;8455;8463;8516:3;8504:9;8495:7;8491:23;8487:33;8484:53;;;8533:1;8530;8523:12;8484:53;8573:9;8560:23;-1:-1:-1;;;;;8643:2:1;8635:6;8632:14;8629:34;;;8659:1;8656;8649:12;8629:34;8682:61;8735:7;8726:6;8715:9;8711:22;8682:61;:::i;:::-;8672:71;;8796:2;8785:9;8781:18;8768:32;8752:48;;8825:2;8815:8;8812:16;8809:36;;;8841:1;8838;8831:12;8809:36;8864:73;8929:7;8918:8;8907:9;8903:24;8864:73;:::i;:::-;8854:83;;8990:2;8979:9;8975:18;8962:32;8946:48;;9019:2;9009:8;9006:16;9003:36;;;9035:1;9032;9025:12;9003:36;9058:73;9123:7;9112:8;9101:9;9097:24;9058:73;:::i;9314:595::-;9432:6;9440;9493:2;9481:9;9472:7;9468:23;9464:32;9461:52;;;9509:1;9506;9499:12;9461:52;9549:9;9536:23;-1:-1:-1;;;;;9619:2:1;9611:6;9608:14;9605:34;;;9635:1;9632;9625:12;9605:34;9658:61;9711:7;9702:6;9691:9;9687:22;9658:61;:::i;:::-;9648:71;;9772:2;9761:9;9757:18;9744:32;9728:48;;9801:2;9791:8;9788:16;9785:36;;;9817:1;9814;9807:12;9785:36;;9840:63;9895:7;9884:8;9873:9;9869:24;9840:63;:::i;:::-;9830:73;;;9314:595;;;;;:::o;9914:180::-;9973:6;10026:2;10014:9;10005:7;10001:23;9997:32;9994:52;;;10042:1;10039;10032:12;9994:52;-1:-1:-1;10065:23:1;;9914:180;-1:-1:-1;9914:180:1:o;10099:254::-;10167:6;10175;10228:2;10216:9;10207:7;10203:23;10199:32;10196:52;;;10244:1;10241;10234:12;10196:52;10280:9;10267:23;10257:33;;10309:38;10343:2;10332:9;10328:18;10309:38;:::i;10358:248::-;10426:6;10434;10487:2;10475:9;10466:7;10462:23;10458:32;10455:52;;;10503:1;10500;10493:12;10455:52;-1:-1:-1;;10526:23:1;;;10596:2;10581:18;;;10568:32;;-1:-1:-1;10358:248:1:o;10611:245::-;10669:6;10722:2;10710:9;10701:7;10697:23;10693:32;10690:52;;;10738:1;10735;10728:12;10690:52;10777:9;10764:23;10796:30;10820:5;10796:30;:::i;10861:249::-;10930:6;10983:2;10971:9;10962:7;10958:23;10954:32;10951:52;;;10999:1;10996;10989:12;10951:52;11031:9;11025:16;11050:30;11074:5;11050:30;:::i;11300:435::-;11353:3;11391:5;11385:12;11418:6;11413:3;11406:19;11444:4;11473:2;11468:3;11464:12;11457:19;;11510:2;11503:5;11499:14;11531:1;11541:169;11555:6;11552:1;11549:13;11541:169;;;11616:13;;11604:26;;11650:12;;;;11685:15;;;;11577:1;11570:9;11541:169;;;-1:-1:-1;11726:3:1;;11300:435;-1:-1:-1;;;;;11300:435:1:o;11740:471::-;11781:3;11819:5;11813:12;11846:6;11841:3;11834:19;11871:1;11881:162;11895:6;11892:1;11889:13;11881:162;;;11957:4;12013:13;;;12009:22;;12003:29;11985:11;;;11981:20;;11974:59;11910:12;11881:162;;;12061:6;12058:1;12055:13;12052:87;;;12127:1;12120:4;12111:6;12106:3;12102:16;12098:27;12091:38;12052:87;-1:-1:-1;12193:2:1;12172:15;-1:-1:-1;;12168:29:1;12159:39;;;;12200:4;12155:50;;11740:471;-1:-1:-1;;11740:471:1:o;12424:826::-;-1:-1:-1;;;;;12821:15:1;;;12803:34;;12873:15;;12868:2;12853:18;;12846:43;12783:3;12920:2;12905:18;;12898:31;;;12746:4;;12952:57;;12989:19;;12981:6;12952:57;:::i;:::-;13057:9;13049:6;13045:22;13040:2;13029:9;13025:18;13018:50;13091:44;13128:6;13120;13091:44;:::i;:::-;13077:58;;13184:9;13176:6;13172:22;13166:3;13155:9;13151:19;13144:51;13212:32;13237:6;13229;13212:32;:::i;:::-;13204:40;12424:826;-1:-1:-1;;;;;;;;12424:826:1:o;13255:560::-;-1:-1:-1;;;;;13552:15:1;;;13534:34;;13604:15;;13599:2;13584:18;;13577:43;13651:2;13636:18;;13629:34;;;13694:2;13679:18;;13672:34;;;13514:3;13737;13722:19;;13715:32;;;13477:4;;13764:45;;13789:19;;13781:6;13764:45;:::i;:::-;13756:53;13255:560;-1:-1:-1;;;;;;;13255:560:1:o;13820:261::-;13999:2;13988:9;13981:21;13962:4;14019:56;14071:2;14060:9;14056:18;14048:6;14019:56;:::i;14086:465::-;14343:2;14332:9;14325:21;14306:4;14369:56;14421:2;14410:9;14406:18;14398:6;14369:56;:::i;:::-;14473:9;14465:6;14461:22;14456:2;14445:9;14441:18;14434:50;14501:44;14538:6;14530;14501:44;:::i;:::-;14493:52;14086:465;-1:-1:-1;;;;;14086:465:1:o;14930:219::-;15079:2;15068:9;15061:21;15042:4;15099:44;15139:2;15128:9;15124:18;15116:6;15099:44;:::i;15978:404::-;16180:2;16162:21;;;16219:2;16199:18;;;16192:30;16258:34;16253:2;16238:18;;16231:62;-1:-1:-1;;;16324:2:1;16309:18;;16302:38;16372:3;16357:19;;15978:404::o;17971:400::-;18173:2;18155:21;;;18212:2;18192:18;;;18185:30;18251:34;18246:2;18231:18;;18224:62;-1:-1:-1;;;18317:2:1;18302:18;;18295:34;18361:3;18346:19;;17971:400::o;18789:405::-;18991:2;18973:21;;;19030:2;19010:18;;;19003:30;19069:34;19064:2;19049:18;;19042:62;-1:-1:-1;;;19135:2:1;19120:18;;19113:39;19184:3;19169:19;;18789:405::o;19961:401::-;20163:2;20145:21;;;20202:2;20182:18;;;20175:30;20241:34;20236:2;20221:18;;20214:62;-1:-1:-1;;;20307:2:1;20292:18;;20285:35;20352:3;20337:19;;19961:401::o;20786:399::-;20988:2;20970:21;;;21027:2;21007:18;;;21000:30;21066:34;21061:2;21046:18;;21039:62;-1:-1:-1;;;21132:2:1;21117:18;;21110:33;21175:3;21160:19;;20786:399::o;21190:420::-;21392:2;21374:21;;;21431:2;21411:18;;;21404:30;21470:34;21465:2;21450:18;;21443:62;21541:26;21536:2;21521:18;;21514:54;21600:3;21585:19;;21190:420::o;21615:406::-;21817:2;21799:21;;;21856:2;21836:18;;;21829:30;21895:34;21890:2;21875:18;;21868:62;-1:-1:-1;;;21961:2:1;21946:18;;21939:40;22011:3;21996:19;;21615:406::o;24061:404::-;24263:2;24245:21;;;24302:2;24282:18;;;24275:30;24341:34;24336:2;24321:18;;24314:62;-1:-1:-1;;;24407:2:1;24392:18;;24385:38;24455:3;24440:19;;24061:404::o;24470:397::-;24672:2;24654:21;;;24711:2;24691:18;;;24684:30;24750:34;24745:2;24730:18;;24723:62;-1:-1:-1;;;24816:2:1;24801:18;;24794:31;24857:3;24842:19;;24470:397::o;25723:183::-;25783:4;-1:-1:-1;;;;;25808:6:1;25805:30;25802:56;;;25838:18;;:::i;:::-;-1:-1:-1;25883:1:1;25879:14;25895:4;25875:25;;25723:183::o;25911:128::-;25951:3;25982:1;25978:6;25975:1;25972:13;25969:39;;;25988:18;;:::i;:::-;-1:-1:-1;26024:9:1;;25911:128::o;26044:125::-;26084:4;26112:1;26109;26106:8;26103:34;;;26117:18;;:::i;:::-;-1:-1:-1;26154:9:1;;26044:125::o;26174:380::-;26253:1;26249:12;;;;26296;;;26317:61;;26371:4;26363:6;26359:17;26349:27;;26317:61;26424:2;26416:6;26413:14;26393:18;26390:38;26387:161;;;26470:10;26465:3;26461:20;26458:1;26451:31;26505:4;26502:1;26495:15;26533:4;26530:1;26523:15;26387:161;;26174:380;;;:::o;26559:249::-;26669:2;26650:13;;-1:-1:-1;;26646:27:1;26634:40;;-1:-1:-1;;;;;26689:34:1;;26725:22;;;26686:62;26683:88;;;26751:18;;:::i;:::-;26787:2;26780:22;-1:-1:-1;;26559:249:1:o;26813:135::-;26852:3;-1:-1:-1;;26873:17:1;;26870:43;;;26893:18;;:::i;:::-;-1:-1:-1;26940:1:1;26929:13;;26813:135::o;26953:127::-;27014:10;27009:3;27005:20;27002:1;26995:31;27045:4;27042:1;27035:15;27069:4;27066:1;27059:15;27085:127;27146:10;27141:3;27137:20;27134:1;27127:31;27177:4;27174:1;27167:15;27201:4;27198:1;27191:15;27217:127;27278:10;27273:3;27269:20;27266:1;27259:31;27309:4;27306:1;27299:15;27333:4;27330:1;27323:15;27349:127;27410:10;27405:3;27401:20;27398:1;27391:31;27441:4;27438:1;27431:15;27465:4;27462:1;27455:15;27481:179;27516:3;27558:1;27540:16;27537:23;27534:120;;;27604:1;27601;27598;27583:23;-1:-1:-1;27641:1:1;27635:8;27630:3;27626:18;27534:120;27481:179;:::o;27665:671::-;27704:3;27746:4;27728:16;27725:26;27722:39;;;27665:671;:::o;27722:39::-;27788:2;27782:9;-1:-1:-1;;27853:16:1;27849:25;;27846:1;27782:9;27825:50;27904:4;27898:11;27928:16;-1:-1:-1;;;;;28034:2:1;28027:4;28019:6;28015:17;28012:25;28007:2;27999:6;27996:14;27993:45;27990:58;;;28041:5;;;;;27665:671;:::o;27990:58::-;28078:6;28072:4;28068:17;28057:28;;28114:3;28108:10;28141:2;28133:6;28130:14;28127:27;;;28147:5;;;;;;27665:671;:::o;28127:27::-;28231:2;28212:16;28206:4;28202:27;28198:36;28191:4;28182:6;28177:3;28173:16;28169:27;28166:69;28163:82;;;28238:5;;;;;;27665:671;:::o;28163:82::-;28254:57;28305:4;28296:6;28288;28284:19;28280:30;28274:4;28254:57;:::i;:::-;-1:-1:-1;28327:3:1;;27665:671;-1:-1:-1;;;;;27665:671:1:o;28341:131::-;-1:-1:-1;;;;;;28415:32:1;;28405:43;;28395:71;;28462:1;28459;28452:12
Swarm Source
ipfs://8c65299741a7ff131f7bf0cece35a9fa6fc325df14d9e40f9a6427d737b8aa21