Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
PetNFT
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 320 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.28;import {SamWitchERC1155UpgradeableSinglePerToken} from "./SamWitchERC1155UpgradeableSinglePerToken.sol";import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";import {IERC2981, IERC165} from "@openzeppelin/contracts/interfaces/IERC2981.sol";import {IERC1155} from "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";import {AdminAccess} from "./AdminAccess.sol";import {RandomnessBeacon} from "./RandomnessBeacon.sol";import {IPlayers} from "./interfaces/IPlayers.sol";import {IBrushToken} from "./interfaces/external/IBrushToken.sol";import {SkillLibrary} from "./libraries/SkillLibrary.sol";import {EstforLibrary} from "./EstforLibrary.sol";import {PetNFTLibrary} from "./PetNFTLibrary.sol";import {BloomFilter} from "./libraries/BloomFilter.sol";// solhint-disable-next-line no-global-importimport {Skill} from "./globals/misc.sol";import {Pet, PetSkin, PetEnhancementType, BasePetMetadata} from "./globals/pets.sol";
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)pragma solidity ^0.8.20;import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol";import {Initializable} from "../proxy/utils/Initializable.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.** The initial owner is set to the address provided by the deployer. 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 OwnableUpgradeable is Initializable, ContextUpgradeable {/// @custom:storage-location erc7201:openzeppelin.storage.Ownablestruct OwnableStorage {address _owner;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)pragma solidity ^0.8.20;/*** @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.** The initialization functions use a version number. Once a version number is used, it is consumed and cannot be* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in* case an upgrade adds a module that needs to be initialized.** For example:** [.hljs-theme-light.nopadding]* ```solidity* contract MyToken is ERC20Upgradeable {* function initialize() initializer public {* __ERC20_init("MyToken", "MTK");* }* }** contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (proxy/utils/UUPSUpgradeable.sol)pragma solidity ^0.8.20;import {IERC1822Proxiable} from "@openzeppelin/contracts/interfaces/draft-IERC1822.sol";import {ERC1967Utils} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol";import {Initializable} from "./Initializable.sol";/*** @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an* {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.** A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is* reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing* `UUPSUpgradeable` with a custom implementation of upgrades.** The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.*/abstract contract UUPSUpgradeable is Initializable, IERC1822Proxiable {/// @custom:oz-upgrades-unsafe-allow state-variable-immutableaddress private immutable __self = address(this);/*** @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)`* and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called,
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)pragma solidity ^0.8.20;import {Initializable} from "../proxy/utils/Initializable.sol";/*** @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 ContextUpgradeable is Initializable {function __Context_init() internal onlyInitializing {}function __Context_init_unchained() internal onlyInitializing {}function _msgSender() internal view virtual returns (address) {return msg.sender;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)pragma solidity ^0.8.20;import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";import {Initializable} from "../../proxy/utils/Initializable.sol";/*** @dev Implementation of the {IERC165} interface.** Contracts that want to implement ERC-165 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);* }* ```*/abstract contract ERC165Upgradeable is Initializable, IERC165 {function __ERC165_init() internal onlyInitializing {}function __ERC165_init_unchained() internal onlyInitializing {}
1234567891011121314151617181920// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC1822.sol)pragma solidity ^0.8.20;/*** @dev ERC-1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified* proxy whose upgrades are fully controlled by the current implementation.*/interface IERC1822Proxiable {/*** @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation* address.** IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks* bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this* function revert if invoked through a proxy.*/function proxiableUUID() external view returns (bytes32);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)pragma solidity ^0.8.20;/*** @dev Standard ERC-20 Errors* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.*/interface IERC20Errors {/*** @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.* @param sender Address whose tokens are being transferred.* @param balance Current balance for the interacting account.* @param needed Minimum amount required to perform a transfer.*/error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);/*** @dev Indicates a failure with the token `sender`. Used in transfers.* @param sender Address whose tokens are being transferred.*/error ERC20InvalidSender(address sender);/*** @dev Indicates a failure with the token `receiver`. Used in transfers.* @param receiver Address to which tokens are being transferred.
123456789101112131415161718192021222324// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol)pragma solidity ^0.8.20;/*** @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.*/interface IERC1967 {/*** @dev Emitted when the implementation is upgraded.*/event Upgraded(address indexed implementation);/*** @dev Emitted when the admin account has changed.*/event AdminChanged(address previousAdmin, address newAdmin);/*** @dev Emitted when the beacon is changed.*/event BeaconUpgraded(address indexed beacon);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC2981.sol)pragma solidity ^0.8.20;import {IERC165} from "../utils/introspection/IERC165.sol";/*** @dev Interface for the NFT Royalty Standard.** A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal* support for royalty payments across all NFT marketplaces and ecosystem participants.*/interface IERC2981 is IERC165 {/*** @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of* exchange. The royalty amount is denominated and should be paid in that same unit of exchange.** NOTE: ERC-2981 allows setting the royalty to 100% of the price. In that case all the price would be sent to the* royalty receiver and 0 tokens to the seller. Contracts dealing with royalty should consider empty transfers.*/function royaltyInfo(uint256 tokenId,uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);}
12345678910111213141516// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)pragma solidity ^0.8.20;/*** @dev This is the interface that {BeaconProxy} expects of its beacon.*/interface IBeacon {/*** @dev Must return an address that can be used as a delegate call target.** {UpgradeableBeacon} will check that this address is a contract.*/function implementation() external view returns (address);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (proxy/ERC1967/ERC1967Utils.sol)pragma solidity ^0.8.21;import {IBeacon} from "../beacon/IBeacon.sol";import {IERC1967} from "../../interfaces/IERC1967.sol";import {Address} from "../../utils/Address.sol";import {StorageSlot} from "../../utils/StorageSlot.sol";/*** @dev This library provides getters and event emitting update functions for* https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] slots.*/library ERC1967Utils {/*** @dev Storage slot with the address of the current implementation.* This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1.*/// solhint-disable-next-line private-vars-leading-underscorebytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;/*** @dev The `implementation` of the proxy is invalid.*/error ERC1967InvalidImplementation(address implementation);
1234567891011121314151617181920// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC1155/extensions/IERC1155MetadataURI.sol)pragma solidity ^0.8.20;import {IERC1155} from "../IERC1155.sol";/*** @dev Interface of the optional ERC1155MetadataExtension interface, as defined* in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[ERC].*/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);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC1155/IERC1155.sol)pragma solidity ^0.8.20;import {IERC165} from "../../utils/introspection/IERC165.sol";/*** @dev Required interface of an ERC-1155 compliant contract, as defined in the* https://eips.ethereum.org/EIPS/eip-1155[ERC].*/interface IERC1155 is IERC165 {/*** @dev Emitted when `value` amount of tokens of 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,
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC1155/IERC1155Receiver.sol)pragma solidity ^0.8.20;import {IERC165} from "../../utils/introspection/IERC165.sol";/*** @dev Interface that must be implemented by smart contracts in order to receive* ERC-1155 token transfers.*/interface IERC1155Receiver is IERC165 {/*** @dev Handles the receipt of a single ERC-1155 token type. This function is* called at the end of a `safeTransferFrom` after the balance has been updated.** NOTE: To accept the transfer, this must return* `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`* (i.e. 0xf23a6e61, or its own function selector).** @param operator The address which initiated the transfer (i.e. msg.sender)* @param from The address which previously owned the token* @param id The ID of the token being transferred* @param value The amount of tokens being transferred* @param data Additional data with no specified format* @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)pragma solidity ^0.8.20;/*** @dev Interface of the ERC-20 standard as defined in the ERC.*/interface IERC20 {/*** @dev Emitted when `value` tokens are moved from one account (`from`) to* another (`to`).** Note that `value` may be zero.*/event Transfer(address indexed from, address indexed to, uint256 value);/*** @dev Emitted when the allowance of a `spender` for an `owner` is set by* a call to {approve}. `value` is the new allowance.*/event Approval(address indexed owner, address indexed spender, uint256 value);/*** @dev Returns the value of tokens in existence.*/
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/Address.sol)pragma solidity ^0.8.20;import {Errors} from "./Errors.sol";/*** @dev Collection of functions related to the address type*/library Address {/*** @dev There's no code at `target` (it is not a contract).*/error AddressEmptyCode(address target);/*** @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://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/Arrays.sol)// This file was procedurally generated from scripts/generate/templates/Arrays.js.pragma solidity ^0.8.20;import {Comparators} from "./Comparators.sol";import {SlotDerivation} from "./SlotDerivation.sol";import {StorageSlot} from "./StorageSlot.sol";import {Math} from "./math/Math.sol";/*** @dev Collection of functions related to array types.*/library Arrays {using SlotDerivation for bytes32;using StorageSlot for bytes32;/*** @dev Sort an array of uint256 (in memory) following the provided comparator function.** This function does the sorting "in place", meaning that it overrides the input. The object is returned for* convenience, but that returned value can be discarded safely if the caller has a memory pointer to the array.** NOTE: this function's cost is `O(n · log(n))` in average and `O(n²)` in the worst case, with n the length of the* array. Using it in view functions that are executed through `eth_call` is safe, but one should be very careful
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/Base64.sol)pragma solidity ^0.8.20;/*** @dev Provides a set of functions to operate with Base64 strings.*/library Base64 {/*** @dev Base64 Encoding/Decoding Table* See sections 4 and 5 of https://datatracker.ietf.org/doc/html/rfc4648*/string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";string internal constant _TABLE_URL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";/*** @dev Converts a `bytes` to its Bytes64 `string` representation.*/function encode(bytes memory data) internal pure returns (string memory) {return _encode(data, _TABLE, true);}/*** @dev Converts a `bytes` to its Bytes64Url `string` representation.* Output is not padded with `=` as specified in https://www.rfc-editor.org/rfc/rfc4648[rfc4648].
12345678910111213141516171819// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/Comparators.sol)pragma solidity ^0.8.20;/*** @dev Provides a set of functions to compare values.** _Available since v5.1._*/library Comparators {function lt(uint256 a, uint256 b) internal pure returns (bool) {return a < b;}function gt(uint256 a, uint256 b) internal pure returns (bool) {return a > b;}}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)pragma solidity ^0.8.20;/*** @dev Collection of common custom errors used in multiple contracts** IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.* It is recommended to avoid relying on the error API for critical functionality.** _Available since v5.1._*/library Errors {/*** @dev The ETH balance of the account is not enough to perform the operation.*/error InsufficientBalance(uint256 balance, uint256 needed);/*** @dev A call to an address target failed. The target may have reverted.*/error FailedCall();/*** @dev The deployment failed.
12345678910111213141516171819202122232425// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)pragma solidity ^0.8.20;/*** @dev Interface of the ERC-165 standard, as defined in the* https://eips.ethereum.org/EIPS/eip-165[ERC].** 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[ERC 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);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/Math.sol)pragma solidity ^0.8.20;import {Panic} from "../Panic.sol";import {SafeCast} from "./SafeCast.sol";/*** @dev Standard math utilities missing in the Solidity language.*/library Math {enum Rounding {Floor, // Toward negative infinityCeil, // Toward positive infinityTrunc, // Toward zeroExpand // Away from zero}/*** @dev Returns the addition of two unsigned integers, with an success flag (no overflow).*/function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {unchecked {uint256 c = a + b;if (c < a) return (false, 0);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)// This file was procedurally generated from scripts/generate/templates/SafeCast.js.pragma solidity ^0.8.20;/*** @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow* checks.** Downcasting from uint256/int256 in Solidity does not revert on overflow. This can* easily result in undesired exploitation or bugs, since developers usually* assume that overflows raise errors. `SafeCast` restores this intuition by* reverting the transaction when such an operation overflows.** Using this library instead of the unchecked operations eliminates an entire* class of bugs, so it's recommended to use it always.*/library SafeCast {/*** @dev Value doesn't fit in an uint of `bits` size.*/error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);/*** @dev An int value doesn't fit in an uint of `bits` size.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)pragma solidity ^0.8.20;import {SafeCast} from "./SafeCast.sol";/*** @dev Standard signed math utilities missing in the Solidity language.*/library SignedMath {/*** @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.** IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.* However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute* one branch when needed, making this function more expensive.*/function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {unchecked {// branchless ternary works because:// b ^ (a ^ b) == a// b ^ 0 == breturn b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));}}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)pragma solidity ^0.8.20;/*** @dev Helper library for emitting standardized panic codes.** ```solidity* contract Example {* using Panic for uint256;** // Use any of the declared internal constants* function foo() { Panic.GENERIC.panic(); }** // Alternatively* function foo() { Panic.panic(Panic.GENERIC); }* }* ```** Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].** _Available since v5.1._*/// slither-disable-next-line unused-statelibrary Panic {
12345678910111213141516171819202122232425// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/SlotDerivation.sol)// This file was procedurally generated from scripts/generate/templates/SlotDerivation.js.pragma solidity ^0.8.20;/*** @dev Library for computing storage (and transient storage) locations from namespaces and deriving slots* corresponding to standard patterns. The derivation method for array and mapping matches the storage layout used by* the solidity language / compiler.** See https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays[Solidity docs for mappings and dynamicarrays.].** Example usage:* ```solidity* contract Example {* // Add the library methods* using StorageSlot for bytes32;* using SlotDerivation for bytes32;** // Declare a namespace* string private constant _NAMESPACE = "<namespace>" // eg. OpenZeppelin.Slot** function setValueInNamespace(uint256 key, address newValue) internal {* _NAMESPACE.erc7201Slot().deriveMapping(key).getAddressSlot().value = newValue;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.pragma solidity ^0.8.20;/*** @dev Library for reading and writing primitive types to specific storage slots.** Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.* This library helps with reading and writing to such slots without the need for inline assembly.** The functions in this library return Slot structs that contain a `value` member that can be used to read or write.** Example usage to set ERC-1967 implementation slot:* ```solidity* contract ERC1967 {* // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.* bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;** function _getImplementation() internal view returns (address) {* return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;* }** function _setImplementation(address newImplementation) internal {* require(newImplementation.code.length > 0);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/Strings.sol)pragma solidity ^0.8.20;import {Math} from "./math/Math.sol";import {SignedMath} from "./math/SignedMath.sol";/*** @dev String operations.*/library Strings {bytes16 private constant HEX_DIGITS = "0123456789abcdef";uint8 private constant ADDRESS_LENGTH = 20;/*** @dev The `value` string doesn't fit in the specified `length`.*/error StringsInsufficientHexLength(uint256 value, uint256 length);/*** @dev Converts a `uint256` to its ASCII `string` decimal representation.*/function toString(uint256 value) internal pure returns (string memory) {unchecked {uint256 length = Math.log10(value) + 1;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (utils/structs/BitMaps.sol)pragma solidity ^0.8.20;/*** @dev Library for managing uint256 to bool mapping in a compact and efficient way, provided the keys are sequential.* Largely inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor].** BitMaps pack 256 booleans across each bit of a single 256-bit slot of `uint256` type.* Hence booleans corresponding to 256 _sequential_ indices would only consume a single slot,* unlike the regular `bool` which would consume an entire slot for a single value.** This results in gas savings in two ways:** - Setting a zero value to non-zero only once every 256 times* - Accessing the same warm slot for every 256 _sequential_ indices*/library BitMaps {struct BitMap {mapping(uint256 bucket => uint256) _data;}/*** @dev Returns whether the bit at `index` is set.*/function get(BitMap storage bitmap, uint256 index) internal view returns (bool) {
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.28;import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";contract AdminAccess is UUPSUpgradeable, OwnableUpgradeable {mapping(address admin => bool isAdmin) private _admins;mapping(address admin => bool isAdmin) private _promotionalAdmins;/// @custom:oz-upgrades-unsafe-allow constructorconstructor() {_disableInitializers();}function initialize(address[] calldata admins, address[] calldata promotionalAdmins) public initializer {__Ownable_init(_msgSender());__UUPSUpgradeable_init();_updateAdmins(admins, true);_updatePromotionalAdmins(promotionalAdmins, true);}function _updateAdmins(address[] calldata admins, bool hasAdmin) internal {uint256 bounds = admins.length;for (uint256 i; i < bounds; ++i) {
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.28;import {IPlayers} from "./interfaces/IPlayers.sol";// solhint-disable-next-line no-global-importimport "./globals/all.sol";// This file contains methods for interacting with generic functions like trimming strings, lowercase etc.// Also has some shared functions for rewardslibrary EstforLibrary {error RandomRewardsMustBeInOrder(uint16 chance1, uint16 chance2);error RandomRewardNoDuplicates();error GuaranteedRewardsNoDuplicates();error TooManyGuaranteedRewards();error TooManyRandomRewards();function isWhitespace(bytes1 _char) internal pure returns (bool) {return_char == 0x20 || // Space_char == 0x09 || // Tab_char == 0x0a || // Line feed_char == 0x0D || // Carriage return_char == 0x0B || // Vertical tab_char == 0x00; // empty byte}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.28;import {Skill, Attire, CombatStyle, CombatStats} from "./misc.sol";import {GuaranteedReward, RandomReward} from "./rewards.sol";enum ActionQueueStrategy {OVERWRITE,APPEND,KEEP_LAST_IN_PROGRESS}struct QueuedActionInput {Attire attire;uint16 actionId;uint16 regenerateId; // Food (combat), maybe something for non-combat lateruint16 choiceId; // Melee/Ranged/Magic (combat), logs, ore (non-combat)uint16 rightHandEquipmentTokenId; // Axe/Sword/bow, can be emptyuint16 leftHandEquipmentTokenId; // Shield, can be emptyuint24 timespan; // How long to queue the action foruint8 combatStyle; // CombatStyle specific style of combatuint40 petId; // id of the pet (can be empty)}struct QueuedAction {uint16 actionId;
123456789101112// SPDX-License-Identifier: MITpragma solidity ^0.8.28;import "./actions.sol";import "./items.sol";import "./misc.sol";import "./players.sol";import "./rewards.sol";import "./quests.sol";import "./promotions.sol";import "./clans.sol";import "./pets.sol";
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.28;import {IBank} from "../interfaces/IBank.sol";enum ClanRank {NONE, // Not in a clanCOMMONER, // Member of the clanSCOUT, // Invite and kick commonersCOLONEL, // Can launch attacks and assign combatantsTREASURER, // Can withdraw from bankLEADER, // Can edit clan detailsOWNER // Can do everything and transfer ownership}enum BattleResultEnum {DRAW,WIN,LOSE}struct ClanBattleInfo {uint40 lastClanIdAttackOtherClanIdCooldownTimestamp;uint8 numReattacks;uint40 lastOtherClanIdAttackClanIdCooldownTimestamp;uint8 numReattacksOtherClan;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.28;uint16 constant NONE = 0;uint16 constant COMBAT_BASE = 2048;// Meleeuint16 constant SWORD_BASE = COMBAT_BASE;uint16 constant BRONZE_SWORD = SWORD_BASE;// Woodcutting (2816 - 3071)uint16 constant WOODCUTTING_BASE = 2816;uint16 constant BRONZE_AXE = WOODCUTTING_BASE;// Firemaking (3328 - 3583)uint16 constant FIRE_BASE = 3328;uint16 constant MAGIC_FIRE_STARTER = FIRE_BASE;uint16 constant FIRE_MAX = FIRE_BASE + 255;// Fishing (3072 - 3327)uint16 constant FISHING_BASE = 3072;uint16 constant NET_STICK = FISHING_BASE;// Mining (2560 - 2815)uint16 constant MINING_BASE = 2560;uint16 constant BRONZE_PICKAXE = MINING_BASE;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.28;enum BoostType {NONE,ANY_XP,COMBAT_XP,NON_COMBAT_XP,GATHERING,ABSENCE,PASSIVE_SKIP_CHANCE,// Clan warsPVP_BLOCK,PVP_REATTACK,PVP_SUPER_ATTACK,// Combat statsCOMBAT_FIXED}struct Equipment {uint16 itemTokenId;uint24 amount;}enum Skill {NONE,
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.28;import {Skill} from "./misc.sol";enum PetSkin {NONE,DEFAULT,OG,ONEKIN,FROST,CRYSTAL,ANNIV1,KRAGSTYR}enum PetEnhancementType {NONE,MELEE,MAGIC,RANGED,DEFENCE,HEALTH,MELEE_AND_DEFENCE,MAGIC_AND_DEFENCE,RANGED_AND_DEFENCE
12345678910111213141516171819// SPDX-License-Identifier: MITpragma solidity ^0.8.28;import {QueuedAction} from "./actions.sol";import {Skill, BoostType, CombatStats, Equipment} from "./misc.sol";import {PlayerQuest} from "./quests.sol";// 4 bytes for each level. 0x00000000 is the first level, 0x00000054 is the second, etc.bytes constant XP_BYTES = hex"0000000000000054000000AE0000010E00000176000001E60000025E000002DE00000368000003FD0000049B00000546000005FC000006C000000792000008730000096400000A6600000B7B00000CA400000DE100000F36000010A200001229000013CB0000158B0000176B0000196E00001B9400001DE20000205A000022FF000025D5000028DD00002C1E00002F99000033540000375200003B9A000040300000451900004A5C00004FFF0000560900005C810000637000006ADD000072D100007B570000847900008E42000098BE0000A3F90000B0020000BCE70000CAB80000D9860000E9630000FA6200010C990001201D0001350600014B6F0001637300017D2E000198C10001B64E0001D5F80001F7E600021C430002433B00026CFD000299BE0002C9B30002FD180003342B00036F320003AE730003F23D00043AE3000488BE0004DC2F0005359B000595700005FC2400066A360006E02D00075E990007E6160008774C000912EB0009B9B4000A6C74000B2C06000BF956000CD561000DC134000EBDF3000FCCD40010EF2400122648001373BF0014D9230016582C0017F2B00019AAA9001B8234001D7B95001F99390021DDBC00244BE60026E6B60029B15F002CAF51002FE43A0033540D00370303003AF5A4003F30CC0043B9B0004895E3004DCB600053609100595C53005FC6030066A585006E034D0075E86C007E5E980087703B0091287D009B935300A6BD8F00B2B4EE00BF882800CD470500DC026F00EBCC8500FCB8B7010EDBD5";uint256 constant MAX_LEVEL = 140; // Original max leveluint256 constant MAX_LEVEL_1 = 160; // TODO: Update lateruint256 constant MAX_LEVEL_2 = 190; // TODO: Update laterenum EquipPosition {NONE,HEAD,NECK,BODY,ARMS,
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.28;enum Promotion {NONE,STARTER,HALLOWEEN_2023,XMAS_2023,HALLOWEEN_2024,HOLIDAY4, // Just have placeholders for nowHOLIDAY5,HOLIDAY6,HOLIDAY7,HOLIDAY8,HOLIDAY9,HOLIDAY10}enum PromotionMintStatus {NONE,SUCCESS,PROMOTION_ALREADY_CLAIMED,ORACLE_NOT_CALLED,MINTING_OUTSIDE_AVAILABLE_DATE,PLAYER_DOES_NOT_QUALIFY,PLAYER_NOT_HIT_ENOUGH_CLAIMS_FOR_STREAK_BONUS,
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.28;import {Skill} from "./misc.sol";struct QuestInput {uint16 dependentQuestId; // The quest that must be completed before this one can be starteduint16 actionId1; // action to douint16 actionNum1; // how many (up to 65535)uint16 actionId2; // another action to douint16 actionNum2; // how many (up to 65535)uint16 actionChoiceId; // actionChoice to performuint16 actionChoiceNum; // how many to do (base number), (up to 65535)Skill skillReward; // The skill to reward XP touint24 skillXPGained; // The amount of XP to give (up to 65535)uint16 rewardItemTokenId1; // Reward an itemuint16 rewardAmount1; // amount of the reward (up to 65535)uint16 rewardItemTokenId2; // Reward another itemuint16 rewardAmount2; // amount of the reward (up to 65535)uint16 burnItemTokenId; // Burn an itemuint16 burnAmount; // amount of the burn (up to 65535)uint16 questId; // Unique id for this questbool isFullModeOnly; // If true this quest requires the user be evolveduint8 worldLocation; // 0 is the main starting world}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.28;import {BoostType, Equipment} from "./misc.sol";struct GuaranteedReward {uint16 itemTokenId;uint16 rate; // num per hour (base 10, 1 decimal) for actions and num per duration for passive actions}struct RandomReward {uint16 itemTokenId;uint16 chance; // out of 65535uint8 amount; // out of 255}struct PendingRandomReward {uint16 actionId;uint40 startTime;uint24 xpElapsedTime;uint16 boostItemTokenId;uint24 elapsedTime;uint40 boostStartTime; // When the boost was starteduint24 sentinelElapsedTime;// Full equipment at the time this was generateduint8 fullAttireBonusRewardsPercent;
1234567891011121314// SPDX-License-Identifier: MITpragma solidity ^0.8.28;import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";interface IBrushToken is IERC20 {function burn(uint256 amount) external;function burnFrom(address account, uint256 amount) external;function transferFromBulk(address from, address[] calldata tos, uint256[] calldata amounts) external;function transferOwnership(address newOwner) external;}
12345678910111213141516171819202122// SPDX-License-Identifier: MITpragma solidity ^0.8.28;interface IBank {function initialize() external;function initializeAddresses(uint256 clanId,address bankRegistry,address bankRelay,address playerNFT,address itemNFT,address clans,address players,address lockedBankVaults,address raids) external;function depositToken(address sender, address from, uint256 playerId, address token, uint256 amount) external;function setAllowBreachedCapacity(bool allow) external;}
123456// SPDX-License-Identifier: MITpragma solidity ^0.8.28;interface IOracleCB {function newOracleRandomWords(uint256 randomWord) external;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.28;import "../globals/misc.sol";import "../globals/players.sol";interface IPlayers {function clearEverythingBeforeTokenTransfer(address from, uint256 tokenId) external;function beforeTokenTransferTo(address to, uint256 tokenId) external;function getURI(uint256 playerId,string calldata name,string calldata avatarName,string calldata avatarDescription,string calldata imageURI) external view returns (string memory);function mintedPlayer(address from,uint256 playerId,Skill[2] calldata startSkills,bool makeActive,uint256[] calldata startingItemTokenIds,uint256[] calldata startingAmounts
123456789101112131415161718// SPDX-License-Identifier: MITpragma solidity ^0.8.28;interface ISamWitchVRF {function requestRandomWords(uint256 numWords, uint256 callbackGasLimit) external returns (bytes32 requestId);function fulfillRandomWords(bytes32 requestId,address oracle,address fulfillAddress,uint256 callbackGasLimit,uint256 numWords,uint256[2] calldata publicKey,uint256[4] calldata proof,uint256[2] calldata uPoint,uint256[4] calldata vComponents) external returns (bool callSuccess);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.28;import {CombatStats, Skill} from "../globals/misc.sol";import {ActionChoice} from "../globals/players.sol";import {ActionRewards} from "../globals/rewards.sol";import {ActionInfo} from "../globals/actions.sol";interface IWorldActions {function getXPPerHour(uint16 actionId, uint16 actionChoiceId) external view returns (uint24 xpPerHour);function getNumSpawn(uint16 actionId) external view returns (uint256 numSpawned);function getActionSuccessPercentAndMinXP(uint16 actionId) external view returns (uint8 successPercent, uint32 minXP);function getCombatStats(uint16 actionId) external view returns (CombatStats memory stats);function getActionChoice(uint16 actionId, uint16 choiceId) external view returns (ActionChoice memory choice);function getRewardsHelper(uint16 actionId) external view returns (ActionRewards memory, Skill skill, uint256 numSpawned); // , uint8 worldLocation);function getSkill(uint256 actionId) external view returns (Skill skill);function getActionRewards(uint256 actionId) external view returns (ActionRewards memory);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.28;import "@openzeppelin/contracts/utils/structs/BitMaps.sol";library BloomFilter {using BitMaps for BitMaps.BitMap;struct Filter {uint8 hashCount; // Number of hash functions to useuint64 bitCount; // Number of bits in the bitmapBitMaps.BitMap bitmap; // Bitmap using OpenZeppelin’s BitMaps library to support up to 65,536 bits}error ZeroHashCount();/*** @notice Calculates the optimal number of hash functions based on the expected number of items.* @param expectedItems Expected number of items to be added to the filter.* @param bitCount Number of bits in the bitmap.* @return hashCount The number of hash functions to be used.*/function _getOptimalHashCount(uint256 expectedItems, uint64 bitCount) internal pure returns (uint8 hashCount) {uint256 calculatedHashCount = (bitCount * 144) / (expectedItems * 100) + 1;hashCount = calculatedHashCount < 256 ? uint8(calculatedHashCount) : 255;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.28;import {Skill} from "../globals/misc.sol";library SkillLibrary {error InvalidSkillId(uint8 skill);function _asSkill(uint8 skill) internal pure returns (Skill) {require(skill >= uint8(type(Skill).min) && skill <= uint8(type(Skill).max), InvalidSkillId(skill));return Skill(skill);}function _isSkill(uint8 skill) internal pure returns (bool) {return _isSkill(_asSkill(skill));}function _isSkill(uint8 skill, Skill check) internal pure returns (bool) {return _isSkill(_asSkill(skill), check);}function _isSkillCombat(uint8 skill) internal pure returns (bool) {return _isSkillCombat(_asSkill(skill));}function _isSkillNone(uint8 skill) internal pure returns (bool) {
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.28;import {Base64} from "@openzeppelin/contracts/utils/Base64.sol";import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";import {Skill} from "./globals/misc.sol";import {Pet, PetSkin, PetEnhancementType, BasePetMetadata} from "./globals/pets.sol";// This file contains methods for interacting with the pet NFT, used to decrease implementation deployment bytecode code.library PetNFTLibrary {using Strings for uint256;error InvalidSkin(PetSkin skin);error InvalidPetEnhancementType(PetEnhancementType petEnhancementType);string private constant PET_NAME_PREFIX = "Pet ";function uri(BasePetMetadata storage basePetMetadata,Pet storage pet,uint256 tokenId,string storage imageBaseUri,string memory name,bool isBeta) external view returns (string memory) {
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.28;import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";import {SkillLibrary} from "./libraries/SkillLibrary.sol";import {IOracleCB} from "./interfaces/IOracleCB.sol";import {ISamWitchVRF} from "./interfaces/ISamWitchVRF.sol";import {IWorldActions} from "./interfaces/IWorldActions.sol";// solhint-disable-next-line no-global-importimport "./globals/all.sol";contract RandomnessBeacon is UUPSUpgradeable, OwnableUpgradeable {using SkillLibrary for uint8;using SkillLibrary for Skill;event RequestSent(uint256 requestId, uint256 numWords, uint256 lastRandomWordsUpdatedTime);event RequestFulfilled(uint256 requestId, uint256 randomWord);error RandomWordsCannotBeUpdatedYet();error CanOnlyRequestAfterTheNextCheckpoint(uint256 currentTime, uint256 checkpoint);error RequestAlreadyFulfilled();error NoValidRandomWord();error LengthMismatch();
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.26;import {IERC1155} from "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";import {IERC1155Receiver} from "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol";import {IERC1155MetadataURI} from "@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol";import {ContextUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";import {ERC165Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol";import {Arrays} from "@openzeppelin/contracts/utils/Arrays.sol";import {IERC1155Errors} from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol";import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";/*** @dev Implementation of the basic standard multi-token.* See https://eips.ethereum.org/EIPS/eip-1155* Originally based on code by OpenZeppelin v5.0.0*/abstract contract SamWitchERC1155UpgradeableSinglePerToken isInitializable,ContextUpgradeable,ERC165Upgradeable,IERC1155,IERC1155MetadataURI,IERC1155Errors{
1234567891011121314151617181920212223242526{"evmVersion": "cancun","optimizer": {"enabled": true,"runs": 320,"details": {"yul": true}},"viaIR": true,"outputSelection": {"*": {"*": ["evm.bytecode","evm.deployedBytecode","devdoc","userdoc","metadata","abi"]}},"metadata": {"useLiteralContent": true},"libraries": {
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"uint256","name":"petId","type":"uint256"}],"name":"CannotTransferThisPet","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC1155InvalidApprover","type":"error"},{"inputs":[{"internalType":"uint256","name":"idsLength","type":"uint256"},{"internalType":"uint256","name":"valuesLength","type":"uint256"}],"name":"ERC1155InvalidArrayLength","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC1155InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC1155InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC1155InvalidSender","type":"error"},{"inputs":[],"name":"ERC1155Metadata_URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ERC1155MintingMoreThanOneSameNFT","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155MissingApprovalForAll","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalNameStart","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"InvalidTimestamp","type":"error"},{"inputs":[],"name":"LengthMismatch","type":"error"},{"inputs":[{"internalType":"enum Skill","name":"skill","type":"uint8"},{"internalType":"uint256","name":"level","type":"uint256"}],"name":"LevelNotHighEnough","type":"error"},{"inputs":[],"name":"MustHaveAtLeastPercentageOrFixedSet","type":"error"},{"inputs":[],"name":"MustHaveOneSkillEnhancement","type":"error"},{"inputs":[],"name":"NameAlreadyExists","type":"error"},{"inputs":[],"name":"NameInvalidCharacters","type":"error"},{"inputs":[],"name":"NameTooLong","type":"error"},{"inputs":[],"name":"NameTooShort","type":"error"},{"inputs":[],"name":"NotAdminAndBeta","type":"error"},{"inputs":[],"name":"NotBridge","type":"error"},{"inputs":[],"name":"NotBurner","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"NotMinter","type":"error"},{"inputs":[],"name":"NotOwnerOfPet","type":"error"},{"inputs":[],"name":"NotOwnerOfPlayer","type":"error"},{"inputs":[],"name":"NotPlayers","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"PercentNotTotal100","type":"error"},{"inputs":[],"name":"PetAlreadyExists","type":"error"},{"inputs":[],"name":"PetDoesNotExist","type":"error"},{"inputs":[],"name":"PlayerDoesNotOwnPet","type":"error"},{"inputs":[],"name":"SameName","type":"error"},{"inputs":[],"name":"SkillEnhancementIncorrectOrder","type":"error"},{"inputs":[],"name":"SkillEnhancementIncorrectlyFilled","type":"error"},{"inputs":[],"name":"SkillEnhancementMinGreaterThanMax","type":"error"},{"inputs":[],"name":"SkillFixedIncrementCannotBeZero","type":"error"},{"inputs":[],"name":"SkillFixedMustBeAFactorOfIncrement","type":"error"},{"inputs":[],"name":"SkillPercentageIncrementCannotBeZero","type":"error"},{"inputs":[],"name":"SkillPercentageMustBeAFactorOfIncrement","type":"error"},{"inputs":[],"name":"StorageSlotIncorrect","type":"error"},{"inputs":[],"name":"TrainOnCooldown","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"string","name":"description","type":"string"},{"internalType":"uint8","name":"tier","type":"uint8"},{"internalType":"enum PetSkin","name":"skin","type":"uint8"},{"internalType":"enum PetEnhancementType","name":"enhancementType","type":"uint8"},{"internalType":"uint24","name":"baseId","type":"uint24"},{"internalType":"bool","name":"isTransferable","type":"bool"},{"internalType":"enum Skill[2]","name":"skillEnhancements","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillFixedMins","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillFixedMaxs","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillFixedIncrements","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillPercentageMins","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillPercentageMaxs","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillPercentageIncrements","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillMinLevels","type":"uint8[2]"},{"internalType":"uint16","name":"fixedStarThreshold","type":"uint16"},{"internalType":"uint16","name":"percentageStarThreshold","type":"uint16"}],"indexed":false,"internalType":"struct PetNFT.BasePetInput[]","name":"basePetInputs","type":"tuple[]"}],"name":"AddBasePets","type":"event"},{"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":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"components":[{"internalType":"enum Skill","name":"skillEnhancement1","type":"uint8"},{"internalType":"uint8","name":"skillFixedEnhancement1","type":"uint8"},{"internalType":"uint8","name":"skillPercentageEnhancement1","type":"uint8"},{"internalType":"enum Skill","name":"skillEnhancement2","type":"uint8"},{"internalType":"uint8","name":"skillFixedEnhancement2","type":"uint8"},{"internalType":"uint8","name":"skillPercentageEnhancement2","type":"uint8"},{"internalType":"uint40","name":"lastAssignmentTimestamp","type":"uint40"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"isTransferable","type":"bool"},{"internalType":"uint24","name":"baseId","type":"uint24"},{"internalType":"uint40","name":"lastTrainedTimestamp","type":"uint40"},{"internalType":"uint8","name":"skillFixedEnhancementMax1","type":"uint8"},{"internalType":"uint8","name":"skillFixedEnhancementMax2","type":"uint8"},{"internalType":"uint8","name":"skillPercentageEnhancementMax1","type":"uint8"},{"internalType":"uint8","name":"skillPercentageEnhancementMax2","type":"uint8"},{"internalType":"uint64","name":"xp","type":"uint64"}],"indexed":false,"internalType":"struct Pet[]","name":"pets","type":"tuple[]"},{"indexed":false,"internalType":"string[]","name":"names","type":"string[]"},{"indexed":false,"internalType":"address","name":"from","type":"address"}],"name":"BridgePets","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"string","name":"description","type":"string"},{"internalType":"uint8","name":"tier","type":"uint8"},{"internalType":"enum PetSkin","name":"skin","type":"uint8"},{"internalType":"enum PetEnhancementType","name":"enhancementType","type":"uint8"},{"internalType":"uint24","name":"baseId","type":"uint24"},{"internalType":"bool","name":"isTransferable","type":"bool"},{"internalType":"enum Skill[2]","name":"skillEnhancements","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillFixedMins","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillFixedMaxs","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillFixedIncrements","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillPercentageMins","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillPercentageMaxs","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillPercentageIncrements","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillMinLevels","type":"uint8[2]"},{"internalType":"uint16","name":"fixedStarThreshold","type":"uint16"},{"internalType":"uint16","name":"percentageStarThreshold","type":"uint16"}],"indexed":false,"internalType":"struct PetNFT.BasePetInput[]","name":"basePetInputs","type":"tuple[]"}],"name":"EditBasePets","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newCost","type":"uint256"}],"name":"EditNameCost","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"playerId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"petId","type":"uint256"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"string","name":"newName","type":"string"}],"name":"EditPlayerPet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startPetId","type":"uint256"},{"components":[{"internalType":"enum Skill","name":"skillEnhancement1","type":"uint8"},{"internalType":"uint8","name":"skillFixedEnhancement1","type":"uint8"},{"internalType":"uint8","name":"skillPercentageEnhancement1","type":"uint8"},{"internalType":"enum Skill","name":"skillEnhancement2","type":"uint8"},{"internalType":"uint8","name":"skillFixedEnhancement2","type":"uint8"},{"internalType":"uint8","name":"skillPercentageEnhancement2","type":"uint8"},{"internalType":"uint40","name":"lastAssignmentTimestamp","type":"uint40"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"isTransferable","type":"bool"},{"internalType":"uint24","name":"baseId","type":"uint24"},{"internalType":"uint40","name":"lastTrainedTimestamp","type":"uint40"},{"internalType":"uint8","name":"skillFixedEnhancementMax1","type":"uint8"},{"internalType":"uint8","name":"skillFixedEnhancementMax2","type":"uint8"},{"internalType":"uint8","name":"skillPercentageEnhancementMax1","type":"uint8"},{"internalType":"uint8","name":"skillPercentageEnhancementMax2","type":"uint8"},{"internalType":"uint64","name":"xp","type":"uint64"}],"indexed":false,"internalType":"struct Pet[]","name":"pets","type":"tuple[]"},{"indexed":false,"internalType":"string[]","name":"names","type":"string[]"},{"indexed":false,"internalType":"address","name":"from","type":"address"}],"name":"NewPets","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":"uint256[]","name":"tokenIds","type":"uint256[]"},{"components":[{"internalType":"enum Skill","name":"skillEnhancement1","type":"uint8"},{"internalType":"uint8","name":"skillFixedEnhancement1","type":"uint8"},{"internalType":"uint8","name":"skillPercentageEnhancement1","type":"uint8"},{"internalType":"enum Skill","name":"skillEnhancement2","type":"uint8"},{"internalType":"uint8","name":"skillFixedEnhancement2","type":"uint8"},{"internalType":"uint8","name":"skillPercentageEnhancement2","type":"uint8"},{"internalType":"uint40","name":"lastAssignmentTimestamp","type":"uint40"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"isTransferable","type":"bool"},{"internalType":"uint24","name":"baseId","type":"uint24"},{"internalType":"uint40","name":"lastTrainedTimestamp","type":"uint40"},{"internalType":"uint8","name":"skillFixedEnhancementMax1","type":"uint8"},{"internalType":"uint8","name":"skillFixedEnhancementMax2","type":"uint8"},{"internalType":"uint8","name":"skillPercentageEnhancementMax1","type":"uint8"},{"internalType":"uint8","name":"skillPercentageEnhancementMax2","type":"uint8"},{"internalType":"uint64","name":"xp","type":"uint64"}],"indexed":false,"internalType":"struct Pet[]","name":"pets","type":"tuple[]"},{"indexed":false,"internalType":"string[]","name":"names","type":"string[]"},{"indexed":false,"internalType":"address[]","name":"owners","type":"address[]"}],"name":"RefreshPets","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"brushBurntPercentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"brushTreasuryPercentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"brushDevPercentage","type":"uint256"}],"name":"SetBrushDistributionPercentages","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"playerId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"petId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"xpGained","type":"uint256"}],"name":"Train","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":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"description","type":"string"},{"internalType":"uint8","name":"tier","type":"uint8"},{"internalType":"enum PetSkin","name":"skin","type":"uint8"},{"internalType":"enum PetEnhancementType","name":"enhancementType","type":"uint8"},{"internalType":"uint24","name":"baseId","type":"uint24"},{"internalType":"bool","name":"isTransferable","type":"bool"},{"internalType":"enum Skill[2]","name":"skillEnhancements","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillFixedMins","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillFixedMaxs","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillFixedIncrements","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillPercentageMins","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillPercentageMaxs","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillPercentageIncrements","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillMinLevels","type":"uint8[2]"},{"internalType":"uint16","name":"fixedStarThreshold","type":"uint16"},{"internalType":"uint16","name":"percentageStarThreshold","type":"uint16"}],"internalType":"struct PetNFT.BasePetInput[]","name":"basePetInputs","type":"tuple[]"}],"name":"addBasePets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"playerId","type":"uint256"},{"internalType":"uint256","name":"petId","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"assignPet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"description","type":"string"},{"internalType":"uint8","name":"tier","type":"uint8"},{"internalType":"enum PetSkin","name":"skin","type":"uint8"},{"internalType":"enum PetEnhancementType","name":"enhancementType","type":"uint8"},{"internalType":"uint24","name":"baseId","type":"uint24"},{"internalType":"bool","name":"isTransferable","type":"bool"},{"internalType":"enum Skill[2]","name":"skillEnhancements","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillFixedMins","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillFixedMaxs","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillFixedIncrements","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillPercentageMins","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillPercentageMaxs","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillPercentageIncrements","type":"uint8[2]"},{"internalType":"uint8[2]","name":"skillMinLevels","type":"uint8[2]"},{"internalType":"uint16","name":"fixedStarThreshold","type":"uint16"},{"internalType":"uint16","name":"percentageStarThreshold","type":"uint16"}],"internalType":"struct PetNFT.BasePetInput[]","name":"basePetInputs","type":"tuple[]"}],"name":"editBasePets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"playerId","type":"uint256"},{"internalType":"uint256","name":"petId","type":"uint256"},{"internalType":"string","name":"petName","type":"string"}],"name":"editPet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getNextPetId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPet","outputs":[{"components":[{"internalType":"enum Skill","name":"skillEnhancement1","type":"uint8"},{"internalType":"uint8","name":"skillFixedEnhancement1","type":"uint8"},{"internalType":"uint8","name":"skillPercentageEnhancement1","type":"uint8"},{"internalType":"enum Skill","name":"skillEnhancement2","type":"uint8"},{"internalType":"uint8","name":"skillFixedEnhancement2","type":"uint8"},{"internalType":"uint8","name":"skillPercentageEnhancement2","type":"uint8"},{"internalType":"uint40","name":"lastAssignmentTimestamp","type":"uint40"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"isTransferable","type":"bool"},{"internalType":"uint24","name":"baseId","type":"uint24"},{"internalType":"uint40","name":"lastTrainedTimestamp","type":"uint40"},{"internalType":"uint8","name":"skillFixedEnhancementMax1","type":"uint8"},{"internalType":"uint8","name":"skillFixedEnhancementMax2","type":"uint8"},{"internalType":"uint8","name":"skillPercentageEnhancementMax1","type":"uint8"},{"internalType":"uint8","name":"skillPercentageEnhancementMax2","type":"uint8"},{"internalType":"uint64","name":"xp","type":"uint64"}],"internalType":"struct Pet","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IBrushToken","name":"brush","type":"address"},{"internalType":"address","name":"royaltyReceiver","type":"address"},{"internalType":"string","name":"imageBaseUri","type":"string"},{"internalType":"address","name":"dev","type":"address"},{"internalType":"uint72","name":"editNameCost","type":"uint72"},{"internalType":"address","name":"treasury","type":"address"},{"internalType":"contract RandomnessBeacon","name":"randomnessBeacon","type":"address"},{"internalType":"uint40","name":"startPetId","type":"uint40"},{"internalType":"address","name":"bridge","type":"address"},{"internalType":"contract AdminAccess","name":"adminAccess","type":"address"},{"internalType":"bool","name":"isBeta","type":"bool"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"instantVRFActions","type":"address"},{"internalType":"address","name":"players","type":"address"},{"internalType":"address","name":"territories","type":"address"}],"name":"initializeAddresses","outputs":[],"stateMutability":"nonpayable","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":"basePetIds","type":"uint256[]"},{"internalType":"uint256","name":"randomWord","type":"uint256"}],"name":"mintBatch","outputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"petOwner","type":"address"},{"internalType":"uint256[]","name":"petIds","type":"uint256[]"},{"internalType":"uint24[]","name":"basePetIds","type":"uint24[]"},{"internalType":"string[]","name":"petNames","type":"string[]"},{"internalType":"enum Skill[]","name":"skillEnhancement1s","type":"uint8[]"},{"internalType":"uint8[]","name":"skillFixedEnhancement1s","type":"uint8[]"},{"internalType":"uint8[]","name":"skillPercentageEnhancement1","type":"uint8[]"},{"internalType":"enum Skill[]","name":"skillEnhancement2s","type":"uint8[]"},{"internalType":"uint8[]","name":"skillFixedEnhancement2s","type":"uint8[]"},{"internalType":"uint8[]","name":"skillPercentageEnhancement2s","type":"uint8[]"}],"name":"mintBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","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":"address","name":"bridge","type":"address"}],"name":"setBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"brushBurntPercentage","type":"uint8"},{"internalType":"uint8","name":"brushTreasuryPercentage","type":"uint8"},{"internalType":"uint8","name":"brushDevPercentage","type":"uint8"}],"name":"setBrushDistributionPercentages","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint72","name":"editNameCost","type":"uint72"}],"name":"setEditNameCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"imageBaseUri","type":"string"}],"name":"setImageBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a080604052346100c257306080525f516020615d9b5f395f51905f525460ff8160401c166100b3576002600160401b03196001600160401b03821601610060575b604051615cd490816100c7823960805181818161201801526120b40152f35b6001600160401b0319166001600160401b039081175f516020615d9b5f395f51905f525581527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f80610041565b63f92ee8a960e01b5f5260045ffd5b5f80fdfe6105c06040526004361015610012575f80fd5b5f3560e01c8062fdd58e1461311857806301ffc9a71461309057806306fdde0314612fee5780630e89341c14612ed0578063128dd84c14612df157806314e6f92314612da25780631500798014612d1757806318160ddd14612cf35780632a55205a14612c9b5780632eb2c2d614612bbc5780632f5cfd2614612afb5780633773cefa146124c257806339b92bbb146123b45780634e1273f41461228a5780634f1ef2861461207757806352d1902d14611ffe57806359d5519414611ed15780636352211e14611e9b578063702385e814611e74578063715018a614611e015780637e775c6014611d555780638da5cb5b14611d235780638dd1480214611ce257806393ed55151461171d57806395d89b41146116705780639dc29fac146115d7578063a22cb4651461153d578063a4b6106914610c06578063ad3cb1cc14610bbf578063b2dc5dc314610adc578063bd85b03914610ab6578063d22cf5b514610980578063e985e9c514610927578063f242432a14610823578063f2fde38b146107f85763fdbc7c60146101a5575f80fd5b346107f45760603660031901126107f4576101be61313f565b6024356001600160401b0381116107f4576101dd90369060040161342c565b9190600354906001600160a01b038260501c1633148015610765575b156107565760449392933561020d846138b0565b610216856138b0565b91610220866131da565b9561022e60405197886131b9565b808752601f1961023d826131da565b015f5b81811061074357505064ffffffffff61025882613c52565b9660281c16915f905b87518210156106755760405160208101918252602081526102836040826131b9565b519020906102918185613ca1565b61029c82858a613cae565b356102a5613913565b50805f52600460205260ff600160405f20015460181c1660288110156106435715610666575f8181526004602090815260409091206001015460ff602882901c811693929190911c168080841461065f57506103018184615181565b6001810180911161061d5761034b9161033f61033661034493865f52600460205260ff600160405f20015460301c16906137f3565b60ff8a1661518e565b613ca1565b8093615181565b6001810180911161061d5761036961036f9160ff8860081c1661518e565b83613ca1565b5f8281526004602052604090819020600101549081901c60ff908116929160381c168083811461065757506103a48184615181565b6001810180911161061d576103e59161033f6103d961034493885f52600460205260ff600160405f20015460481c16906137f3565b60ff8c60101c1661518e565b6001810180911161061d576103696104039160ff8a60181c1661518e565b925b805f52600460205260ff600160405f20015460581c16925f5f915f955f98602882101561064357816104d0575b855f52600460205260405f206001015460181c60ff169960ff169860ff169760ff169660ff169562ffffff169460ff169360ff169260ff169060ff166104789a8c614852565b610482838b6138ff565b5261048d828a6138ff565b508061049983886138ff565b526104a482886138ff565b600190526104b190614b5a565b6104bb828b6138ff565b526104c6818a6138ff565b5060010190610261565b5f86815260046020526040902060010154909950919650925060ff606882901c8116925060609190911c1680821461063a5761050c8183615181565b6001810180911161061d576105549161033f8d60ff61054361054d958a5f52600460205282600160405f20015460701c16906137f3565b9160201c1661518e565b8092615181565b6001810180911161061d576105726105789160ff8d60281c1661518e565b82613ca1565b945b5f8481526004602052604090206001015460ff608082901c8116949160781c16808514610631576105ab8186615181565b6001810180911161061d576105f39161033f8f60ff6105e26105ec958c5f52600460205282600160405f20015460881c16906137f3565b9160301c1661518e565b8095615181565b6001810180911161061d576106116106179160ff8f60381c1661518e565b85613ca1565b98610432565b634e487b7160e01b5f52601160045260245ffd5b98899450610432565b9485915061057a565b634e487b7160e01b5f52602160045260245ffd5b925092610405565b925061036f565b633690f5fd60e21b5f5260045ffd5b5061073f847fd0ad15111831e536e6d9161c427463a02797d2e181b6b9497dcbb9e394482b1389868d6001600160a01b036107218f6106c78e604051906106bd6020836131b9565b5f82528a87614dce565b6106d2865186613ca1565b69ffffffffff00000000006003549160281b169069ffffffffff00000000001916176003556107136040519687968752608060208801526080870190613cdc565b908582036040870152613d1a565b911660608301520390a16040519182916020835260208301906132f4565b0390f35b60606020828b0181019190915201610240565b633e34a41b60e21b5f5260045ffd5b50600a54604051630935e01b60e21b8152336004820152906020826024816001600160a01b0385165afa9182156107e9575f926107b8575b50816107aa575b506101f9565b60ff915060a01c165f6107a4565b6107db91925060203d6020116107e2575b6107d381836131b9565b810190613c07565b905f61079d565b503d6107c9565b6040513d5f823e3d90fd5b5f80fd5b346107f45760203660031901126107f45761082161081461313f565b61081c613e1b565b613d9d565b005b346107f45760a03660031901126107f45761083c61313f565b610844613155565b906084356001600160401b0381116107f4576108649036906004016132ac565b906001600160a01b03811633811415806108fd575b6108e7576001600160a01b038416156108d457156108c2576108219260405190600182526044356020830152604082019260018452606435606084015260808301604052615383565b626a0d4560e21b5f525f60045260245ffd5b632bfa23e760e11b5f525f60045260245ffd5b63711bec9160e11b5f523360045260245260445ffd5b50805f52600160205260405f206001600160a01b0333165f5260205260ff60405f20541615610879565b346107f45760403660031901126107f45761094061313f565b6001600160a01b03610950613155565b91165f5260016020526001600160a01b0360405f2091165f52602052602060ff60405f2054166040519015158152f35b346107f45760203660031901126107f4576004356001600160401b0381116107f4576109b090369060040161342c565b6109b8613e1b565b5f5b8181106109f857507fb3146f6fcffb938d640f6b0fc75a797c17d53179e33357297f13f36093c73415916109f3604051928392836139f6565b0390a1005b610a03818385613993565b90610a0d82613e4e565b15610666576080820162ffffff610a2382613cbe565b165f52600460205260ff600160405f20015460181c1660c08401359060288210156107f45760288110156106435703610aa757610a6362ffffff91613cbe565b165f52600460205260ff600160405f20015460581c1660e08301359060288210156107f45760288110156106435703610aa757610aa1600192613eb4565b016109ba565b631a74792760e01b5f5260045ffd5b346107f45760203660031901126107f4576020610ad4600435613d72565b604051908152f35b346107f45760403660031901126107f457610af561313f565b6024356001600160401b0381116107f457610b1490369060040161342c565b6001600160a01b038316918233148015610b96575b15610b8757610b399136916131f1565b90156108c257610b4981516138b0565b915f5b8251811015610b6a57806001610b638193876138ff565b5201610b4c565b50826108219260405192610b7f6020856131b9565b5f8452615198565b63f019b1af60e01b5f5260045ffd5b50825f52600160205260405f206001600160a01b0333165f5260205260ff60405f205416610b29565b346107f4575f3660031901126107f45761073f604051610be06040826131b9565b60058152640352e302e360dc1b602082015260405191829160208352602083019061316b565b346107f4576101403660031901126107f457610c2061313f565b6102e0526024356001600160401b0381116107f457610c4390369060040161342c565b61034052610300526044356001600160401b0381116107f457610c6a90369060040161342c565b610240526101c0526064356001600160401b0381116107f457366023820112156107f457806004013590610cb0610ca0836131da565b60405161032052610320516131b9565b6103208051839052516020019160051b8101602401903682116107f45760248101925b8284106114fd576084356001600160401b0381116107f457610cf990369060040161342c565b6101e05260e05260a4356001600160401b0381116107f457610d1f90369060040161342c565b610140526102805260c4356001600160401b0381116107f457610d4690369060040161342c565b610100526101805260e4356001600160401b0381116107f457610d6d90369060040161342c565b6101205261016052610104356001600160401b0381116107f457610d9590369060040161342c565b61026052610220526001600160401b0361012435116107f457610dbe366101243560040161342c565b610200526101a0526001600160a01b036013541633036114ee57610240516103405114806114df575b806114d0575b806114c1575b806114b2575b806114a3575b80611494575b1561148557610e1661034051613c52565b6102c052610e26610340516138b0565b6102a0526001600160a01b03601054166040516364141b8f60e11b8152602081600481855afa9081156107e9575f91611453575b50620151808101811161061d576201518060845f926040519485938492637fe4cf6b60e01b8452610340516004850152806024850152016044830152600160648301525afa80156107e9575f60c052611402575b505f60a0525b6103405160a05110610f8d57610ef4610ed43661034051610300516131f1565b60405190610ee36020836131b9565b5f82526102a051906102e051614dce565b6040516080815261034051608082015260018060fb1b0361034051116107f457807f80427be1654cc5e8cdef307d44b7b56681e4e161fdca9fd236a9dda127d5a39b91610f76610f6560a06103405160051b806103005183870137840181858203016020860152016102c051613cdc565b828103604084015261032051613d1a565b6001600160a01b036102e0511660608301520390a1005b60a05160a05160011b0460021460a05115171561061d5760ff60f81b610fba60a05160011b60c051613c1f565b5116600160a051811b018060a05160011b1161061d5760c05160ff60f01b91610fe291613c1f565b5160081c1617611003610ffe60a051610240516101c051613cae565b613cbe565b9061104a61102261101d60a0516101405161028051613cae565b613cce565b62ffffff84165f52600460205260ff600160405f20015460281c1660ff8460f01c16916147fd565b9161108961106461101d60a0516102605161022051613cae565b62ffffff83165f52600460205260ff600160405f20015460681c168460f81c916147fd565b916110a061101d60a0516101005161018051613cae565b62ffffff83165f52600460205260ff600160405f20015460401c1690611eef8360f01c02918360f01c8304611eef148460f01c15171561061d5760ff6110ea9360081c16916147fd565b9162ffffff61110561101d60a051610200516101a051613cae565b91165f52600460205260ff600160405f20015460801c1661187f8360f01c02928060f01c840461187f149060f01c15171561061d5760ff61114a9360081c16916147fd565b9161115e60a0516103405161030051613cae565b359361117260a0516101e05160e051613cae565b35608052602860805110156107f45761119761101d60a0516101405161028051613cae565b946111ae61101d60a0516101005161018051613cae565b956111c260a0516101205161016051613cae565b359660288810156107f45761121f976111e761101d60a0516102605161022051613cae565b916111fe61101d60a051610200516101a051613cae565b93611215610ffe60a051610240516101c051613cae565b9560805190614852565b61122e60a0516102c0516138ff565b5261123e60a0516102c0516138ff565b50600161125060a0516102a0516138ff565b5261126060a051610320516138ff565b5151156113c15761127660a051610320516138ff565b5161128a60a0516103405161030051613cae565b355f52600660205260405f20908051906001600160401b0382116113ad576112bc826112b685546134f4565b85613861565b602090601f8311600114611346576112eb92915f918361133b575b50508160011b915f199060031b1c19161790565b90555b60208061130961130360a051610320516138ff565b51614d1c565b604051928184925191829101835e81016007815203019020600160ff198254161790555b600160a0510160a052610eb4565b0151905084806112d7565b9190835f52805f20905f935b601f1984168510611392576001945083601f1981161061137a575b505050811b0190556112ee565b01515f1960f88460031b161c1916905583808061136d565b81810151835560209485019460019093019290910190611352565b634e487b7160e01b5f52604160045260245ffd5b6113dd6113d760a0516103405161030051613cae565b35614b5a565b6113ec60a051610320516138ff565b526113fc60a051610320516138ff565b5061132d565b3d805f833e61141181836131b9565b8101906020818303126107f4578051906001600160401b0382116107f457019080601f830112156107f457815161144a92602001613488565b60c05280610eae565b90506020813d60201161147d575b8161146e602093836131b9565b810103126107f4575182610e5a565b3d9150611461565b631fec674760e31b5f5260045ffd5b50610200516103405114610e05565b50610260516103405114610dff565b50610120516103405114610df9565b50610100516103405114610df3565b50610140516103405114610ded565b506101e0516103405114610de7565b637fea9dc560e01b5f5260045ffd5b83356001600160401b0381116107f4578201366043820112156107f45760209161153283923690604460248201359101613276565b815201930192610cd3565b346107f45760403660031901126107f45761155661313f565b602435908115158092036107f4576001600160a01b03169081156115c557335f52600160205260405f20825f5260205260405f2060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b62ced3e160e81b5f525f60045260245ffd5b346107f45760403660031901126107f4576115f061313f565b6001600160a01b0381168033148015611647575b15610b8757156108c25761082190604051600181526024356020820152604081019060018252600160608201526080810160405260405192610b7f6020856131b9565b50805f52600160205260405f206001600160a01b0333165f5260205260ff60405f205416611604565b346107f4575f3660031901126107f457600a5460a01c60ff16156116fe5761073f60206116ea60276040516116a66040826131b9565b60028152612fa160f11b848201525b60405193849166454b5f5045545360c81b828401528051918291018484015e81015f838201520301601f1981018352826131b9565b60405191829160208352602083019061316b565b61073f60206116ea602760405161171584826131b9565b5f81526116b5565b346107f45760603660031901126107f4576004356024356044356001600160401b0381116107f4576117539036906004016132c7565b600f5460405163e743862960e01b81523360048201526024810186905292949290602090829060449082906001600160a01b03165afa9081156107e9575f91611cc3575b5015611cb457825f526005602052336001600160a01b0360405f205460581c1603611ca557611804936117cb913691613276565b5f73e3223eaf0e260b54a8ce777ac9f4a972310370c0916040518096819263b2dad15560e01b835260206004840152602483019061316b565b0381845af49384156107e9575f94611c81575b506003845110611c7257600f845111611c6357602060405180926391ae2cdb60e01b82528260048301528180611850602482018a61316b565b03915af49081156107e9575f91611c44575b5015611c355761187183614d1c565b825f52600660205261188f61189660405f206040519283809261352c565b03826131b9565b805115611c21575b6118a790614d1c565b60405190602082018151926118d6602082818601968088875e81015f838201520301601f1981018352826131b9565b519020916040519260208401855194611909602082818a0198808a875e81015f838201520301601f1981018352826131b9565b51902014918215611ad0575b5050611ac15761193468ffffffffffffffffff600d5460a01c16614623565b81516003811161198b575b5050506109f37f3566f1b26176919a8cfe17faecfe8ed2b9a6780cb1e33c1afe6ce7f3db444aae936040519384938452602084015233604084015260806060840152608083019061316b565b15611a2957516001600160f81b0319166119a3613c30565b805115611a2957602001516001600160f81b031916149081611a7f575b81611a3d575b816119e8575b506119d95783808061193f565b63a8de9f2b60e01b5f5260045ffd5b8091505160031015611a2957602301516001600160f81b031916611a0a613c30565b805160031015611a2957602301516001600160f81b03191614846119cc565b634e487b7160e01b5f52603260045260245ffd5b8091505160021015611a295760228101516001600160f81b031916611a60613c30565b805160021015611a2957602201516001600160f81b03191614906119c6565b8091505160011015611a295760218101516001600160f81b031916611aa2613c30565b805160011015611a2957602101516001600160f81b03191614906119c0565b636741e5ed60e01b5f5260045ffd5b60ff60405160208188518089835e810160078152030190205416611c1257519081611bed575b505060405160208185518086835e81016007815203019020600160ff19825416179055845f52600660205260405f2086516001600160401b0381116113ad57611b4981611b4384546134f4565b84613861565b6020601f8211600114611b8b579080611b76925f91611b80575b508160011b915f199060031b1c19161790565b90555b8680611915565b90508901518a611b63565b601f19821690835f52805f20915f5b8b828210611bd55750509083600194939210611bbd575b5050811b019055611b79565b8a01515f1960f88460031b161c191690558980611bb1565b60018495602093958493015181550194019201611b9a565b60209082604051938492835e8101600781520301902060ff1981541690558680611af6565b633480a50360e21b5f5260045ffd5b506118a7611c2e84614b5a565b905061189e565b634caa0cad60e11b5f5260045ffd5b611c5d915060203d6020116107e2576107d381836131b9565b84611862565b63680b6caf60e01b5f5260045ffd5b6365ac5e6760e11b5f5260045ffd5b611c9e9194503d805f833e611c9681836131b9565b8101906134be565b9284611817565b63ccb3f5dd60e01b5f5260045ffd5b63078eec1360e11b5f5260045ffd5b611cdc915060203d6020116107e2576107d381836131b9565b85611797565b346107f45760203660031901126107f4576001600160a01b03611d0361313f565b611d0b613e1b565b166001600160601b0360a01b60135416176013555f80f35b346107f4575f3660031901126107f45760206001600160a01b035f516020615c5f5f395f51905f525416604051908152f35b346107f45760203660031901126107f4576004356001600160401b0381116107f457611d8590369060040161342c565b611d8d613e1b565b5f5b818110611dc857507f2936ac7f20b62662f83549df75258acdd7b45fb2a4b553e96f1b07272a121ef3916109f3604051928392836139f6565b611dd3818385613993565b90611ddd82613e4e565b611df257611dec600192613eb4565b01611d8f565b63d4e8788560e01b5f5260045ffd5b346107f4575f3660031901126107f457611e19613e1b565b5f6001600160a01b035f516020615c5f5f395f51905f52546001600160601b0360a01b81165f516020615c5f5f395f51905f5255167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346107f4575f3660031901126107f457602064ffffffffff60035460281c16604051908152f35b346107f45760203660031901126107f4576004355f52600560205260206001600160a01b0360405f205460581c16604051908152f35b346107f45760203660031901126107f457611eea613913565b506004355f52600560205261020060405f206001600160401b03600160405192611f138461319d565b8054611f2260ff821686613987565b60ff8160081c16602086015260ff8160101c166040860152611f4d60ff8260181c1660608701613987565b60ff8160201c16608086015260ff8160281c1660a086015264ffffffffff8160301c1660c08601526001600160a01b038160581c1660e086015260f81c1515610100850152015462ffffff811661012084015264ffffffffff8160181c1661014084015260ff8160401c1661016084015260ff8160481c1661018084015260ff8160501c166101a084015260ff8160581c166101c084015260601c166101e0820152611ffc6040518092613334565bf35b346107f4575f3660031901126107f4576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036120685760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b63703e46dd60e11b5f5260045ffd5b60403660031901126107f45761208b61313f565b6024356001600160401b0381116107f4576120aa9036906004016132ac565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016803014908115612255575b50612068576120ec613e1b565b6040516352d1902d60e01b81526001600160a01b0383169290602081600481875afa5f9181612221575b5061212e5783634c9c8ce360e01b5f5260045260245ffd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc85920361220f5750813b156121fd577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff1916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a28151156121e5575f8083602061082195519101845af46121df615b09565b91615c04565b5050346121ee57005b63b398979f60e01b5f5260045ffd5b634c9c8ce360e01b5f5260045260245ffd5b632a87526960e21b5f5260045260245ffd5b9091506020813d60201161224d575b8161223d602093836131b9565b810103126107f457519085612116565b3d9150612230565b90506001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54161415836120df565b346107f45760403660031901126107f4576004356001600160401b0381116107f457366023820112156107f45780600401356122c5816131da565b916122d360405193846131b9565b8183526024602084019260051b820101903682116107f457602401915b81831061239457836024356001600160401b0381116107f45761231790369060040161323d565b908051825180820361237f57505061232f81516138b0565b915f5b8251811015612369578061235860019260051b602080828801015191860101519061345c565b61236282876138ff565b5201612332565b6040516020808252819061073f908201876132f4565b635b05999160e01b5f5260045260245260445ffd5b82356001600160a01b03811681036107f4578152602092830192016122f0565b346107f45760203660031901126107f4576004356001600160401b0381116107f4576123e49036906004016132c7565b6123ec613e1b565b6001600160401b0381116113ad5761240e816124096008546134f4565b613811565b5f601f821160011461244a57819061243a935f9261243f5750508160011b915f199060031b1c19161790565b600855005b0135905083806112d7565b601f198216927ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3915f5b8581106124aa57508360019510612491575b505050811b01600855005b01355f19600384901b60f8161c19169055828080612486565b90926020600181928686013581550194019101612474565b346107f4576101603660031901126107f4576004356001600160a01b03811681036107f4576124ef613155565b6044356001600160401b0381116107f45761250e9036906004016132c7565b6064356103808190529091906001600160a01b03811690036107f4576084359368ffffffffffffffffff851685036107f45760a435926001600160a01b03841684036107f45760c435926001600160a01b03841684036107f45764ffffffffff60e4351660e435036107f45761010435956001600160a01b03871687036107f45761012435906001600160a01b03821682036107f457610144359485151586036107f4575f516020615c7f5f395f51905f5254610360526001600160401b03610360511680159081612ae9575b6001149081612adf575b159081612ad6575b50612ac7576103605167ffffffffffffffff1981166001175f516020615c7f5f395f51905f525560401c60ff1615612a98575b612628615777565b612630615777565b61263933613d9d565b612641615777565b60206103a08190526040519061265790826131b9565b5f8152612662615777565b61266a615777565b8051906001600160401b0382116113ad576126866002546134f4565b601f8111612a52575b506103a05190601f83116001146129c057826001600160a01b03969594929387946126ce935f926129b55750508160011b915f199060031b1c19161790565b6002555b166001600160601b0360a01b600c541617600c5560095483600f60a11b9216906affffffffffffffffffffff60a81b161717600955166001600160601b0360a01b600a541617600a556001600160401b0382116113ad57612738826124096008546134f4565b5f90601f831160011461290357826001600160a01b039895937f7934a8db3f8f75ea0c15b07050e7abbb51f58cfa3914f76450dc170f3d40d811979593612793935f926128f85750508160011b915f199060031b1c19161790565b6008555b8661038051166001600160601b0360a01b600b541617600b55600a549060ff60a01b90151560a01b169060ff60a01b191617600a5560035469ffffffffff000000000060e43560281b169069ffffffffff000000000019161760035585600d54918184166001600160601b0360a01b841617600d55166001600160601b0360a01b6010541617601055612828613e1b565b7fffffff0000000000000000000000000000000000000000000000000000000000169085161760a082901b68ffffffffffffffffff60a01b1617600d5560405168ffffffffffffffffff9190911681526103a05190a1166001600160601b0360a01b601354161760135560ff6103605160401c16156128a357005b60ff60401b195f516020615c7f5f395f51905f5254165f516020615c7f5f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2604051600181526103a05190a1005b013590508a806112d7565b601f1983169160085f527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3925f5b81811061299b57509260019285926001600160a01b039b98967f7934a8db3f8f75ea0c15b07050e7abbb51f58cfa3914f76450dc170f3d40d8119a989610612982575b505050811b01600855612797565b01355f19600384901b60f8161c19169055898080612974565b8383013585556103a0516001909501949283019201612931565b015190508f806112d7565b90601f1983169160025f527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace925f5b818110612a3857509260019285926001600160a01b0399989795968a9710612a20575b505050811b016002556126d2565b01515f1960f88460031b161c191690558e8080612a12565b8284015185556103a05160019095019493840193016129ef565b60025f526103a0515f20601f840160051c81016103a0518510612a91575b601f830160051c82018110612a8657505061268f565b5f8155600101612a70565b5080612a70565b6103605168ffffffffffffffffff191668010000000000000001175f516020615c7f5f395f51905f5255612620565b63f92ee8a960e01b5f5260045ffd5b9050158b6125ed565b303b1591506125e5565b6103605160401c60ff161591506125db565b346107f45760603660031901126107f457612b1461313f565b612b1c613155565b90604435916001600160a01b0383168093036107f4576001600160a01b0391612b43613e1b565b7fffff0000000000000000000000000000000000000000ffffffffffffffffffff7dffffffffffffffffffffffffffffffffffffffff000000000000000000006003549260501b16911617600355166001600160601b0360a01b600f541617600f556001600160601b0360a01b600e541617600e555f80f35b346107f45760a03660031901126107f457612bd561313f565b612bdd613155565b6044356001600160401b0381116107f457612bfc90369060040161323d565b6064356001600160401b0381116107f457612c1b90369060040161323d565b906084356001600160401b0381116107f457612c3b9036906004016132ac565b926001600160a01b0385163381141580612c71575b6108e7576001600160a01b038216156108d457156108c25761082194615383565b50805f52600160205260405f206001600160a01b0333165f5260205260ff60405f20541615612c50565b346107f45760403660031901126107f4576001600160a01b0360095461073f6103e8612ccf60ff8460a01c166024356137e0565b046040519384931683602090939291936001600160a01b0360408201951681520152565b346107f4575f3660031901126107f457602064ffffffffff60035416604051908152f35b346107f45760203660031901126107f45760043568ffffffffffffffffff8116908181036107f4577f7934a8db3f8f75ea0c15b07050e7abbb51f58cfa3914f76450dc170f3d40d81191602091612d6c613e1b565b600d805468ffffffffffffffffff60a01b191660a09290921b68ffffffffffffffffff60a01b16919091179055604051908152a1005b346107f45760803660031901126107f457612dbb61313f565b6001600160a01b03600f54163303612de257610821906064359060443590602435906135e8565b639509283360e01b5f5260045ffd5b346107f45760603660031901126107f45760043560ff8116908181036107f4576024359160ff8316918284036107f4576044359260ff8416918285036107f457612e39613e1b565b606460ff612e5087612e4b8a866135ad565b6135ad565b1603612ec1577fb4ae64ee51c0d84410a16847b3f8f3d7ac7bbbeaf2abae8671beba816f0279e395606095600d549060ff60f81b9060f81b169260ff60e81b9060e81b169060018060e81b0316179060ff60f01b9060f01b161717600d5560405192835260208301526040820152a1005b63196f075b60e11b5f5260045ffd5b346107f45760203660031901126107f457600435612f05815f5260056020526001600160a01b0360405f205460581c16151590565b15612fdf57805f5260056020525f6040812062ffffff6001820154168252600460205260408220838352600660205260408320612f7e60ff600a5460a01c16916040519687958695630fd9944160e31b87526004870152602486015260448501526008606485015260c0608485015260c484019061352c565b90151560a4830152038173db24883dee4100a98bfec32ad95b9abf87c1a32f5af480156107e95761073f915f91612fc5575b5060405191829160208352602083019061316b565b612fd991503d805f833e611c9681836131b9565b82612fb0565b63b9c12c0360e01b5f5260045ffd5b346107f4575f3660031901126107f457600a5460a01c60ff16156130715761073f60206116ea602b6040516130246040826131b9565b60078152662028426574612960c81b848201525b6040519384916a457374666f72205065747360a81b828401528051918291018484015e81015f838201520301601f1981018352826131b9565b61073f60206116ea602b60405161308884826131b9565b5f8152613038565b346107f45760203660031901126107f45760043563ffffffff60e01b81168091036107f45760209063152a902d60e11b81149081156130d5575b506040519015158152f35b636cdb3d1360e11b811491508115613107575b81156130f6575b50826130ca565b6301ffc9a760e01b149050826130ef565b6303a24d0760e21b811491506130e8565b346107f45760403660031901126107f4576020610ad461313661313f565b6024359061345c565b600435906001600160a01b03821682036107f457565b602435906001600160a01b03821682036107f457565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b359060ff821682036107f457565b61020081019081106001600160401b038211176113ad57604052565b90601f801991011681019081106001600160401b038211176113ad57604052565b6001600160401b0381116113ad5760051b60200190565b9291906131fd816131da565b9361320b60405195866131b9565b602085838152019160051b81019283116107f457905b82821061322d57505050565b8135815260209182019101613221565b9080601f830112156107f457816020613258933591016131f1565b90565b6001600160401b0381116113ad57601f01601f191660200190565b9291926132828261325b565b9161329060405193846131b9565b8294818452818301116107f4578281602093845f960137010152565b9080601f830112156107f45781602061325893359101613276565b9181601f840112156107f4578235916001600160401b0383116107f457602083818601950101116107f457565b90602080835192838152019201905f5b8181106133115750505090565b8251845260209384019390920191600101613304565b9060288210156106435752565b6001600160401b036101e0809261334c858251613327565b60ff602082015116602086015260ff604082015116604086015261337860608201516060870190613327565b60ff608082015116608086015260ff60a08201511660a086015264ffffffffff60c08201511660c08601526001600160a01b0360e08201511660e0860152610100810151151561010086015262ffffff6101208201511661012086015264ffffffffff6101408201511661014086015260ff6101608201511661016086015260ff6101808201511661018086015260ff6101a0820151166101a086015260ff6101c0820151166101c0860152015116910152565b9181601f840112156107f4578235916001600160401b0383116107f4576020808501948460051b0101116107f457565b905f5260056020526001600160a01b038060405f205460581c169116145f1461348457600190565b5f90565b9291926134948261325b565b916134a260405193846131b9565b8294818452818301116107f4578281602093845f96015e010152565b6020818303126107f4578051906001600160401b0382116107f457019080601f830112156107f457815161325892602001613488565b90600182811c92168015613522575b602083101461350e57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691613503565b5f929181549161353b836134f4565b8083529260018116908115613590575060011461355757505050565b5f9081526020812093945091925b838310613576575060209250010190565b600181602092949394548385870101520191019190613565565b915050602093945060ff929192191683830152151560051b010190565b9060ff8091169116019060ff821161061d57565b156135ca575050565b632e9d1ba760e01b5f5260288110156106435760045260245260445ffd5b825f52600560205260405f20925f5260056020526001600160a01b038060405f205460581c169116036137d15760018281015462ffffff165f8181526004602081905260409182902090930154600f549151631a4cd3f560e11b81529384018590526001600160a01b0390911693929060ff605082901c81169160181c166136736024840182613327565b602083604481895afa9283156107e9575f9361379d575b50816136979310156135c1565b805f52600460205260ff600160405f20015460581c169060288210156106435781613706575b505050508164ffffffffff825460301c1611156137025764ffffffffff613700921664ffffffffff60301b82549160301b169064ffffffffff60301b1916179055565b565b5050565b5f526004602052602060ff600160405f20015460901c1692604460405180968193631a4cd3f560e11b835260048301526137436024830187613327565b5afa9283156107e9575f93613769575b50816137609310156135c1565b5f8080806136bd565b92506020833d602011613795575b81613784602093836131b9565b810103126107f45791519181613753565b3d9150613777565b92506020833d6020116137c9575b816137b8602093836131b9565b810103126107f4579151918161368a565b3d91506137ab565b63b03f46a160e01b5f5260045ffd5b8181029291811591840414171561061d57565b81156137fd570490565b634e487b7160e01b5f52601260045260245ffd5b601f811161381d575050565b60085f5260205f20906020601f840160051c83019310613857575b601f0160051c01905b81811061384c575050565b5f8155600101613841565b9091508190613838565b601f821161386e57505050565b5f5260205f20906020601f840160051c830193106138a6575b601f0160051c01905b81811061389b575050565b5f8155600101613890565b9091508190613887565b906138ba826131da565b6138c760405191826131b9565b82815280926138d8601f19916131da565b0190602036910137565b805115611a295760200190565b805160011015611a295760400190565b8051821015611a295760209160051b010190565b604051906139208261319d565b5f6101e0838281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e08201528261010082015282610120820152826101408201528261016082015282610180820152826101a0820152826101c08201520152565b60288210156106435752565b9190811015611a295760051b810135906102fe19813603018212156107f4570190565b905f905b600282106139c757505050565b60208060019260ff6139d88761318f565b168152019301910190916139ba565b359061ffff821682036107f457565b9180602084016020855252604083019060408160051b85010193835f916102fe1982360301905b848410613a2e575050505050505090565b90919293949596603f198282030187528735838112156107f45784018035601e19823603018112156107f4578101906020823592016001600160401b0383116107f45782360381136107f45782906103008552816103008601526103208501375f610320838501015260ff613aa56020830161318f565b166020840152604081013560088110156107f4576040840152606081013560098110156107f4576060840152608081013562ffffff81168091036107f457608084015260a08101358015158091036107f45760a084015260c0830160c08201905f905b60028210613bdf575050506103208360209361ffff613bc06102e08796613b3961010060019b0161010083016139b6565b613b4b610140870161014083016139b6565b613b5d610180870161018083016139b6565b613b6f6101c087016101c083016139b6565b613b81610200870161020083016139b6565b613b93610240870161024083016139b6565b613ba5610280870161028083016139b6565b83613bb36102c083016139e7565b166102c0870152016139e7565b166102e0830152601f01601f1916010199019701959401929190613a1d565b82359060288210156107f457602081613bfb8293600195613327565b01930191019091613b08565b908160209103126107f4575180151581036107f45790565b908151811015611a29570160200190565b60405190613c3f6040836131b9565b600482526303832ba160e51b6020830152565b90613c5c826131da565b613c6960405191826131b9565b8281528092613c7a601f19916131da565b01905f5b828110613c8a57505050565b602090613c95613913565b82828501015201613c7e565b9190820180921161061d57565b9190811015611a295760051b0190565b3562ffffff811681036107f45790565b3560ff811681036107f45790565b90602080835192838152019201905f5b818110613cf95750505090565b909192602061020082613d0f6001948851613334565b019401929101613cec565b9080602083519182815201916020808360051b8301019401925f915b838310613d4557505050505090565b9091929394602080613d63600193601f19868203018752895161316b565b97019301930191939290613d36565b613d93905f5260056020526001600160a01b0360405f205460581c16151590565b1561348457600190565b6001600160a01b03168015613e08576001600160a01b035f516020615c5f5f395f51905f5254826001600160601b0360a01b8216175f516020615c5f5f395f51905f5255167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b631e4fbdf760e01b5f525f60045260245ffd5b6001600160a01b035f516020615c5f5f395f51905f5254163303613e3b57565b63118cdaa760e01b5f523360045260245ffd5b613e5e608062ffffff9201613cbe565b165f52600460205260ff600160405f20015460181c16602881101561064357151590565b3561ffff811681036107f45790565b9060288110156106435763ff00000082549160181b169063ff0000001916179055565b61052052602860c061052051013510156107f4576105205160c00135158015808261460a575b156145fb57906145e3575b156145d457613ef6610520516157a2565b613f02610520516159b2565b610520518035903603601e19018112156107f4576105205101610580526001600160401b036105805135116107f4576105805135360360206105805101136107f457613f5360206105205101613cce565b6008604061052051013510156107f4576009606061052051013510156107f457613f836101006105205101613cce565b6104a052613f976101406105205101613cce565b6104e052613fab6101806105205101613cce565b61046052613fbf6101c06105205101613cce565b61054052613fd36102006105205101613cce565b613fe36102406105205101613cce565b91613ff46102806105205101613cce565b61040052602860e061052051013510156107f4576140186101206105205101613cce565b6105605261402c6101606105205101613cce565b61403c6101a06105205101613cce565b6105a0526140506101e06105205101613cce565b926140616102206105205101613cce565b6103c0526140756102606105205101613cce565b610420526140896102a06105205101613cce565b6104405261409d6102c06105205101613e82565b610480526140b16102e06105205101613e82565b6104c0526105205160a0013580151590036107f457604051610500526102e061050051016103e052610500516103e051106001600160401b036103e05111176113ad5760ff94858094928180946103e05160405261411a36610580513560206105805101613276565b6105005152166020610500510152604061052051013560406105005101526060610520510135606061050051015261415f60c061052051013560806105005101613987565b816104a0511660a0610500510152816104e0511660c061050051015281610460511660e061050051015281610540511661010061050051015216610120610500510152166101406105005101528161040051166101606105005101526141d360e06105205101356101806105005101613987565b8161056051166101a0610500510152166101c0610500510152816105a051166101e06105005101521661020061050051015260ff6103c0511661022061050051015260ff610420511661024061050051015260ff610440511661026061050051015261ffff610480511661028061050051015261ffff6104c051166102a061050051015260a061052051013515156102c061050051015262ffffff61427d60806105205101613cbe565b165f52600460205260405f209061050051519182516001600160401b0381116113ad576142ae81611b4384546134f4565b6020601f82116001146145735781906142dd9394955f926145685750508160011b915f199060031b1c19161790565b81555b60ff60206105005101511660018201549060406105005101519060088210156106435760606105005101519060098210156106435762ff000061ff009260101b169362ffffff1916179160081b161717600182015560806105005101516028811015610643576143539060018301613e91565b61438160ff60a061050051015116600183019064ff0000000082549160201b169064ff000000001916179055565b6143b160ff60c061050051015116600183019065ff000000000082549160281b169065ff00000000001916179055565b6105005160e081015160018301805461010084015161012085015161014086015161016087015160ff60501b60509190911b1660ff60481b60489290921b9190911660409290921b60ff60401b1660389390931b67ff000000000000001660309690961b66ff000000000000166affffffffff000000000000199094169390931794909417179290921791909117905561018001516028811015610643576001919091018054610500516101a08101516101c08201516101e08301516102008401516102208501516102408601516102608701516102808801516102a08901516102c09099015177ffffffffffffffffffffffffff000000000000000000000019909a1660589c909c1b60ff60581b169b909b1760609790971b6cff000000000000000000000000169690961760689590951b60ff60681b169490941760709390931b60ff60701b169290921760789190911b60ff60781b161760809190911b60ff60801b161760889190911b60ff60881b161760909190911b60ff60901b161760989490941b61ffff60981b169390931760a89390931b61ffff60a81b169290921791151560b81b60ff60b81b16919091179055565b015190505f806112d7565b601f19821690835f52805f20915f5b8181106145bc575095836001959697106145a4575b505050811b0181556142e0565b01515f1960f88460031b161c191690555f8080614597565b9192602060018192868b015181550194019201614582565b63f326e8a560e01b5f5260045ffd5b5060e061052051013560288110156107f45715613ee5565b630e6b547b60e31b5f5260045ffd5b5060e061052051013560288110156107f4571515613eda565b5f908015613702576040516146396060826131b9565b6002815260406020820181368237604051916146566060846131b9565b6002835236602084013760646146b7600d546001600160a01b03811661467b876138e2565b528261468d60ff8360f01c16896137e0565b04614697866138e2565b526001600160a01b03600b54166146ad876138ef565b5260f81c866137e0565b046146c1836138ef565b526001600160a01b03600c541691823b156107f45760405163183dc50160e11b81523360048201526060602482015293516064850181905284926084840192915f5b8181106147db575050505f8361472882969482946003198483030160448501526132f4565b03925af180156107e9576147c6575b5060ff600d5460e81c168061474b57505050565b6147636064916001600160a01b03600c5416936137e0565b04813b156147c25760405163079cc67960e41b815233600482015260248101919091529082908290604490829084905af180156147b7576147a2575050565b6147ad8280926131b9565b6147b45750565b80fd5b6040513d84823e3d90fd5b8280fd5b6147d39192505f906131b9565b5f905f614737565b82516001600160a01b0316855287955060209485019490920191600101614703565b60ff808216939216908382111561484b575082900360ff811161061d5760ff600191160160ff811161061d5760ff1680156137fd5760ff61ffff921606160161ffff811161061d5760ff1690565b9250505090565b939496909a9298979a99919599614867613913565b50602881101561064357156106665762ffffff1696875f52600460205260405f206001015460181c60ff169a885f52600460205260405f206001015460b81c60ff1696604051809d6148b88261319d565b6148c191613987565b60ff1660208d015260408c019960ff168a5260608c01956148e29087613987565b60808c019760ff16885260a08c019a60ff168b5260c08c019864ffffffffff8a528c60e08101985f8a5215159061010001526101208d01526101408c015f905260ff166101608c015260ff166101808b015260ff166101a08a015260ff166101c08901526101e088015f90525f52600560205260405f2094875190602882101561064357865460ff62ff000061ff0060208d015160081b16935160101b1693169062ffffff191617171785555160288110156106435764ffffffffff614a49946149fe60ff6001996149e0826001600160a01b03996149c4614a23998e613e91565b518c5464ff000000001916911660201b64ff0000000016178b55565b51895465ff00000000001916911660281b65ff000000000016178855565b5186546affffffffff0000000000001916911660301b64ffffffffff60301b16178555565b518354600160581b600160f81b031916911660581b600160581b600160f81b0316178255565b610100830151151581549060ff60f81b9060f81b1690838060f81b03161781550162ffffff6101208301511681549067ffffffffff00000061014085015160181b16916001600160401b03191617178155614ac160ff61016084015116829060ff60401b82549160401b169060ff60401b1916179055565b610180820151815469ff000000000000000000191660489190911b60ff60481b161781556101a082015181546aff00000000000000000000191660509190911b60ff60501b161781556101c0820151815460ff60581b73ffffffffffffffff0000000000000000000000006101e086015160601b169260581b169073ffffffffffffffffff000000000000000000000019161717905590565b6040908151614b6983826131b9565b6004815260208101926302832ba160e51b845282805f9172184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b811015614cf7575b50806d04ee2d6d415b85acef8100000000600a921015614cdc575b662386f26fc10000811015614cc8575b6305f5e100811015614cb7575b612710811015614ca8575b6064811015614c9a575b1015614c92575b6001810193600a6021614c1d614c088861325b565b97614c158751998a6131b9565b80895261325b565b602088019490601f19013686378701015b5f1901916f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304908115614c5c57600a90614c2e565b505061325893602092519586945180918587015e840190838201905f8252519283915e01015f815203601f1981018352826131b9565b600101614bf3565b606460029104920191614bec565b61271060049104920191614be2565b6305f5e10060089104920191614bd7565b662386f26fc1000060109104920191614bca565b6d04ee2d6d415b85acef810000000060209104920191614bba565b83925072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b90049050600a614b9f565b90614d4a602080936040519481869251918291018484015e81015f838201520301601f1981018452836131b9565b5f5b8251811015614dcb57614d5f8184613c1f565b51604160f81b6001600160f81b03198216908110159081614dbc575b50614d8a575b50600101614d4c565b60f81c6020019060ff821161061d5760019160f81b6001600160f81b0319165f1a614db58286613c1f565b5390614d81565b602d60f91b101590505f614d7b565b50565b906001600160a01b03821694851595866108d457825185519081810361237f5750505f5b8351811015614e6e578060051b90600160208084880101519389010151118015614e5d575b614e4e57600191868a15614e3f57505f5260056020525f826040822082815501555b01614df2565b5f614e4992615b38565b614e39565b63634c48df60e11b5f5260045ffd5b50614e6782613d72565b1515614e17565b509493929190958151600181145f146150e95750855f6020840151602087015160405191825260208201527fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260403392a480156150c75760035464ffffffffff5f1981831601169064ffffffffff1916176003555b15614ef0575b5050505050565b8051600103614ff757602080910151920151903b614f18575b505050505b5f80808080614ee9565b602091614f57604051948593849363f23a6e6160e01b85523360048601525f60248601526044850152606484015260a0608484015260a483019061316b565b03815f865af15f9181614fc6575b50614f935750614f73615b09565b80519081614f8e5782632bfa23e760e11b5f5260045260245ffd5b602001fd5b6001600160e01b031916630dc5919f60e01b01614fb457505f808080614f09565b632bfa23e760e11b5f5260045260245ffd5b614fe991925060203d602011614ff0575b614fe181836131b9565b810190615ae9565b905f614f65565b503d614fd7565b9192903b615009575b50505050614f0e565b60209161506961504592615057604051968795869563bc197c8160e01b87523360048801525f602488015260a0604488015260a48701906132f4565b858103600319016064870152906132f4565b8381036003190160848501529061316b565b03815f865af15f91816150a6575b506150855750614f73615b09565b6001600160e01b0319166343e6837f60e01b01614fb457505f808080615000565b6150c091925060203d602011614ff057614fe181836131b9565b905f615077565b60035464ffffffffff600181831601169064ffffffffff191617600355614ee3565b81156151605764ffffffffff6003549181831603169064ffffffffff1916176003555b855f604051604081527f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb61514360408301876132f4565b9180830360208201528061515833948b6132f4565b0390a4614ee3565b64ffffffffff6003549181831601169064ffffffffff19161760035561510c565b9190820391821161061d57565b81156137fd570690565b93909250825182519081810361237f575050916001600160a01b038416905f90821515915b81518110156152a6578060051b60208082850101519187010151845f1461526557815f526005602052856001600160a01b0360405f205460581c16145f1461525d5760ff60015b168181106152335750509061522d8860019390505f5260056020525f6001604082208281550155565b016151bd565b918691608493604051936303dee4c560e01b85526004850152602484015260448301526064820152fd5b60ff5f615204565b600190929192118015615295575b614e4e5761522d8860019390505f5260056020525f6001604082208281550155565b5061529f82613d72565b1515615273565b5090505f9394509190918051600181148514615316575060208091015191015160405191825260208201527fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260403392a460035464ffffffffff5f1981831601169064ffffffffff191617600355565b7f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb9161536f9164ffffffffff6003549181831603169064ffffffffff19161760035561537e6040519283926040845260408401906132f4565b828103602084015233956132f4565b0390a4565b91805184519081810361237f5750506001600160a01b0382969596169081156001600160a01b038516918215975f9989159a5b83518110156154af578060051b6020808287010151918c0101518d5f1461548457815f526005602052876001600160a01b0360405f205460581c16145f1461547c5760ff60015b16818110615452575050906001915b8a871561542f57505f908152600560205260408120818155600101555b016153b6565b8a908a8a03615441575b505050615429565b61544a92615b38565b5f898b615439565b918891608493604051936303dee4c560e01b85526004850152602484015260448301526064820152fd5b60ff5f6153fd565b60019092919211801561549e575b614e4e5760019161540c565b506154a882613d72565b1515615492565b50965098509192969593958251600181145f146156d1575087846020850151602088015160405191825260208201527fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260403392a481156156aa575060035464ffffffffff5f1981831601169064ffffffffff1916176003555b15615537575b505050505050565b80516001036155fe57602080910151920151933b615561575b50505050505b5f808080808061552f565b61559f602093604051958694859463f23a6e6160e01b865233600487015260248601526044850152606484015260a0608484015260a483019061316b565b03815f865af15f91816155dd575b506155bb5750614f73615b09565b6001600160e01b031916630dc5919f60e01b01614fb457505f80808080615550565b6155f791925060203d602011614ff057614fe181836131b9565b905f6155ad565b91933b615610575b5050505050615556565b61564b60209361505761504596604051978896879663bc197c8160e01b8852336004890152602488015260a0604488015260a48701906132f4565b03815f865af15f9181615689575b506156675750614f73615b09565b6001600160e01b0319166343e6837f60e01b01614fb457505f80808080615606565b6156a391925060203d602011614ff057614fe181836131b9565b905f615659565b156155295760035464ffffffffff600181831601169064ffffffffff191617600355615529565b90821561574a575064ffffffffff6003549181831603169064ffffffffff1916176003555b8683604051604081527f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb61572d60408301876132f4565b9180830360208201528061574233948b6132f4565b0390a4615529565b615755575b506156f6565b64ffffffffff6003549181831601169064ffffffffff1916176003555f61574f565b60ff5f516020615c7f5f395f51905f525460401c161561579357565b631afcd79f60e31b5f5260045ffd5b60c081013560288110156107f45715614dcb57610200810160ff6157c582613cce565b161580159061599a575b1561598b576101c08201906157e382613cce565b60ff806157ef84613cce565b1691161161590d5761024083019160ff61580884613cce565b168015918215615950575b5050156159415760ff9061582690613cce565b161590811561592b575b501561591c5761010081019061584582613cce565b9061014081019160ff8061585885613cce565b1691161161590d5760ff906158709061018001613cce565b169060ff61587d82613cce565b16158015615904575b156158f55781159283156158ae575b5050501561589f57565b630e9be3ed60e41b5f5260045ffd5b919250908260ff6158c3836158c99450613cce565b1661518e565b1591826158db575b50505f8080615895565b6158ed92509060ff906158c390613cce565b155f806158d1565b63032f2c1d60e61b5f5260045ffd5b50811515615886565b630b4f540f60e41b5f5260045ffd5b634f6581d160e01b5f5260045ffd5b60ff915061593890613cce565b1615155f615830565b637d6f38bf60e11b5f5260045ffd5b9091508160ff6158c3836159649450613cce565b159081615974575b505f80615813565b615984915060ff6158c384613cce565b155f61596c565b63a5d0e38b60e01b5f5260045ffd5b5060ff6159aa6101408401613cce565b1615156157cf565b60e081013560288110156107f45715614dcb57610220810160ff6159d582613cce565b1615801590615ad1575b1561598b576101e08201906159f382613cce565b60ff806159ff84613cce565b1691161161590d5761026083019160ff615a1884613cce565b168015918215615a96575b5050156159415760ff90615a3690613cce565b1615908115615a80575b501561591c57610120810190615a5582613cce565b9061016081019160ff80615a6885613cce565b1691161161590d5760ff90615870906101a001613cce565b60ff9150615a8d90613cce565b1615155f615a40565b9091508160ff6158c383615aaa9450613cce565b159081615aba575b505f80615a23565b615aca915060ff6158c384613cce565b155f615ab2565b5060ff615ae16101608401613cce565b1615156159df565b908160209103126107f457516001600160e01b0319811681036107f45790565b3d15615b33573d90615b1a8261325b565b91615b2860405193846131b9565b82523d5f602084013e565b606090565b91906001600160a01b038216615b5f5750505f5260056020525f6001604082208281550155565b6001600160a01b0316158015615bee575b15615bdb57615bab90825f52600560205260405f2090600160581b600160f81b0319600160581b600160f81b0383549260581b169116179055565b5f90815260056020526040902080546affffffffff00000000000019164260301b64ffffffffff60301b16179055565b50635cd1d7b160e01b5f5260045260245ffd5b50815f52600560205260405f205460f81c615b70565b90615c285750805115615c1957805190602001fd5b63d6bda27560e01b5f5260045ffd5b81511580615c55575b615c39575090565b6001600160a01b0390639996b31560e01b5f521660045260245ffd5b50803b15615c3156fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a26469706673582212201e58d0c1684df99a1b214f29abdc0bfe8521b5597c53d304e7a393353cf8dd7264736f6c634300081c0033f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00
Deployed Bytecode
0x6105c06040526004361015610012575f80fd5b5f3560e01c8062fdd58e1461311857806301ffc9a71461309057806306fdde0314612fee5780630e89341c14612ed0578063128dd84c14612df157806314e6f92314612da25780631500798014612d1757806318160ddd14612cf35780632a55205a14612c9b5780632eb2c2d614612bbc5780632f5cfd2614612afb5780633773cefa146124c257806339b92bbb146123b45780634e1273f41461228a5780634f1ef2861461207757806352d1902d14611ffe57806359d5519414611ed15780636352211e14611e9b578063702385e814611e74578063715018a614611e015780637e775c6014611d555780638da5cb5b14611d235780638dd1480214611ce257806393ed55151461171d57806395d89b41146116705780639dc29fac146115d7578063a22cb4651461153d578063a4b6106914610c06578063ad3cb1cc14610bbf578063b2dc5dc314610adc578063bd85b03914610ab6578063d22cf5b514610980578063e985e9c514610927578063f242432a14610823578063f2fde38b146107f85763fdbc7c60146101a5575f80fd5b346107f45760603660031901126107f4576101be61313f565b6024356001600160401b0381116107f4576101dd90369060040161342c565b9190600354906001600160a01b038260501c1633148015610765575b156107565760449392933561020d846138b0565b610216856138b0565b91610220866131da565b9561022e60405197886131b9565b808752601f1961023d826131da565b015f5b81811061074357505064ffffffffff61025882613c52565b9660281c16915f905b87518210156106755760405160208101918252602081526102836040826131b9565b519020906102918185613ca1565b61029c82858a613cae565b356102a5613913565b50805f52600460205260ff600160405f20015460181c1660288110156106435715610666575f8181526004602090815260409091206001015460ff602882901c811693929190911c168080841461065f57506103018184615181565b6001810180911161061d5761034b9161033f61033661034493865f52600460205260ff600160405f20015460301c16906137f3565b60ff8a1661518e565b613ca1565b8093615181565b6001810180911161061d5761036961036f9160ff8860081c1661518e565b83613ca1565b5f8281526004602052604090819020600101549081901c60ff908116929160381c168083811461065757506103a48184615181565b6001810180911161061d576103e59161033f6103d961034493885f52600460205260ff600160405f20015460481c16906137f3565b60ff8c60101c1661518e565b6001810180911161061d576103696104039160ff8a60181c1661518e565b925b805f52600460205260ff600160405f20015460581c16925f5f915f955f98602882101561064357816104d0575b855f52600460205260405f206001015460181c60ff169960ff169860ff169760ff169660ff169562ffffff169460ff169360ff169260ff169060ff166104789a8c614852565b610482838b6138ff565b5261048d828a6138ff565b508061049983886138ff565b526104a482886138ff565b600190526104b190614b5a565b6104bb828b6138ff565b526104c6818a6138ff565b5060010190610261565b5f86815260046020526040902060010154909950919650925060ff606882901c8116925060609190911c1680821461063a5761050c8183615181565b6001810180911161061d576105549161033f8d60ff61054361054d958a5f52600460205282600160405f20015460701c16906137f3565b9160201c1661518e565b8092615181565b6001810180911161061d576105726105789160ff8d60281c1661518e565b82613ca1565b945b5f8481526004602052604090206001015460ff608082901c8116949160781c16808514610631576105ab8186615181565b6001810180911161061d576105f39161033f8f60ff6105e26105ec958c5f52600460205282600160405f20015460881c16906137f3565b9160301c1661518e565b8095615181565b6001810180911161061d576106116106179160ff8f60381c1661518e565b85613ca1565b98610432565b634e487b7160e01b5f52601160045260245ffd5b98899450610432565b9485915061057a565b634e487b7160e01b5f52602160045260245ffd5b925092610405565b925061036f565b633690f5fd60e21b5f5260045ffd5b5061073f847fd0ad15111831e536e6d9161c427463a02797d2e181b6b9497dcbb9e394482b1389868d6001600160a01b036107218f6106c78e604051906106bd6020836131b9565b5f82528a87614dce565b6106d2865186613ca1565b69ffffffffff00000000006003549160281b169069ffffffffff00000000001916176003556107136040519687968752608060208801526080870190613cdc565b908582036040870152613d1a565b911660608301520390a16040519182916020835260208301906132f4565b0390f35b60606020828b0181019190915201610240565b633e34a41b60e21b5f5260045ffd5b50600a54604051630935e01b60e21b8152336004820152906020826024816001600160a01b0385165afa9182156107e9575f926107b8575b50816107aa575b506101f9565b60ff915060a01c165f6107a4565b6107db91925060203d6020116107e2575b6107d381836131b9565b810190613c07565b905f61079d565b503d6107c9565b6040513d5f823e3d90fd5b5f80fd5b346107f45760203660031901126107f45761082161081461313f565b61081c613e1b565b613d9d565b005b346107f45760a03660031901126107f45761083c61313f565b610844613155565b906084356001600160401b0381116107f4576108649036906004016132ac565b906001600160a01b03811633811415806108fd575b6108e7576001600160a01b038416156108d457156108c2576108219260405190600182526044356020830152604082019260018452606435606084015260808301604052615383565b626a0d4560e21b5f525f60045260245ffd5b632bfa23e760e11b5f525f60045260245ffd5b63711bec9160e11b5f523360045260245260445ffd5b50805f52600160205260405f206001600160a01b0333165f5260205260ff60405f20541615610879565b346107f45760403660031901126107f45761094061313f565b6001600160a01b03610950613155565b91165f5260016020526001600160a01b0360405f2091165f52602052602060ff60405f2054166040519015158152f35b346107f45760203660031901126107f4576004356001600160401b0381116107f4576109b090369060040161342c565b6109b8613e1b565b5f5b8181106109f857507fb3146f6fcffb938d640f6b0fc75a797c17d53179e33357297f13f36093c73415916109f3604051928392836139f6565b0390a1005b610a03818385613993565b90610a0d82613e4e565b15610666576080820162ffffff610a2382613cbe565b165f52600460205260ff600160405f20015460181c1660c08401359060288210156107f45760288110156106435703610aa757610a6362ffffff91613cbe565b165f52600460205260ff600160405f20015460581c1660e08301359060288210156107f45760288110156106435703610aa757610aa1600192613eb4565b016109ba565b631a74792760e01b5f5260045ffd5b346107f45760203660031901126107f4576020610ad4600435613d72565b604051908152f35b346107f45760403660031901126107f457610af561313f565b6024356001600160401b0381116107f457610b1490369060040161342c565b6001600160a01b038316918233148015610b96575b15610b8757610b399136916131f1565b90156108c257610b4981516138b0565b915f5b8251811015610b6a57806001610b638193876138ff565b5201610b4c565b50826108219260405192610b7f6020856131b9565b5f8452615198565b63f019b1af60e01b5f5260045ffd5b50825f52600160205260405f206001600160a01b0333165f5260205260ff60405f205416610b29565b346107f4575f3660031901126107f45761073f604051610be06040826131b9565b60058152640352e302e360dc1b602082015260405191829160208352602083019061316b565b346107f4576101403660031901126107f457610c2061313f565b6102e0526024356001600160401b0381116107f457610c4390369060040161342c565b61034052610300526044356001600160401b0381116107f457610c6a90369060040161342c565b610240526101c0526064356001600160401b0381116107f457366023820112156107f457806004013590610cb0610ca0836131da565b60405161032052610320516131b9565b6103208051839052516020019160051b8101602401903682116107f45760248101925b8284106114fd576084356001600160401b0381116107f457610cf990369060040161342c565b6101e05260e05260a4356001600160401b0381116107f457610d1f90369060040161342c565b610140526102805260c4356001600160401b0381116107f457610d4690369060040161342c565b610100526101805260e4356001600160401b0381116107f457610d6d90369060040161342c565b6101205261016052610104356001600160401b0381116107f457610d9590369060040161342c565b61026052610220526001600160401b0361012435116107f457610dbe366101243560040161342c565b610200526101a0526001600160a01b036013541633036114ee57610240516103405114806114df575b806114d0575b806114c1575b806114b2575b806114a3575b80611494575b1561148557610e1661034051613c52565b6102c052610e26610340516138b0565b6102a0526001600160a01b03601054166040516364141b8f60e11b8152602081600481855afa9081156107e9575f91611453575b50620151808101811161061d576201518060845f926040519485938492637fe4cf6b60e01b8452610340516004850152806024850152016044830152600160648301525afa80156107e9575f60c052611402575b505f60a0525b6103405160a05110610f8d57610ef4610ed43661034051610300516131f1565b60405190610ee36020836131b9565b5f82526102a051906102e051614dce565b6040516080815261034051608082015260018060fb1b0361034051116107f457807f80427be1654cc5e8cdef307d44b7b56681e4e161fdca9fd236a9dda127d5a39b91610f76610f6560a06103405160051b806103005183870137840181858203016020860152016102c051613cdc565b828103604084015261032051613d1a565b6001600160a01b036102e0511660608301520390a1005b60a05160a05160011b0460021460a05115171561061d5760ff60f81b610fba60a05160011b60c051613c1f565b5116600160a051811b018060a05160011b1161061d5760c05160ff60f01b91610fe291613c1f565b5160081c1617611003610ffe60a051610240516101c051613cae565b613cbe565b9061104a61102261101d60a0516101405161028051613cae565b613cce565b62ffffff84165f52600460205260ff600160405f20015460281c1660ff8460f01c16916147fd565b9161108961106461101d60a0516102605161022051613cae565b62ffffff83165f52600460205260ff600160405f20015460681c168460f81c916147fd565b916110a061101d60a0516101005161018051613cae565b62ffffff83165f52600460205260ff600160405f20015460401c1690611eef8360f01c02918360f01c8304611eef148460f01c15171561061d5760ff6110ea9360081c16916147fd565b9162ffffff61110561101d60a051610200516101a051613cae565b91165f52600460205260ff600160405f20015460801c1661187f8360f01c02928060f01c840461187f149060f01c15171561061d5760ff61114a9360081c16916147fd565b9161115e60a0516103405161030051613cae565b359361117260a0516101e05160e051613cae565b35608052602860805110156107f45761119761101d60a0516101405161028051613cae565b946111ae61101d60a0516101005161018051613cae565b956111c260a0516101205161016051613cae565b359660288810156107f45761121f976111e761101d60a0516102605161022051613cae565b916111fe61101d60a051610200516101a051613cae565b93611215610ffe60a051610240516101c051613cae565b9560805190614852565b61122e60a0516102c0516138ff565b5261123e60a0516102c0516138ff565b50600161125060a0516102a0516138ff565b5261126060a051610320516138ff565b5151156113c15761127660a051610320516138ff565b5161128a60a0516103405161030051613cae565b355f52600660205260405f20908051906001600160401b0382116113ad576112bc826112b685546134f4565b85613861565b602090601f8311600114611346576112eb92915f918361133b575b50508160011b915f199060031b1c19161790565b90555b60208061130961130360a051610320516138ff565b51614d1c565b604051928184925191829101835e81016007815203019020600160ff198254161790555b600160a0510160a052610eb4565b0151905084806112d7565b9190835f52805f20905f935b601f1984168510611392576001945083601f1981161061137a575b505050811b0190556112ee565b01515f1960f88460031b161c1916905583808061136d565b81810151835560209485019460019093019290910190611352565b634e487b7160e01b5f52604160045260245ffd5b6113dd6113d760a0516103405161030051613cae565b35614b5a565b6113ec60a051610320516138ff565b526113fc60a051610320516138ff565b5061132d565b3d805f833e61141181836131b9565b8101906020818303126107f4578051906001600160401b0382116107f457019080601f830112156107f457815161144a92602001613488565b60c05280610eae565b90506020813d60201161147d575b8161146e602093836131b9565b810103126107f4575182610e5a565b3d9150611461565b631fec674760e31b5f5260045ffd5b50610200516103405114610e05565b50610260516103405114610dff565b50610120516103405114610df9565b50610100516103405114610df3565b50610140516103405114610ded565b506101e0516103405114610de7565b637fea9dc560e01b5f5260045ffd5b83356001600160401b0381116107f4578201366043820112156107f45760209161153283923690604460248201359101613276565b815201930192610cd3565b346107f45760403660031901126107f45761155661313f565b602435908115158092036107f4576001600160a01b03169081156115c557335f52600160205260405f20825f5260205260405f2060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b62ced3e160e81b5f525f60045260245ffd5b346107f45760403660031901126107f4576115f061313f565b6001600160a01b0381168033148015611647575b15610b8757156108c25761082190604051600181526024356020820152604081019060018252600160608201526080810160405260405192610b7f6020856131b9565b50805f52600160205260405f206001600160a01b0333165f5260205260ff60405f205416611604565b346107f4575f3660031901126107f457600a5460a01c60ff16156116fe5761073f60206116ea60276040516116a66040826131b9565b60028152612fa160f11b848201525b60405193849166454b5f5045545360c81b828401528051918291018484015e81015f838201520301601f1981018352826131b9565b60405191829160208352602083019061316b565b61073f60206116ea602760405161171584826131b9565b5f81526116b5565b346107f45760603660031901126107f4576004356024356044356001600160401b0381116107f4576117539036906004016132c7565b600f5460405163e743862960e01b81523360048201526024810186905292949290602090829060449082906001600160a01b03165afa9081156107e9575f91611cc3575b5015611cb457825f526005602052336001600160a01b0360405f205460581c1603611ca557611804936117cb913691613276565b5f73e3223eaf0e260b54a8ce777ac9f4a972310370c0916040518096819263b2dad15560e01b835260206004840152602483019061316b565b0381845af49384156107e9575f94611c81575b506003845110611c7257600f845111611c6357602060405180926391ae2cdb60e01b82528260048301528180611850602482018a61316b565b03915af49081156107e9575f91611c44575b5015611c355761187183614d1c565b825f52600660205261188f61189660405f206040519283809261352c565b03826131b9565b805115611c21575b6118a790614d1c565b60405190602082018151926118d6602082818601968088875e81015f838201520301601f1981018352826131b9565b519020916040519260208401855194611909602082818a0198808a875e81015f838201520301601f1981018352826131b9565b51902014918215611ad0575b5050611ac15761193468ffffffffffffffffff600d5460a01c16614623565b81516003811161198b575b5050506109f37f3566f1b26176919a8cfe17faecfe8ed2b9a6780cb1e33c1afe6ce7f3db444aae936040519384938452602084015233604084015260806060840152608083019061316b565b15611a2957516001600160f81b0319166119a3613c30565b805115611a2957602001516001600160f81b031916149081611a7f575b81611a3d575b816119e8575b506119d95783808061193f565b63a8de9f2b60e01b5f5260045ffd5b8091505160031015611a2957602301516001600160f81b031916611a0a613c30565b805160031015611a2957602301516001600160f81b03191614846119cc565b634e487b7160e01b5f52603260045260245ffd5b8091505160021015611a295760228101516001600160f81b031916611a60613c30565b805160021015611a2957602201516001600160f81b03191614906119c6565b8091505160011015611a295760218101516001600160f81b031916611aa2613c30565b805160011015611a2957602101516001600160f81b03191614906119c0565b636741e5ed60e01b5f5260045ffd5b60ff60405160208188518089835e810160078152030190205416611c1257519081611bed575b505060405160208185518086835e81016007815203019020600160ff19825416179055845f52600660205260405f2086516001600160401b0381116113ad57611b4981611b4384546134f4565b84613861565b6020601f8211600114611b8b579080611b76925f91611b80575b508160011b915f199060031b1c19161790565b90555b8680611915565b90508901518a611b63565b601f19821690835f52805f20915f5b8b828210611bd55750509083600194939210611bbd575b5050811b019055611b79565b8a01515f1960f88460031b161c191690558980611bb1565b60018495602093958493015181550194019201611b9a565b60209082604051938492835e8101600781520301902060ff1981541690558680611af6565b633480a50360e21b5f5260045ffd5b506118a7611c2e84614b5a565b905061189e565b634caa0cad60e11b5f5260045ffd5b611c5d915060203d6020116107e2576107d381836131b9565b84611862565b63680b6caf60e01b5f5260045ffd5b6365ac5e6760e11b5f5260045ffd5b611c9e9194503d805f833e611c9681836131b9565b8101906134be565b9284611817565b63ccb3f5dd60e01b5f5260045ffd5b63078eec1360e11b5f5260045ffd5b611cdc915060203d6020116107e2576107d381836131b9565b85611797565b346107f45760203660031901126107f4576001600160a01b03611d0361313f565b611d0b613e1b565b166001600160601b0360a01b60135416176013555f80f35b346107f4575f3660031901126107f45760206001600160a01b035f516020615c5f5f395f51905f525416604051908152f35b346107f45760203660031901126107f4576004356001600160401b0381116107f457611d8590369060040161342c565b611d8d613e1b565b5f5b818110611dc857507f2936ac7f20b62662f83549df75258acdd7b45fb2a4b553e96f1b07272a121ef3916109f3604051928392836139f6565b611dd3818385613993565b90611ddd82613e4e565b611df257611dec600192613eb4565b01611d8f565b63d4e8788560e01b5f5260045ffd5b346107f4575f3660031901126107f457611e19613e1b565b5f6001600160a01b035f516020615c5f5f395f51905f52546001600160601b0360a01b81165f516020615c5f5f395f51905f5255167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346107f4575f3660031901126107f457602064ffffffffff60035460281c16604051908152f35b346107f45760203660031901126107f4576004355f52600560205260206001600160a01b0360405f205460581c16604051908152f35b346107f45760203660031901126107f457611eea613913565b506004355f52600560205261020060405f206001600160401b03600160405192611f138461319d565b8054611f2260ff821686613987565b60ff8160081c16602086015260ff8160101c166040860152611f4d60ff8260181c1660608701613987565b60ff8160201c16608086015260ff8160281c1660a086015264ffffffffff8160301c1660c08601526001600160a01b038160581c1660e086015260f81c1515610100850152015462ffffff811661012084015264ffffffffff8160181c1661014084015260ff8160401c1661016084015260ff8160481c1661018084015260ff8160501c166101a084015260ff8160581c166101c084015260601c166101e0820152611ffc6040518092613334565bf35b346107f4575f3660031901126107f4576001600160a01b037f000000000000000000000000a7ae1847bcfd94a1f3c5523519c9dfdefe6a908c1630036120685760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b63703e46dd60e11b5f5260045ffd5b60403660031901126107f45761208b61313f565b6024356001600160401b0381116107f4576120aa9036906004016132ac565b6001600160a01b037f000000000000000000000000a7ae1847bcfd94a1f3c5523519c9dfdefe6a908c16803014908115612255575b50612068576120ec613e1b565b6040516352d1902d60e01b81526001600160a01b0383169290602081600481875afa5f9181612221575b5061212e5783634c9c8ce360e01b5f5260045260245ffd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc85920361220f5750813b156121fd577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff1916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a28151156121e5575f8083602061082195519101845af46121df615b09565b91615c04565b5050346121ee57005b63b398979f60e01b5f5260045ffd5b634c9c8ce360e01b5f5260045260245ffd5b632a87526960e21b5f5260045260245ffd5b9091506020813d60201161224d575b8161223d602093836131b9565b810103126107f457519085612116565b3d9150612230565b90506001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54161415836120df565b346107f45760403660031901126107f4576004356001600160401b0381116107f457366023820112156107f45780600401356122c5816131da565b916122d360405193846131b9565b8183526024602084019260051b820101903682116107f457602401915b81831061239457836024356001600160401b0381116107f45761231790369060040161323d565b908051825180820361237f57505061232f81516138b0565b915f5b8251811015612369578061235860019260051b602080828801015191860101519061345c565b61236282876138ff565b5201612332565b6040516020808252819061073f908201876132f4565b635b05999160e01b5f5260045260245260445ffd5b82356001600160a01b03811681036107f4578152602092830192016122f0565b346107f45760203660031901126107f4576004356001600160401b0381116107f4576123e49036906004016132c7565b6123ec613e1b565b6001600160401b0381116113ad5761240e816124096008546134f4565b613811565b5f601f821160011461244a57819061243a935f9261243f5750508160011b915f199060031b1c19161790565b600855005b0135905083806112d7565b601f198216927ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3915f5b8581106124aa57508360019510612491575b505050811b01600855005b01355f19600384901b60f8161c19169055828080612486565b90926020600181928686013581550194019101612474565b346107f4576101603660031901126107f4576004356001600160a01b03811681036107f4576124ef613155565b6044356001600160401b0381116107f45761250e9036906004016132c7565b6064356103808190529091906001600160a01b03811690036107f4576084359368ffffffffffffffffff851685036107f45760a435926001600160a01b03841684036107f45760c435926001600160a01b03841684036107f45764ffffffffff60e4351660e435036107f45761010435956001600160a01b03871687036107f45761012435906001600160a01b03821682036107f457610144359485151586036107f4575f516020615c7f5f395f51905f5254610360526001600160401b03610360511680159081612ae9575b6001149081612adf575b159081612ad6575b50612ac7576103605167ffffffffffffffff1981166001175f516020615c7f5f395f51905f525560401c60ff1615612a98575b612628615777565b612630615777565b61263933613d9d565b612641615777565b60206103a08190526040519061265790826131b9565b5f8152612662615777565b61266a615777565b8051906001600160401b0382116113ad576126866002546134f4565b601f8111612a52575b506103a05190601f83116001146129c057826001600160a01b03969594929387946126ce935f926129b55750508160011b915f199060031b1c19161790565b6002555b166001600160601b0360a01b600c541617600c5560095483600f60a11b9216906affffffffffffffffffffff60a81b161717600955166001600160601b0360a01b600a541617600a556001600160401b0382116113ad57612738826124096008546134f4565b5f90601f831160011461290357826001600160a01b039895937f7934a8db3f8f75ea0c15b07050e7abbb51f58cfa3914f76450dc170f3d40d811979593612793935f926128f85750508160011b915f199060031b1c19161790565b6008555b8661038051166001600160601b0360a01b600b541617600b55600a549060ff60a01b90151560a01b169060ff60a01b191617600a5560035469ffffffffff000000000060e43560281b169069ffffffffff000000000019161760035585600d54918184166001600160601b0360a01b841617600d55166001600160601b0360a01b6010541617601055612828613e1b565b7fffffff0000000000000000000000000000000000000000000000000000000000169085161760a082901b68ffffffffffffffffff60a01b1617600d5560405168ffffffffffffffffff9190911681526103a05190a1166001600160601b0360a01b601354161760135560ff6103605160401c16156128a357005b60ff60401b195f516020615c7f5f395f51905f5254165f516020615c7f5f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2604051600181526103a05190a1005b013590508a806112d7565b601f1983169160085f527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3925f5b81811061299b57509260019285926001600160a01b039b98967f7934a8db3f8f75ea0c15b07050e7abbb51f58cfa3914f76450dc170f3d40d8119a989610612982575b505050811b01600855612797565b01355f19600384901b60f8161c19169055898080612974565b8383013585556103a0516001909501949283019201612931565b015190508f806112d7565b90601f1983169160025f527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace925f5b818110612a3857509260019285926001600160a01b0399989795968a9710612a20575b505050811b016002556126d2565b01515f1960f88460031b161c191690558e8080612a12565b8284015185556103a05160019095019493840193016129ef565b60025f526103a0515f20601f840160051c81016103a0518510612a91575b601f830160051c82018110612a8657505061268f565b5f8155600101612a70565b5080612a70565b6103605168ffffffffffffffffff191668010000000000000001175f516020615c7f5f395f51905f5255612620565b63f92ee8a960e01b5f5260045ffd5b9050158b6125ed565b303b1591506125e5565b6103605160401c60ff161591506125db565b346107f45760603660031901126107f457612b1461313f565b612b1c613155565b90604435916001600160a01b0383168093036107f4576001600160a01b0391612b43613e1b565b7fffff0000000000000000000000000000000000000000ffffffffffffffffffff7dffffffffffffffffffffffffffffffffffffffff000000000000000000006003549260501b16911617600355166001600160601b0360a01b600f541617600f556001600160601b0360a01b600e541617600e555f80f35b346107f45760a03660031901126107f457612bd561313f565b612bdd613155565b6044356001600160401b0381116107f457612bfc90369060040161323d565b6064356001600160401b0381116107f457612c1b90369060040161323d565b906084356001600160401b0381116107f457612c3b9036906004016132ac565b926001600160a01b0385163381141580612c71575b6108e7576001600160a01b038216156108d457156108c25761082194615383565b50805f52600160205260405f206001600160a01b0333165f5260205260ff60405f20541615612c50565b346107f45760403660031901126107f4576001600160a01b0360095461073f6103e8612ccf60ff8460a01c166024356137e0565b046040519384931683602090939291936001600160a01b0360408201951681520152565b346107f4575f3660031901126107f457602064ffffffffff60035416604051908152f35b346107f45760203660031901126107f45760043568ffffffffffffffffff8116908181036107f4577f7934a8db3f8f75ea0c15b07050e7abbb51f58cfa3914f76450dc170f3d40d81191602091612d6c613e1b565b600d805468ffffffffffffffffff60a01b191660a09290921b68ffffffffffffffffff60a01b16919091179055604051908152a1005b346107f45760803660031901126107f457612dbb61313f565b6001600160a01b03600f54163303612de257610821906064359060443590602435906135e8565b639509283360e01b5f5260045ffd5b346107f45760603660031901126107f45760043560ff8116908181036107f4576024359160ff8316918284036107f4576044359260ff8416918285036107f457612e39613e1b565b606460ff612e5087612e4b8a866135ad565b6135ad565b1603612ec1577fb4ae64ee51c0d84410a16847b3f8f3d7ac7bbbeaf2abae8671beba816f0279e395606095600d549060ff60f81b9060f81b169260ff60e81b9060e81b169060018060e81b0316179060ff60f01b9060f01b161717600d5560405192835260208301526040820152a1005b63196f075b60e11b5f5260045ffd5b346107f45760203660031901126107f457600435612f05815f5260056020526001600160a01b0360405f205460581c16151590565b15612fdf57805f5260056020525f6040812062ffffff6001820154168252600460205260408220838352600660205260408320612f7e60ff600a5460a01c16916040519687958695630fd9944160e31b87526004870152602486015260448501526008606485015260c0608485015260c484019061352c565b90151560a4830152038173db24883dee4100a98bfec32ad95b9abf87c1a32f5af480156107e95761073f915f91612fc5575b5060405191829160208352602083019061316b565b612fd991503d805f833e611c9681836131b9565b82612fb0565b63b9c12c0360e01b5f5260045ffd5b346107f4575f3660031901126107f457600a5460a01c60ff16156130715761073f60206116ea602b6040516130246040826131b9565b60078152662028426574612960c81b848201525b6040519384916a457374666f72205065747360a81b828401528051918291018484015e81015f838201520301601f1981018352826131b9565b61073f60206116ea602b60405161308884826131b9565b5f8152613038565b346107f45760203660031901126107f45760043563ffffffff60e01b81168091036107f45760209063152a902d60e11b81149081156130d5575b506040519015158152f35b636cdb3d1360e11b811491508115613107575b81156130f6575b50826130ca565b6301ffc9a760e01b149050826130ef565b6303a24d0760e21b811491506130e8565b346107f45760403660031901126107f4576020610ad461313661313f565b6024359061345c565b600435906001600160a01b03821682036107f457565b602435906001600160a01b03821682036107f457565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b359060ff821682036107f457565b61020081019081106001600160401b038211176113ad57604052565b90601f801991011681019081106001600160401b038211176113ad57604052565b6001600160401b0381116113ad5760051b60200190565b9291906131fd816131da565b9361320b60405195866131b9565b602085838152019160051b81019283116107f457905b82821061322d57505050565b8135815260209182019101613221565b9080601f830112156107f457816020613258933591016131f1565b90565b6001600160401b0381116113ad57601f01601f191660200190565b9291926132828261325b565b9161329060405193846131b9565b8294818452818301116107f4578281602093845f960137010152565b9080601f830112156107f45781602061325893359101613276565b9181601f840112156107f4578235916001600160401b0383116107f457602083818601950101116107f457565b90602080835192838152019201905f5b8181106133115750505090565b8251845260209384019390920191600101613304565b9060288210156106435752565b6001600160401b036101e0809261334c858251613327565b60ff602082015116602086015260ff604082015116604086015261337860608201516060870190613327565b60ff608082015116608086015260ff60a08201511660a086015264ffffffffff60c08201511660c08601526001600160a01b0360e08201511660e0860152610100810151151561010086015262ffffff6101208201511661012086015264ffffffffff6101408201511661014086015260ff6101608201511661016086015260ff6101808201511661018086015260ff6101a0820151166101a086015260ff6101c0820151166101c0860152015116910152565b9181601f840112156107f4578235916001600160401b0383116107f4576020808501948460051b0101116107f457565b905f5260056020526001600160a01b038060405f205460581c169116145f1461348457600190565b5f90565b9291926134948261325b565b916134a260405193846131b9565b8294818452818301116107f4578281602093845f96015e010152565b6020818303126107f4578051906001600160401b0382116107f457019080601f830112156107f457815161325892602001613488565b90600182811c92168015613522575b602083101461350e57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691613503565b5f929181549161353b836134f4565b8083529260018116908115613590575060011461355757505050565b5f9081526020812093945091925b838310613576575060209250010190565b600181602092949394548385870101520191019190613565565b915050602093945060ff929192191683830152151560051b010190565b9060ff8091169116019060ff821161061d57565b156135ca575050565b632e9d1ba760e01b5f5260288110156106435760045260245260445ffd5b825f52600560205260405f20925f5260056020526001600160a01b038060405f205460581c169116036137d15760018281015462ffffff165f8181526004602081905260409182902090930154600f549151631a4cd3f560e11b81529384018590526001600160a01b0390911693929060ff605082901c81169160181c166136736024840182613327565b602083604481895afa9283156107e9575f9361379d575b50816136979310156135c1565b805f52600460205260ff600160405f20015460581c169060288210156106435781613706575b505050508164ffffffffff825460301c1611156137025764ffffffffff613700921664ffffffffff60301b82549160301b169064ffffffffff60301b1916179055565b565b5050565b5f526004602052602060ff600160405f20015460901c1692604460405180968193631a4cd3f560e11b835260048301526137436024830187613327565b5afa9283156107e9575f93613769575b50816137609310156135c1565b5f8080806136bd565b92506020833d602011613795575b81613784602093836131b9565b810103126107f45791519181613753565b3d9150613777565b92506020833d6020116137c9575b816137b8602093836131b9565b810103126107f4579151918161368a565b3d91506137ab565b63b03f46a160e01b5f5260045ffd5b8181029291811591840414171561061d57565b81156137fd570490565b634e487b7160e01b5f52601260045260245ffd5b601f811161381d575050565b60085f5260205f20906020601f840160051c83019310613857575b601f0160051c01905b81811061384c575050565b5f8155600101613841565b9091508190613838565b601f821161386e57505050565b5f5260205f20906020601f840160051c830193106138a6575b601f0160051c01905b81811061389b575050565b5f8155600101613890565b9091508190613887565b906138ba826131da565b6138c760405191826131b9565b82815280926138d8601f19916131da565b0190602036910137565b805115611a295760200190565b805160011015611a295760400190565b8051821015611a295760209160051b010190565b604051906139208261319d565b5f6101e0838281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e08201528261010082015282610120820152826101408201528261016082015282610180820152826101a0820152826101c08201520152565b60288210156106435752565b9190811015611a295760051b810135906102fe19813603018212156107f4570190565b905f905b600282106139c757505050565b60208060019260ff6139d88761318f565b168152019301910190916139ba565b359061ffff821682036107f457565b9180602084016020855252604083019060408160051b85010193835f916102fe1982360301905b848410613a2e575050505050505090565b90919293949596603f198282030187528735838112156107f45784018035601e19823603018112156107f4578101906020823592016001600160401b0383116107f45782360381136107f45782906103008552816103008601526103208501375f610320838501015260ff613aa56020830161318f565b166020840152604081013560088110156107f4576040840152606081013560098110156107f4576060840152608081013562ffffff81168091036107f457608084015260a08101358015158091036107f45760a084015260c0830160c08201905f905b60028210613bdf575050506103208360209361ffff613bc06102e08796613b3961010060019b0161010083016139b6565b613b4b610140870161014083016139b6565b613b5d610180870161018083016139b6565b613b6f6101c087016101c083016139b6565b613b81610200870161020083016139b6565b613b93610240870161024083016139b6565b613ba5610280870161028083016139b6565b83613bb36102c083016139e7565b166102c0870152016139e7565b166102e0830152601f01601f1916010199019701959401929190613a1d565b82359060288210156107f457602081613bfb8293600195613327565b01930191019091613b08565b908160209103126107f4575180151581036107f45790565b908151811015611a29570160200190565b60405190613c3f6040836131b9565b600482526303832ba160e51b6020830152565b90613c5c826131da565b613c6960405191826131b9565b8281528092613c7a601f19916131da565b01905f5b828110613c8a57505050565b602090613c95613913565b82828501015201613c7e565b9190820180921161061d57565b9190811015611a295760051b0190565b3562ffffff811681036107f45790565b3560ff811681036107f45790565b90602080835192838152019201905f5b818110613cf95750505090565b909192602061020082613d0f6001948851613334565b019401929101613cec565b9080602083519182815201916020808360051b8301019401925f915b838310613d4557505050505090565b9091929394602080613d63600193601f19868203018752895161316b565b97019301930191939290613d36565b613d93905f5260056020526001600160a01b0360405f205460581c16151590565b1561348457600190565b6001600160a01b03168015613e08576001600160a01b035f516020615c5f5f395f51905f5254826001600160601b0360a01b8216175f516020615c5f5f395f51905f5255167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b631e4fbdf760e01b5f525f60045260245ffd5b6001600160a01b035f516020615c5f5f395f51905f5254163303613e3b57565b63118cdaa760e01b5f523360045260245ffd5b613e5e608062ffffff9201613cbe565b165f52600460205260ff600160405f20015460181c16602881101561064357151590565b3561ffff811681036107f45790565b9060288110156106435763ff00000082549160181b169063ff0000001916179055565b61052052602860c061052051013510156107f4576105205160c00135158015808261460a575b156145fb57906145e3575b156145d457613ef6610520516157a2565b613f02610520516159b2565b610520518035903603601e19018112156107f4576105205101610580526001600160401b036105805135116107f4576105805135360360206105805101136107f457613f5360206105205101613cce565b6008604061052051013510156107f4576009606061052051013510156107f457613f836101006105205101613cce565b6104a052613f976101406105205101613cce565b6104e052613fab6101806105205101613cce565b61046052613fbf6101c06105205101613cce565b61054052613fd36102006105205101613cce565b613fe36102406105205101613cce565b91613ff46102806105205101613cce565b61040052602860e061052051013510156107f4576140186101206105205101613cce565b6105605261402c6101606105205101613cce565b61403c6101a06105205101613cce565b6105a0526140506101e06105205101613cce565b926140616102206105205101613cce565b6103c0526140756102606105205101613cce565b610420526140896102a06105205101613cce565b6104405261409d6102c06105205101613e82565b610480526140b16102e06105205101613e82565b6104c0526105205160a0013580151590036107f457604051610500526102e061050051016103e052610500516103e051106001600160401b036103e05111176113ad5760ff94858094928180946103e05160405261411a36610580513560206105805101613276565b6105005152166020610500510152604061052051013560406105005101526060610520510135606061050051015261415f60c061052051013560806105005101613987565b816104a0511660a0610500510152816104e0511660c061050051015281610460511660e061050051015281610540511661010061050051015216610120610500510152166101406105005101528161040051166101606105005101526141d360e06105205101356101806105005101613987565b8161056051166101a0610500510152166101c0610500510152816105a051166101e06105005101521661020061050051015260ff6103c0511661022061050051015260ff610420511661024061050051015260ff610440511661026061050051015261ffff610480511661028061050051015261ffff6104c051166102a061050051015260a061052051013515156102c061050051015262ffffff61427d60806105205101613cbe565b165f52600460205260405f209061050051519182516001600160401b0381116113ad576142ae81611b4384546134f4565b6020601f82116001146145735781906142dd9394955f926145685750508160011b915f199060031b1c19161790565b81555b60ff60206105005101511660018201549060406105005101519060088210156106435760606105005101519060098210156106435762ff000061ff009260101b169362ffffff1916179160081b161717600182015560806105005101516028811015610643576143539060018301613e91565b61438160ff60a061050051015116600183019064ff0000000082549160201b169064ff000000001916179055565b6143b160ff60c061050051015116600183019065ff000000000082549160281b169065ff00000000001916179055565b6105005160e081015160018301805461010084015161012085015161014086015161016087015160ff60501b60509190911b1660ff60481b60489290921b9190911660409290921b60ff60401b1660389390931b67ff000000000000001660309690961b66ff000000000000166affffffffff000000000000199094169390931794909417179290921791909117905561018001516028811015610643576001919091018054610500516101a08101516101c08201516101e08301516102008401516102208501516102408601516102608701516102808801516102a08901516102c09099015177ffffffffffffffffffffffffff000000000000000000000019909a1660589c909c1b60ff60581b169b909b1760609790971b6cff000000000000000000000000169690961760689590951b60ff60681b169490941760709390931b60ff60701b169290921760789190911b60ff60781b161760809190911b60ff60801b161760889190911b60ff60881b161760909190911b60ff60901b161760989490941b61ffff60981b169390931760a89390931b61ffff60a81b169290921791151560b81b60ff60b81b16919091179055565b015190505f806112d7565b601f19821690835f52805f20915f5b8181106145bc575095836001959697106145a4575b505050811b0181556142e0565b01515f1960f88460031b161c191690555f8080614597565b9192602060018192868b015181550194019201614582565b63f326e8a560e01b5f5260045ffd5b5060e061052051013560288110156107f45715613ee5565b630e6b547b60e31b5f5260045ffd5b5060e061052051013560288110156107f4571515613eda565b5f908015613702576040516146396060826131b9565b6002815260406020820181368237604051916146566060846131b9565b6002835236602084013760646146b7600d546001600160a01b03811661467b876138e2565b528261468d60ff8360f01c16896137e0565b04614697866138e2565b526001600160a01b03600b54166146ad876138ef565b5260f81c866137e0565b046146c1836138ef565b526001600160a01b03600c541691823b156107f45760405163183dc50160e11b81523360048201526060602482015293516064850181905284926084840192915f5b8181106147db575050505f8361472882969482946003198483030160448501526132f4565b03925af180156107e9576147c6575b5060ff600d5460e81c168061474b57505050565b6147636064916001600160a01b03600c5416936137e0565b04813b156147c25760405163079cc67960e41b815233600482015260248101919091529082908290604490829084905af180156147b7576147a2575050565b6147ad8280926131b9565b6147b45750565b80fd5b6040513d84823e3d90fd5b8280fd5b6147d39192505f906131b9565b5f905f614737565b82516001600160a01b0316855287955060209485019490920191600101614703565b60ff808216939216908382111561484b575082900360ff811161061d5760ff600191160160ff811161061d5760ff1680156137fd5760ff61ffff921606160161ffff811161061d5760ff1690565b9250505090565b939496909a9298979a99919599614867613913565b50602881101561064357156106665762ffffff1696875f52600460205260405f206001015460181c60ff169a885f52600460205260405f206001015460b81c60ff1696604051809d6148b88261319d565b6148c191613987565b60ff1660208d015260408c019960ff168a5260608c01956148e29087613987565b60808c019760ff16885260a08c019a60ff168b5260c08c019864ffffffffff8a528c60e08101985f8a5215159061010001526101208d01526101408c015f905260ff166101608c015260ff166101808b015260ff166101a08a015260ff166101c08901526101e088015f90525f52600560205260405f2094875190602882101561064357865460ff62ff000061ff0060208d015160081b16935160101b1693169062ffffff191617171785555160288110156106435764ffffffffff614a49946149fe60ff6001996149e0826001600160a01b03996149c4614a23998e613e91565b518c5464ff000000001916911660201b64ff0000000016178b55565b51895465ff00000000001916911660281b65ff000000000016178855565b5186546affffffffff0000000000001916911660301b64ffffffffff60301b16178555565b518354600160581b600160f81b031916911660581b600160581b600160f81b0316178255565b610100830151151581549060ff60f81b9060f81b1690838060f81b03161781550162ffffff6101208301511681549067ffffffffff00000061014085015160181b16916001600160401b03191617178155614ac160ff61016084015116829060ff60401b82549160401b169060ff60401b1916179055565b610180820151815469ff000000000000000000191660489190911b60ff60481b161781556101a082015181546aff00000000000000000000191660509190911b60ff60501b161781556101c0820151815460ff60581b73ffffffffffffffff0000000000000000000000006101e086015160601b169260581b169073ffffffffffffffffff000000000000000000000019161717905590565b6040908151614b6983826131b9565b6004815260208101926302832ba160e51b845282805f9172184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b811015614cf7575b50806d04ee2d6d415b85acef8100000000600a921015614cdc575b662386f26fc10000811015614cc8575b6305f5e100811015614cb7575b612710811015614ca8575b6064811015614c9a575b1015614c92575b6001810193600a6021614c1d614c088861325b565b97614c158751998a6131b9565b80895261325b565b602088019490601f19013686378701015b5f1901916f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304908115614c5c57600a90614c2e565b505061325893602092519586945180918587015e840190838201905f8252519283915e01015f815203601f1981018352826131b9565b600101614bf3565b606460029104920191614bec565b61271060049104920191614be2565b6305f5e10060089104920191614bd7565b662386f26fc1000060109104920191614bca565b6d04ee2d6d415b85acef810000000060209104920191614bba565b83925072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b90049050600a614b9f565b90614d4a602080936040519481869251918291018484015e81015f838201520301601f1981018452836131b9565b5f5b8251811015614dcb57614d5f8184613c1f565b51604160f81b6001600160f81b03198216908110159081614dbc575b50614d8a575b50600101614d4c565b60f81c6020019060ff821161061d5760019160f81b6001600160f81b0319165f1a614db58286613c1f565b5390614d81565b602d60f91b101590505f614d7b565b50565b906001600160a01b03821694851595866108d457825185519081810361237f5750505f5b8351811015614e6e578060051b90600160208084880101519389010151118015614e5d575b614e4e57600191868a15614e3f57505f5260056020525f826040822082815501555b01614df2565b5f614e4992615b38565b614e39565b63634c48df60e11b5f5260045ffd5b50614e6782613d72565b1515614e17565b509493929190958151600181145f146150e95750855f6020840151602087015160405191825260208201527fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260403392a480156150c75760035464ffffffffff5f1981831601169064ffffffffff1916176003555b15614ef0575b5050505050565b8051600103614ff757602080910151920151903b614f18575b505050505b5f80808080614ee9565b602091614f57604051948593849363f23a6e6160e01b85523360048601525f60248601526044850152606484015260a0608484015260a483019061316b565b03815f865af15f9181614fc6575b50614f935750614f73615b09565b80519081614f8e5782632bfa23e760e11b5f5260045260245ffd5b602001fd5b6001600160e01b031916630dc5919f60e01b01614fb457505f808080614f09565b632bfa23e760e11b5f5260045260245ffd5b614fe991925060203d602011614ff0575b614fe181836131b9565b810190615ae9565b905f614f65565b503d614fd7565b9192903b615009575b50505050614f0e565b60209161506961504592615057604051968795869563bc197c8160e01b87523360048801525f602488015260a0604488015260a48701906132f4565b858103600319016064870152906132f4565b8381036003190160848501529061316b565b03815f865af15f91816150a6575b506150855750614f73615b09565b6001600160e01b0319166343e6837f60e01b01614fb457505f808080615000565b6150c091925060203d602011614ff057614fe181836131b9565b905f615077565b60035464ffffffffff600181831601169064ffffffffff191617600355614ee3565b81156151605764ffffffffff6003549181831603169064ffffffffff1916176003555b855f604051604081527f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb61514360408301876132f4565b9180830360208201528061515833948b6132f4565b0390a4614ee3565b64ffffffffff6003549181831601169064ffffffffff19161760035561510c565b9190820391821161061d57565b81156137fd570690565b93909250825182519081810361237f575050916001600160a01b038416905f90821515915b81518110156152a6578060051b60208082850101519187010151845f1461526557815f526005602052856001600160a01b0360405f205460581c16145f1461525d5760ff60015b168181106152335750509061522d8860019390505f5260056020525f6001604082208281550155565b016151bd565b918691608493604051936303dee4c560e01b85526004850152602484015260448301526064820152fd5b60ff5f615204565b600190929192118015615295575b614e4e5761522d8860019390505f5260056020525f6001604082208281550155565b5061529f82613d72565b1515615273565b5090505f9394509190918051600181148514615316575060208091015191015160405191825260208201527fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260403392a460035464ffffffffff5f1981831601169064ffffffffff191617600355565b7f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb9161536f9164ffffffffff6003549181831603169064ffffffffff19161760035561537e6040519283926040845260408401906132f4565b828103602084015233956132f4565b0390a4565b91805184519081810361237f5750506001600160a01b0382969596169081156001600160a01b038516918215975f9989159a5b83518110156154af578060051b6020808287010151918c0101518d5f1461548457815f526005602052876001600160a01b0360405f205460581c16145f1461547c5760ff60015b16818110615452575050906001915b8a871561542f57505f908152600560205260408120818155600101555b016153b6565b8a908a8a03615441575b505050615429565b61544a92615b38565b5f898b615439565b918891608493604051936303dee4c560e01b85526004850152602484015260448301526064820152fd5b60ff5f6153fd565b60019092919211801561549e575b614e4e5760019161540c565b506154a882613d72565b1515615492565b50965098509192969593958251600181145f146156d1575087846020850151602088015160405191825260208201527fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260403392a481156156aa575060035464ffffffffff5f1981831601169064ffffffffff1916176003555b15615537575b505050505050565b80516001036155fe57602080910151920151933b615561575b50505050505b5f808080808061552f565b61559f602093604051958694859463f23a6e6160e01b865233600487015260248601526044850152606484015260a0608484015260a483019061316b565b03815f865af15f91816155dd575b506155bb5750614f73615b09565b6001600160e01b031916630dc5919f60e01b01614fb457505f80808080615550565b6155f791925060203d602011614ff057614fe181836131b9565b905f6155ad565b91933b615610575b5050505050615556565b61564b60209361505761504596604051978896879663bc197c8160e01b8852336004890152602488015260a0604488015260a48701906132f4565b03815f865af15f9181615689575b506156675750614f73615b09565b6001600160e01b0319166343e6837f60e01b01614fb457505f80808080615606565b6156a391925060203d602011614ff057614fe181836131b9565b905f615659565b156155295760035464ffffffffff600181831601169064ffffffffff191617600355615529565b90821561574a575064ffffffffff6003549181831603169064ffffffffff1916176003555b8683604051604081527f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb61572d60408301876132f4565b9180830360208201528061574233948b6132f4565b0390a4615529565b615755575b506156f6565b64ffffffffff6003549181831601169064ffffffffff1916176003555f61574f565b60ff5f516020615c7f5f395f51905f525460401c161561579357565b631afcd79f60e31b5f5260045ffd5b60c081013560288110156107f45715614dcb57610200810160ff6157c582613cce565b161580159061599a575b1561598b576101c08201906157e382613cce565b60ff806157ef84613cce565b1691161161590d5761024083019160ff61580884613cce565b168015918215615950575b5050156159415760ff9061582690613cce565b161590811561592b575b501561591c5761010081019061584582613cce565b9061014081019160ff8061585885613cce565b1691161161590d5760ff906158709061018001613cce565b169060ff61587d82613cce565b16158015615904575b156158f55781159283156158ae575b5050501561589f57565b630e9be3ed60e41b5f5260045ffd5b919250908260ff6158c3836158c99450613cce565b1661518e565b1591826158db575b50505f8080615895565b6158ed92509060ff906158c390613cce565b155f806158d1565b63032f2c1d60e61b5f5260045ffd5b50811515615886565b630b4f540f60e41b5f5260045ffd5b634f6581d160e01b5f5260045ffd5b60ff915061593890613cce565b1615155f615830565b637d6f38bf60e11b5f5260045ffd5b9091508160ff6158c3836159649450613cce565b159081615974575b505f80615813565b615984915060ff6158c384613cce565b155f61596c565b63a5d0e38b60e01b5f5260045ffd5b5060ff6159aa6101408401613cce565b1615156157cf565b60e081013560288110156107f45715614dcb57610220810160ff6159d582613cce565b1615801590615ad1575b1561598b576101e08201906159f382613cce565b60ff806159ff84613cce565b1691161161590d5761026083019160ff615a1884613cce565b168015918215615a96575b5050156159415760ff90615a3690613cce565b1615908115615a80575b501561591c57610120810190615a5582613cce565b9061016081019160ff80615a6885613cce565b1691161161590d5760ff90615870906101a001613cce565b60ff9150615a8d90613cce565b1615155f615a40565b9091508160ff6158c383615aaa9450613cce565b159081615aba575b505f80615a23565b615aca915060ff6158c384613cce565b155f615ab2565b5060ff615ae16101608401613cce565b1615156159df565b908160209103126107f457516001600160e01b0319811681036107f45790565b3d15615b33573d90615b1a8261325b565b91615b2860405193846131b9565b82523d5f602084013e565b606090565b91906001600160a01b038216615b5f5750505f5260056020525f6001604082208281550155565b6001600160a01b0316158015615bee575b15615bdb57615bab90825f52600560205260405f2090600160581b600160f81b0319600160581b600160f81b0383549260581b169116179055565b5f90815260056020526040902080546affffffffff00000000000019164260301b64ffffffffff60301b16179055565b50635cd1d7b160e01b5f5260045260245ffd5b50815f52600560205260405f205460f81c615b70565b90615c285750805115615c1957805190602001fd5b63d6bda27560e01b5f5260045ffd5b81511580615c55575b615c39575090565b6001600160a01b0390639996b31560e01b5f521660045260245ffd5b50803b15615c3156fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a26469706673582212201e58d0c1684df99a1b214f29abdc0bfe8521b5597c53d304e7a393353cf8dd7264736f6c634300081c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.