Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60a06040 | 14293539 | 999 days ago | IN | 0 ETH | 0.09815035 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
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 Name:
Poohs
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-28 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.10; //******************************************************************************** //***************************************(,....@********************************** //*********************@......,@****@@&*..%@@,.@********************************** //********************%,.@..@...@..............&@********************************* //*********************@.........................@******************************** //************************@@@.....................@******************************* //***********************@....................../..@****************************** //***********************#............%.........&@%@@@@*************************** //***********************@..........................,@**************************** //***********************@..........................@***************************** //************************@........................@****************************** //**************************@....................,@******************************* //*************************@.....@@............@(********************************* //***********************@,..........,@@@@@@...@@@******************************** //**********************@.........@,.............@(.@/**************************** //*********************@.@..........@..............@..*@************************** //********************@.(............&...............@..(&************************ //********************@.@............@................@...@*********************** //*******************%,.%.........%,.(@@..............(@...@********************** //*******************%,..@................@(.........@......@********************* //********************@....@................@@@@.....&......@@#@&***************** //********************@......&@...........@......@...#*...@......@**************** //*********************@.......@@........@........&...@/&@(.......@*************** //*********************%&...&,...........@........@.*@....,.......@*************** //***********************@........................@,.............@**************** //*************************@.....................@.......#@.....@***************** //****************************@@.......%@@@.....@&@@%*******@@@******************* //******************************************************************************** /** * @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. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } } /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); } /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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 ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { assembly { r.slot := slot } } } /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ * * @custom:oz-upgrades-unsafe-allow delegatecall */ abstract contract ERC1967UpgradeUpgradeable is Initializable { function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall( address newImplementation, bytes memory data, bool forceCall ) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { _functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS( address newImplementation, bytes memory data, bool forceCall ) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Emitted when the beacon is upgraded. */ event BeaconUpgraded(address indexed beacon); /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall( address newBeacon, bytes memory data, bool forceCall ) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) { require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @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); } /** * @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. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate that the this implementation remains valid after an upgrade. * * 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. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeTo(address newImplementation) external virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } /** * @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; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library CountersUpgradeable { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721ReceiverUpgradeable { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC721_init_unchained(name_, symbol_); } function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC721Upgradeable).interfaceId || interfaceId == type(IERC721MetadataUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721Upgradeable.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721Upgradeable.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721Upgradeable.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721ReceiverUpgradeable.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[44] private __gap; } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } contract Poohs is Initializable, UUPSUpgradeable, OwnableUpgradeable, ERC721Upgradeable, ReentrancyGuardUpgradeable { using StringsUpgradeable for uint256; // Metadata base URI string internal baseURI; // Maximum mint count uint256 public maxMint; uint256 public maxPerWallet; // Treasury Address address payable treasury; // Switch to enable mint bool public isMintEnabled; // Switch to enable burn bool public isBurnEnabled; // Token counter using CountersUpgradeable for CountersUpgradeable.Counter; CountersUpgradeable.Counter private tokenIdCounter; // Ledger of NFTs minted by each unique wallet address. mapping(address => uint256) public userMintCount; // Mint event event Mint(address indexed account, uint256 indexed count); function initialize( string memory _uri, uint256 _maxMint, uint256 _maxPerWallet ) public initializer { __UUPSUpgradeable_init(); __Ownable_init(); __ERC721_init("Pooh", "POOH"); __ReentrancyGuard_init(); baseURI = _uri; maxMint = _maxMint; maxPerWallet = _maxPerWallet; } /** * @dev Mint switch */ function setMintState(bool _state) external onlyOwner { isMintEnabled = _state; } /** * @dev Sets the base URI for the API that provides the NFT data. */ function setBaseURI(string memory _uri) external onlyOwner { baseURI = _uri; } /** * @dev Token burn switch */ function setBurnState(bool _isBurnEnabled) external onlyOwner { isBurnEnabled = _isBurnEnabled; } /** * @dev User mint */ function userMint(uint256 _count) external nonReentrant { require(isMintEnabled, "Minting is not active at the moment."); require(_count > 0, "Can't mint 0 tokens"); require( tokenIdCounter.current() + _count <= maxMint, "Total mint exceeded" ); require( userMintCount[_msgSender()] + _count <= maxPerWallet, "Can not mint more than 3" ); // Mint to user account for (uint256 i = 0; i < _count; i++) { tokenIdCounter.increment(); _safeMint(msg.sender, tokenIdCounter.current()); } userMintCount[msg.sender] += _count; emit Mint(msg.sender, _count); } /** * @dev Airdrop tokens */ function airdropTokens(address[] memory _adds) external onlyOwner { require(tokenIdCounter.current() + _adds.length <= maxMint, "Exceeds total mint"); for (uint256 i = 0; i < _adds.length; i++) { tokenIdCounter.increment(); _safeMint(_adds[i], tokenIdCounter.current()); } } function burn(uint256 tokenId) external { require(isBurnEnabled, "burning disabled"); require( _isApprovedOrOwner(msg.sender, tokenId), "not owner nor approved" ); _burn(tokenId); } /** * @dev Gets the count of Mints left for a given account */ function getMintsLeft(address _account) external view returns (uint256) { return maxPerWallet - userMintCount[_account]; } /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256) { return tokenIdCounter.current(); } /** * @dev For upgrading */ function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} /** * @dev See {ERC721}. */ function _baseURI() internal view virtual override returns (string memory) { return baseURI; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"count","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[{"internalType":"address[]","name":"_adds","type":"address[]"}],"name":"airdropTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getMintsLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"},{"internalType":"uint256","name":"_maxMint","type":"uint256"},{"internalType":"uint256","name":"_maxPerWallet","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isBurnEnabled","type":"bool"}],"name":"setBurnState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","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":"_count","type":"uint256"}],"name":"userMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040523060805234801561001457600080fd5b5060805161342661004c60003960008181610b3801528181610bce01528181610ed501528181610f6b015261106201526134266000f3fe6080604052600436106101fe5760003560e01c80634f1ef2861161011d5780638b3dcabb116100b0578063a22cb4651161007f578063c87b56dd11610064578063c87b56dd146105ea578063e985e9c51461060a578063f2fde38b1461065457600080fd5b8063a22cb465146105aa578063b88d4fde146105ca57600080fd5b80638b3dcabb146105375780638da5cb5b1461055757806395d89b4114610575578063977d08c01461058a57600080fd5b80636352211e116100ec5780636352211e146104cb57806370a08231146104eb578063715018a61461050b5780637501f7411461052057600080fd5b80634f1ef2861461046357806352d1902d1461047657806355f804b31461048b5780635ce289ba146104ab57600080fd5b80632ec58a301161019557806342842e0e1161016457806342842e0e146103ec57806342966c681461040c578063453c23101461042c5780634ee51a271461044357600080fd5b80632ec58a301461034b578063346de50a1461036b5780633659cfe61461039e5780633950891f146103be57600080fd5b8063095ea7b3116101d1578063095ea7b3146102c657806318160ddd146102e857806323b872dd1461030b57806326412aca1461032b57600080fd5b806301ffc9a71461020357806306fdde031461023857806307ebec271461025a578063081812fc1461028e575b600080fd5b34801561020f57600080fd5b5061022361021e366004612d9c565b610674565b60405190151581526020015b60405180910390f35b34801561024457600080fd5b5061024d610759565b60405161022f9190612e11565b34801561026657600080fd5b5061016254610223907501000000000000000000000000000000000000000000900460ff1681565b34801561029a57600080fd5b506102ae6102a9366004612e24565b6107eb565b6040516001600160a01b03909116815260200161022f565b3480156102d257600080fd5b506102e66102e1366004612e59565b610896565b005b3480156102f457600080fd5b506102fd6109c8565b60405190815260200161022f565b34801561031757600080fd5b506102e6610326366004612e83565b6109d9565b34801561033757600080fd5b506102e6610346366004612ecf565b610a60565b34801561035757600080fd5b506102fd610366366004612eea565b610b05565b34801561037757600080fd5b50610162546102239074010000000000000000000000000000000000000000900460ff1681565b3480156103aa57600080fd5b506102e66103b9366004612eea565b610b2d565b3480156103ca57600080fd5b506102fd6103d9366004612eea565b6101646020526000908152604090205481565b3480156103f857600080fd5b506102e6610407366004612e83565b610ccb565b34801561041857600080fd5b506102e6610427366004612e24565b610ce6565b34801561043857600080fd5b506102fd6101615481565b34801561044f57600080fd5b506102e661045e366004612f4c565b610db1565b6102e6610471366004613069565b610eca565b34801561048257600080fd5b506102fd611055565b34801561049757600080fd5b506102e66104a63660046130b7565b61111a565b3480156104b757600080fd5b506102e66104c6366004612ecf565b611188565b3480156104d757600080fd5b506102ae6104e6366004612e24565b61122e565b3480156104f757600080fd5b506102fd610506366004612eea565b6112b9565b34801561051757600080fd5b506102e6611353565b34801561052c57600080fd5b506102fd6101605481565b34801561054357600080fd5b506102e6610552366004612e24565b6113b9565b34801561056357600080fd5b506097546001600160a01b03166102ae565b34801561058157600080fd5b5061024d61165e565b34801561059657600080fd5b506102e66105a53660046130ec565b61166d565b3480156105b657600080fd5b506102e66105c536600461313a565b61181f565b3480156105d657600080fd5b506102e66105e536600461316d565b61182a565b3480156105f657600080fd5b5061024d610605366004612e24565b6118b2565b34801561061657600080fd5b506102236106253660046131d5565b6001600160a01b0391821660009081526101006020908152604080832093909416825291909152205460ff1690565b34801561066057600080fd5b506102e661066f366004612eea565b61199b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061070757507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061075357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060fb8054610768906131ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610794906131ff565b80156107e15780601f106107b6576101008083540402835291602001916107e1565b820191906000526020600020905b8154815290600101906020018083116107c457829003601f168201915b5050505050905090565b600081815260fd60205260408120546001600160a01b031661087a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b50600090815260ff60205260409020546001600160a01b031690565b60006108a18261122e565b9050806001600160a01b0316836001600160a01b0316141561092b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610871565b336001600160a01b038216148061094757506109478133610625565b6109b95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610871565b6109c38383611a7a565b505050565b60006109d46101635490565b905090565b6109e33382611af5565b610a555760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610871565b6109c3838383611bfe565b6097546001600160a01b03163314610aba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610871565b610162805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6001600160a01b03811660009081526101646020526040812054610161546107539190613250565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610bcc5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610871565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c277f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610ca35760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610871565b610cac81611dd8565b60408051600080825260208201909252610cc891839190611e32565b50565b6109c38383836040518060200160405280600081525061182a565b610162547501000000000000000000000000000000000000000000900460ff16610d525760405162461bcd60e51b815260206004820152601060248201527f6275726e696e672064697361626c6564000000000000000000000000000000006044820152606401610871565b610d5c3382611af5565b610da85760405162461bcd60e51b815260206004820152601660248201527f6e6f74206f776e6572206e6f7220617070726f766564000000000000000000006044820152606401610871565b610cc881611fd2565b6097546001600160a01b03163314610e0b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610871565b61016054815161016354610e1f9190613267565b1115610e6d5760405162461bcd60e51b815260206004820152601260248201527f4578636565647320746f74616c206d696e7400000000000000000000000000006044820152606401610871565b60005b8151811015610ec657610e8861016380546001019055565b610eb4828281518110610e9d57610e9d61327f565b6020026020010151610eaf6101635490565b61207a565b80610ebe81613295565b915050610e70565b5050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610f695760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610871565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610fc47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146110405760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610871565b61104982611dd8565b610ec682826001611e32565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110f55760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610871565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b6097546001600160a01b031633146111745760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610871565b8051610ec69061015f906020840190612cd5565b6097546001600160a01b031633146111e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610871565b61016280549115157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff909216919091179055565b600081815260fd60205260408120546001600160a01b0316806107535760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610871565b60006001600160a01b0382166113375760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610871565b506001600160a01b0316600090815260fe602052604090205490565b6097546001600160a01b031633146113ad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610871565b6113b76000612094565b565b600261012d54141561140d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610871565b600261012d556101625474010000000000000000000000000000000000000000900460ff166114a35760405162461bcd60e51b8152602060048201526024808201527f4d696e74696e67206973206e6f742061637469766520617420746865206d6f6d60448201527f656e742e000000000000000000000000000000000000000000000000000000006064820152608401610871565b600081116114f35760405162461bcd60e51b815260206004820152601360248201527f43616e2774206d696e74203020746f6b656e73000000000000000000000000006044820152606401610871565b61016054816115026101635490565b61150c9190613267565b111561155a5760405162461bcd60e51b815260206004820152601360248201527f546f74616c206d696e74206578636565646564000000000000000000000000006044820152606401610871565b61016154336000908152610164602052604090205461157a908390613267565b11156115c85760405162461bcd60e51b815260206004820152601860248201527f43616e206e6f74206d696e74206d6f7265207468616e203300000000000000006044820152606401610871565b60005b81811015611602576115e261016380546001019055565b6115f033610eaf6101635490565b806115fa81613295565b9150506115cb565b50336000908152610164602052604081208054839290611623908490613267565b9091555050604051819033907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590600090a350600161012d55565b606060fc8054610768906131ff565b600054610100900460ff166116885760005460ff161561168c565b303b155b6116fe5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610871565b600054610100900460ff1615801561173d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b6117456120f3565b61174d61215e565b6117c16040518060400160405280600481526020017f506f6f68000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f504f4f48000000000000000000000000000000000000000000000000000000008152506121d1565b6117c9612246565b83516117dd9061015f906020870190612cd5565b50610160839055610161829055801561181957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50505050565b610ec63383836122b9565b6118343383611af5565b6118a65760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610871565b611819848484846123a7565b600081815260fd60205260409020546060906001600160a01b031661193f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610871565b6000611949612430565b905060008151116119695760405180602001604052806000815250611994565b8061197384612440565b6040516020016119849291906132ce565b6040516020818303038152906040525b9392505050565b6097546001600160a01b031633146119f55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610871565b6001600160a01b038116611a715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610871565b610cc881612094565b600081815260ff60205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091558190611abc8261122e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081815260fd60205260408120546001600160a01b0316611b7f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610871565b6000611b8a8361122e565b9050806001600160a01b0316846001600160a01b03161480611bc55750836001600160a01b0316611bba846107eb565b6001600160a01b0316145b80611bf657506001600160a01b038082166000908152610100602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611c118261122e565b6001600160a01b031614611c8d5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610871565b6001600160a01b038216611d085760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610871565b611d13600082611a7a565b6001600160a01b038316600090815260fe60205260408120805460019290611d3c908490613250565b90915550506001600160a01b038216600090815260fe60205260408120805460019290611d6a908490613267565b9091555050600081815260fd6020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6097546001600160a01b03163314610cc85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610871565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611e65576109c383612572565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611ebf575060408051601f3d908101601f19168201909252611ebc918101906132fd565b60015b611f315760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610871565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114611fc65760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610871565b506109c383838361263d565b6000611fdd8261122e565b9050611fea600083611a7a565b6001600160a01b038116600090815260fe60205260408120805460019290612013908490613250565b9091555050600082815260fd6020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b610ec6828260405180602001604052806000815250612662565b609780546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166113b75760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610871565b600054610100900460ff166121c95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610871565b6113b76126eb565b600054610100900460ff1661223c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610871565b610ec6828261275f565b600054610100900460ff166122b15760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610871565b6113b76127f1565b816001600160a01b0316836001600160a01b0316141561231b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610871565b6001600160a01b038381166000818152610100602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6123b2848484611bfe565b6123be84848484612864565b6118195760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610871565b606061015f8054610768906131ff565b60608161248057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156124aa578061249481613295565b91506124a39050600a8361332c565b9150612484565b60008167ffffffffffffffff8111156124c5576124c5612f05565b6040519080825280601f01601f1916602001820160405280156124ef576020820181803683370190505b5090505b8415611bf657612504600183613250565b9150612511600a86613340565b61251c906030613267565b60f81b8183815181106125315761253161327f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061256b600a8661332c565b94506124f3565b6001600160a01b0381163b6125ef5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610871565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b61264683612a02565b6000825111806126535750805b156109c3576118198383612a42565b61266c8383612b4d565b6126796000848484612864565b6109c35760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610871565b600054610100900460ff166127565760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610871565b6113b733612094565b600054610100900460ff166127ca5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610871565b81516127dd9060fb906020850190612cd5565b5080516109c39060fc906020840190612cd5565b600054610100900460ff1661285c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610871565b600161012d55565b60006001600160a01b0384163b156129f7576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906128c1903390899088908890600401613354565b6020604051808303816000875af19250505080156128fc575060408051601f3d908101601f191682019092526128f991810190613390565b60015b6129ac573d80801561292a576040519150601f19603f3d011682016040523d82523d6000602084013e61292f565b606091505b5080516129a45760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610871565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611bf6565b506001949350505050565b612a0b81612572565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b612ac15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401610871565b600080846001600160a01b031684604051612adc91906133ad565b600060405180830381855af49150503d8060008114612b17576040519150601f19603f3d011682016040523d82523d6000602084013e612b1c565b606091505b5091509150612b4482826040518060600160405280602781526020016133ca60279139612c9c565b95945050505050565b6001600160a01b038216612ba35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610871565b600081815260fd60205260409020546001600160a01b031615612c085760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610871565b6001600160a01b038216600090815260fe60205260408120805460019290612c31908490613267565b9091555050600081815260fd6020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60608315612cab575081611994565b825115612cbb5782518084602001fd5b8160405162461bcd60e51b81526004016108719190612e11565b828054612ce1906131ff565b90600052602060002090601f016020900481019282612d035760008555612d49565b82601f10612d1c57805160ff1916838001178555612d49565b82800160010185558215612d49579182015b82811115612d49578251825591602001919060010190612d2e565b50612d55929150612d59565b5090565b5b80821115612d555760008155600101612d5a565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610cc857600080fd5b600060208284031215612dae57600080fd5b813561199481612d6e565b60005b83811015612dd4578181015183820152602001612dbc565b838111156118195750506000910152565b60008151808452612dfd816020860160208601612db9565b601f01601f19169290920160200192915050565b6020815260006119946020830184612de5565b600060208284031215612e3657600080fd5b5035919050565b80356001600160a01b0381168114612e5457600080fd5b919050565b60008060408385031215612e6c57600080fd5b612e7583612e3d565b946020939093013593505050565b600080600060608486031215612e9857600080fd5b612ea184612e3d565b9250612eaf60208501612e3d565b9150604084013590509250925092565b80358015158114612e5457600080fd5b600060208284031215612ee157600080fd5b61199482612ebf565b600060208284031215612efc57600080fd5b61199482612e3d565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612f4457612f44612f05565b604052919050565b60006020808385031215612f5f57600080fd5b823567ffffffffffffffff80821115612f7757600080fd5b818501915085601f830112612f8b57600080fd5b813581811115612f9d57612f9d612f05565b8060051b9150612fae848301612f1b565b8181529183018401918481019088841115612fc857600080fd5b938501935b83851015612fed57612fde85612e3d565b82529385019390850190612fcd565b98975050505050505050565b600082601f83011261300a57600080fd5b813567ffffffffffffffff81111561302457613024612f05565b6130376020601f19601f84011601612f1b565b81815284602083860101111561304c57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561307c57600080fd5b61308583612e3d565b9150602083013567ffffffffffffffff8111156130a157600080fd5b6130ad85828601612ff9565b9150509250929050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b611bf684828501612ff9565b60008060006060848603121561310157600080fd5b833567ffffffffffffffff81111561311857600080fd5b61312486828701612ff9565b9660208601359650604090950135949350505050565b6000806040838503121561314d57600080fd5b61315683612e3d565b915061316460208401612ebf565b90509250929050565b6000806000806080858703121561318357600080fd5b61318c85612e3d565b935061319a60208601612e3d565b925060408501359150606085013567ffffffffffffffff8111156131bd57600080fd5b6131c987828801612ff9565b91505092959194509250565b600080604083850312156131e857600080fd5b6131f183612e3d565b915061316460208401612e3d565b600181811c9082168061321357607f821691505b6020821081141561323457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156132625761326261323a565b500390565b6000821982111561327a5761327a61323a565b500190565b634e487b7160e01b600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156132c7576132c761323a565b5060010190565b600083516132e0818460208801612db9565b8351908301906132f4818360208801612db9565b01949350505050565b60006020828403121561330f57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008261333b5761333b613316565b500490565b60008261334f5761334f613316565b500690565b60006001600160a01b038087168352808616602084015250836040830152608060608301526133866080830184612de5565b9695505050505050565b6000602082840312156133a257600080fd5b815161199481612d6e565b600082516133bf818460208701612db9565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220cac8e180de4b99f833dc91100b8a6088da5898d2fb30088ebbd5984524eec0a964736f6c634300080a0033
Deployed Bytecode
0x6080604052600436106101fe5760003560e01c80634f1ef2861161011d5780638b3dcabb116100b0578063a22cb4651161007f578063c87b56dd11610064578063c87b56dd146105ea578063e985e9c51461060a578063f2fde38b1461065457600080fd5b8063a22cb465146105aa578063b88d4fde146105ca57600080fd5b80638b3dcabb146105375780638da5cb5b1461055757806395d89b4114610575578063977d08c01461058a57600080fd5b80636352211e116100ec5780636352211e146104cb57806370a08231146104eb578063715018a61461050b5780637501f7411461052057600080fd5b80634f1ef2861461046357806352d1902d1461047657806355f804b31461048b5780635ce289ba146104ab57600080fd5b80632ec58a301161019557806342842e0e1161016457806342842e0e146103ec57806342966c681461040c578063453c23101461042c5780634ee51a271461044357600080fd5b80632ec58a301461034b578063346de50a1461036b5780633659cfe61461039e5780633950891f146103be57600080fd5b8063095ea7b3116101d1578063095ea7b3146102c657806318160ddd146102e857806323b872dd1461030b57806326412aca1461032b57600080fd5b806301ffc9a71461020357806306fdde031461023857806307ebec271461025a578063081812fc1461028e575b600080fd5b34801561020f57600080fd5b5061022361021e366004612d9c565b610674565b60405190151581526020015b60405180910390f35b34801561024457600080fd5b5061024d610759565b60405161022f9190612e11565b34801561026657600080fd5b5061016254610223907501000000000000000000000000000000000000000000900460ff1681565b34801561029a57600080fd5b506102ae6102a9366004612e24565b6107eb565b6040516001600160a01b03909116815260200161022f565b3480156102d257600080fd5b506102e66102e1366004612e59565b610896565b005b3480156102f457600080fd5b506102fd6109c8565b60405190815260200161022f565b34801561031757600080fd5b506102e6610326366004612e83565b6109d9565b34801561033757600080fd5b506102e6610346366004612ecf565b610a60565b34801561035757600080fd5b506102fd610366366004612eea565b610b05565b34801561037757600080fd5b50610162546102239074010000000000000000000000000000000000000000900460ff1681565b3480156103aa57600080fd5b506102e66103b9366004612eea565b610b2d565b3480156103ca57600080fd5b506102fd6103d9366004612eea565b6101646020526000908152604090205481565b3480156103f857600080fd5b506102e6610407366004612e83565b610ccb565b34801561041857600080fd5b506102e6610427366004612e24565b610ce6565b34801561043857600080fd5b506102fd6101615481565b34801561044f57600080fd5b506102e661045e366004612f4c565b610db1565b6102e6610471366004613069565b610eca565b34801561048257600080fd5b506102fd611055565b34801561049757600080fd5b506102e66104a63660046130b7565b61111a565b3480156104b757600080fd5b506102e66104c6366004612ecf565b611188565b3480156104d757600080fd5b506102ae6104e6366004612e24565b61122e565b3480156104f757600080fd5b506102fd610506366004612eea565b6112b9565b34801561051757600080fd5b506102e6611353565b34801561052c57600080fd5b506102fd6101605481565b34801561054357600080fd5b506102e6610552366004612e24565b6113b9565b34801561056357600080fd5b506097546001600160a01b03166102ae565b34801561058157600080fd5b5061024d61165e565b34801561059657600080fd5b506102e66105a53660046130ec565b61166d565b3480156105b657600080fd5b506102e66105c536600461313a565b61181f565b3480156105d657600080fd5b506102e66105e536600461316d565b61182a565b3480156105f657600080fd5b5061024d610605366004612e24565b6118b2565b34801561061657600080fd5b506102236106253660046131d5565b6001600160a01b0391821660009081526101006020908152604080832093909416825291909152205460ff1690565b34801561066057600080fd5b506102e661066f366004612eea565b61199b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061070757507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061075357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060fb8054610768906131ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610794906131ff565b80156107e15780601f106107b6576101008083540402835291602001916107e1565b820191906000526020600020905b8154815290600101906020018083116107c457829003601f168201915b5050505050905090565b600081815260fd60205260408120546001600160a01b031661087a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b50600090815260ff60205260409020546001600160a01b031690565b60006108a18261122e565b9050806001600160a01b0316836001600160a01b0316141561092b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610871565b336001600160a01b038216148061094757506109478133610625565b6109b95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610871565b6109c38383611a7a565b505050565b60006109d46101635490565b905090565b6109e33382611af5565b610a555760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610871565b6109c3838383611bfe565b6097546001600160a01b03163314610aba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610871565b610162805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6001600160a01b03811660009081526101646020526040812054610161546107539190613250565b306001600160a01b037f00000000000000000000000039554f4116e0425624960d598405be9272107a74161415610bcc5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610871565b7f00000000000000000000000039554f4116e0425624960d598405be9272107a746001600160a01b0316610c277f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610ca35760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610871565b610cac81611dd8565b60408051600080825260208201909252610cc891839190611e32565b50565b6109c38383836040518060200160405280600081525061182a565b610162547501000000000000000000000000000000000000000000900460ff16610d525760405162461bcd60e51b815260206004820152601060248201527f6275726e696e672064697361626c6564000000000000000000000000000000006044820152606401610871565b610d5c3382611af5565b610da85760405162461bcd60e51b815260206004820152601660248201527f6e6f74206f776e6572206e6f7220617070726f766564000000000000000000006044820152606401610871565b610cc881611fd2565b6097546001600160a01b03163314610e0b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610871565b61016054815161016354610e1f9190613267565b1115610e6d5760405162461bcd60e51b815260206004820152601260248201527f4578636565647320746f74616c206d696e7400000000000000000000000000006044820152606401610871565b60005b8151811015610ec657610e8861016380546001019055565b610eb4828281518110610e9d57610e9d61327f565b6020026020010151610eaf6101635490565b61207a565b80610ebe81613295565b915050610e70565b5050565b306001600160a01b037f00000000000000000000000039554f4116e0425624960d598405be9272107a74161415610f695760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610871565b7f00000000000000000000000039554f4116e0425624960d598405be9272107a746001600160a01b0316610fc47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146110405760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610871565b61104982611dd8565b610ec682826001611e32565b6000306001600160a01b037f00000000000000000000000039554f4116e0425624960d598405be9272107a7416146110f55760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610871565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b6097546001600160a01b031633146111745760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610871565b8051610ec69061015f906020840190612cd5565b6097546001600160a01b031633146111e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610871565b61016280549115157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff909216919091179055565b600081815260fd60205260408120546001600160a01b0316806107535760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610871565b60006001600160a01b0382166113375760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610871565b506001600160a01b0316600090815260fe602052604090205490565b6097546001600160a01b031633146113ad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610871565b6113b76000612094565b565b600261012d54141561140d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610871565b600261012d556101625474010000000000000000000000000000000000000000900460ff166114a35760405162461bcd60e51b8152602060048201526024808201527f4d696e74696e67206973206e6f742061637469766520617420746865206d6f6d60448201527f656e742e000000000000000000000000000000000000000000000000000000006064820152608401610871565b600081116114f35760405162461bcd60e51b815260206004820152601360248201527f43616e2774206d696e74203020746f6b656e73000000000000000000000000006044820152606401610871565b61016054816115026101635490565b61150c9190613267565b111561155a5760405162461bcd60e51b815260206004820152601360248201527f546f74616c206d696e74206578636565646564000000000000000000000000006044820152606401610871565b61016154336000908152610164602052604090205461157a908390613267565b11156115c85760405162461bcd60e51b815260206004820152601860248201527f43616e206e6f74206d696e74206d6f7265207468616e203300000000000000006044820152606401610871565b60005b81811015611602576115e261016380546001019055565b6115f033610eaf6101635490565b806115fa81613295565b9150506115cb565b50336000908152610164602052604081208054839290611623908490613267565b9091555050604051819033907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590600090a350600161012d55565b606060fc8054610768906131ff565b600054610100900460ff166116885760005460ff161561168c565b303b155b6116fe5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610871565b600054610100900460ff1615801561173d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b6117456120f3565b61174d61215e565b6117c16040518060400160405280600481526020017f506f6f68000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f504f4f48000000000000000000000000000000000000000000000000000000008152506121d1565b6117c9612246565b83516117dd9061015f906020870190612cd5565b50610160839055610161829055801561181957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50505050565b610ec63383836122b9565b6118343383611af5565b6118a65760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610871565b611819848484846123a7565b600081815260fd60205260409020546060906001600160a01b031661193f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610871565b6000611949612430565b905060008151116119695760405180602001604052806000815250611994565b8061197384612440565b6040516020016119849291906132ce565b6040516020818303038152906040525b9392505050565b6097546001600160a01b031633146119f55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610871565b6001600160a01b038116611a715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610871565b610cc881612094565b600081815260ff60205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091558190611abc8261122e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081815260fd60205260408120546001600160a01b0316611b7f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610871565b6000611b8a8361122e565b9050806001600160a01b0316846001600160a01b03161480611bc55750836001600160a01b0316611bba846107eb565b6001600160a01b0316145b80611bf657506001600160a01b038082166000908152610100602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611c118261122e565b6001600160a01b031614611c8d5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610871565b6001600160a01b038216611d085760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610871565b611d13600082611a7a565b6001600160a01b038316600090815260fe60205260408120805460019290611d3c908490613250565b90915550506001600160a01b038216600090815260fe60205260408120805460019290611d6a908490613267565b9091555050600081815260fd6020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6097546001600160a01b03163314610cc85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610871565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611e65576109c383612572565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611ebf575060408051601f3d908101601f19168201909252611ebc918101906132fd565b60015b611f315760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610871565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114611fc65760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610871565b506109c383838361263d565b6000611fdd8261122e565b9050611fea600083611a7a565b6001600160a01b038116600090815260fe60205260408120805460019290612013908490613250565b9091555050600082815260fd6020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b610ec6828260405180602001604052806000815250612662565b609780546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166113b75760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610871565b600054610100900460ff166121c95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610871565b6113b76126eb565b600054610100900460ff1661223c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610871565b610ec6828261275f565b600054610100900460ff166122b15760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610871565b6113b76127f1565b816001600160a01b0316836001600160a01b0316141561231b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610871565b6001600160a01b038381166000818152610100602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6123b2848484611bfe565b6123be84848484612864565b6118195760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610871565b606061015f8054610768906131ff565b60608161248057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156124aa578061249481613295565b91506124a39050600a8361332c565b9150612484565b60008167ffffffffffffffff8111156124c5576124c5612f05565b6040519080825280601f01601f1916602001820160405280156124ef576020820181803683370190505b5090505b8415611bf657612504600183613250565b9150612511600a86613340565b61251c906030613267565b60f81b8183815181106125315761253161327f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061256b600a8661332c565b94506124f3565b6001600160a01b0381163b6125ef5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610871565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b61264683612a02565b6000825111806126535750805b156109c3576118198383612a42565b61266c8383612b4d565b6126796000848484612864565b6109c35760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610871565b600054610100900460ff166127565760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610871565b6113b733612094565b600054610100900460ff166127ca5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610871565b81516127dd9060fb906020850190612cd5565b5080516109c39060fc906020840190612cd5565b600054610100900460ff1661285c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610871565b600161012d55565b60006001600160a01b0384163b156129f7576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906128c1903390899088908890600401613354565b6020604051808303816000875af19250505080156128fc575060408051601f3d908101601f191682019092526128f991810190613390565b60015b6129ac573d80801561292a576040519150601f19603f3d011682016040523d82523d6000602084013e61292f565b606091505b5080516129a45760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610871565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611bf6565b506001949350505050565b612a0b81612572565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b612ac15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401610871565b600080846001600160a01b031684604051612adc91906133ad565b600060405180830381855af49150503d8060008114612b17576040519150601f19603f3d011682016040523d82523d6000602084013e612b1c565b606091505b5091509150612b4482826040518060600160405280602781526020016133ca60279139612c9c565b95945050505050565b6001600160a01b038216612ba35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610871565b600081815260fd60205260409020546001600160a01b031615612c085760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610871565b6001600160a01b038216600090815260fe60205260408120805460019290612c31908490613267565b9091555050600081815260fd6020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60608315612cab575081611994565b825115612cbb5782518084602001fd5b8160405162461bcd60e51b81526004016108719190612e11565b828054612ce1906131ff565b90600052602060002090601f016020900481019282612d035760008555612d49565b82601f10612d1c57805160ff1916838001178555612d49565b82800160010185558215612d49579182015b82811115612d49578251825591602001919060010190612d2e565b50612d55929150612d59565b5090565b5b80821115612d555760008155600101612d5a565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610cc857600080fd5b600060208284031215612dae57600080fd5b813561199481612d6e565b60005b83811015612dd4578181015183820152602001612dbc565b838111156118195750506000910152565b60008151808452612dfd816020860160208601612db9565b601f01601f19169290920160200192915050565b6020815260006119946020830184612de5565b600060208284031215612e3657600080fd5b5035919050565b80356001600160a01b0381168114612e5457600080fd5b919050565b60008060408385031215612e6c57600080fd5b612e7583612e3d565b946020939093013593505050565b600080600060608486031215612e9857600080fd5b612ea184612e3d565b9250612eaf60208501612e3d565b9150604084013590509250925092565b80358015158114612e5457600080fd5b600060208284031215612ee157600080fd5b61199482612ebf565b600060208284031215612efc57600080fd5b61199482612e3d565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612f4457612f44612f05565b604052919050565b60006020808385031215612f5f57600080fd5b823567ffffffffffffffff80821115612f7757600080fd5b818501915085601f830112612f8b57600080fd5b813581811115612f9d57612f9d612f05565b8060051b9150612fae848301612f1b565b8181529183018401918481019088841115612fc857600080fd5b938501935b83851015612fed57612fde85612e3d565b82529385019390850190612fcd565b98975050505050505050565b600082601f83011261300a57600080fd5b813567ffffffffffffffff81111561302457613024612f05565b6130376020601f19601f84011601612f1b565b81815284602083860101111561304c57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561307c57600080fd5b61308583612e3d565b9150602083013567ffffffffffffffff8111156130a157600080fd5b6130ad85828601612ff9565b9150509250929050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b611bf684828501612ff9565b60008060006060848603121561310157600080fd5b833567ffffffffffffffff81111561311857600080fd5b61312486828701612ff9565b9660208601359650604090950135949350505050565b6000806040838503121561314d57600080fd5b61315683612e3d565b915061316460208401612ebf565b90509250929050565b6000806000806080858703121561318357600080fd5b61318c85612e3d565b935061319a60208601612e3d565b925060408501359150606085013567ffffffffffffffff8111156131bd57600080fd5b6131c987828801612ff9565b91505092959194509250565b600080604083850312156131e857600080fd5b6131f183612e3d565b915061316460208401612e3d565b600181811c9082168061321357607f821691505b6020821081141561323457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156132625761326261323a565b500390565b6000821982111561327a5761327a61323a565b500190565b634e487b7160e01b600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156132c7576132c761323a565b5060010190565b600083516132e0818460208801612db9565b8351908301906132f4818360208801612db9565b01949350505050565b60006020828403121561330f57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008261333b5761333b613316565b500490565b60008261334f5761334f613316565b500690565b60006001600160a01b038087168352808616602084015250836040830152608060608301526133866080830184612de5565b9695505050505050565b6000602082840312156133a257600080fd5b815161199481612d6e565b600082516133bf818460208701612db9565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220cac8e180de4b99f833dc91100b8a6088da5898d2fb30088ebbd5984524eec0a964736f6c634300080a0033
Deployed Bytecode Sourcemap
62627:3929:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45993:349;;;;;;;;;;-1:-1:-1;45993:349:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;45993:349:0;;;;;;;;46982:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;63113:25::-;;;;;;;;;;-1:-1:-1;63113:25:0;;;;;;;;;;;48552:221;;;;;;;;;;-1:-1:-1;48552:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1797:55:1;;;1779:74;;1767:2;1752:18;48552:221:0;1633:226:1;48064:422:0;;;;;;;;;;-1:-1:-1;48064:422:0;;;;;:::i;:::-;;:::i;:::-;;66118:105;;;;;;;;;;;;;:::i;:::-;;;2470:25:1;;;2458:2;2443:18;66118:105:0;2324:177:1;49302:339:0;;;;;;;;;;-1:-1:-1;49302:339:0;;;;;:::i;:::-;;:::i;63919:95::-;;;;;;;;;;-1:-1:-1;63919:95:0;;;;;:::i;:::-;;:::i;65884:136::-;;;;;;;;;;-1:-1:-1;65884:136:0;;;;;:::i;:::-;;:::i;63051:25::-;;;;;;;;;;-1:-1:-1;63051:25:0;;;;;;;;;;;27203:200;;;;;;;;;;-1:-1:-1;27203:200:0;;;;;:::i;:::-;;:::i;63353:48::-;;;;;;;;;;-1:-1:-1;63353:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;49712:185;;;;;;;;;;-1:-1:-1;49712:185:0;;;;;:::i;:::-;;:::i;65548:248::-;;;;;;;;;;-1:-1:-1;65548:248:0;;;;;:::i;:::-;;:::i;62931:27::-;;;;;;;;;;;;;;;;65208:332;;;;;;;;;;-1:-1:-1;65208:332:0;;;;;:::i;:::-;;:::i;27662:225::-;;;;;;:::i;:::-;;:::i;26881:133::-;;;;;;;;;;;;;:::i;64111:92::-;;;;;;;;;;-1:-1:-1;64111:92:0;;;;;:::i;:::-;;:::i;64260:111::-;;;;;;;;;;-1:-1:-1;64260:111:0;;;;;:::i;:::-;;:::i;46676:239::-;;;;;;;;;;-1:-1:-1;46676:239:0;;;;;:::i;:::-;;:::i;46406:208::-;;;;;;;;;;-1:-1:-1;46406:208:0;;;;;:::i;:::-;;:::i;33663:103::-;;;;;;;;;;;;;:::i;62902:22::-;;;;;;;;;;;;;;;;64420:734;;;;;;;;;;-1:-1:-1;64420:734:0;;;;;:::i;:::-;;:::i;33012:87::-;;;;;;;;;;-1:-1:-1;33085:6:0;;-1:-1:-1;;;;;33085:6:0;33012:87;;47151:104;;;;;;;;;;;;;:::i;63496:372::-;;;;;;;;;;-1:-1:-1;63496:372:0;;;;;:::i;:::-;;:::i;48845:155::-;;;;;;;;;;-1:-1:-1;48845:155:0;;;;;:::i;:::-;;:::i;49968:328::-;;;;;;;;;;-1:-1:-1;49968:328:0;;;;;:::i;:::-;;:::i;47326:334::-;;;;;;;;;;-1:-1:-1;47326:334:0;;;;;:::i;:::-;;:::i;49071:164::-;;;;;;;;;;-1:-1:-1;49071:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;49192:25:0;;;49168:4;49192:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;49071:164;33921:201;;;;;;;;;;-1:-1:-1;33921:201:0;;;;;:::i;:::-;;:::i;45993:349::-;46117:4;46154:51;;;46169:36;46154:51;;:127;;-1:-1:-1;46222:59:0;;;46237:44;46222:59;46154:127;:180;;;-1:-1:-1;37875:36:0;37860:51;;;;46298:36;46134:200;45993:349;-1:-1:-1;;45993:349:0:o;46982:100::-;47036:13;47069:5;47062:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46982:100;:::o;48552:221::-;48628:7;51895:16;;;:7;:16;;;;;;-1:-1:-1;;;;;51895:16:0;48648:73;;;;-1:-1:-1;;;48648:73:0;;8538:2:1;48648:73:0;;;8520:21:1;8577:2;8557:18;;;8550:30;8616:34;8596:18;;;8589:62;8687:14;8667:18;;;8660:42;8719:19;;48648:73:0;;;;;;;;;-1:-1:-1;48741:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;48741:24:0;;48552:221::o;48064:422::-;48145:13;48161:34;48187:7;48161:25;:34::i;:::-;48145:50;;48220:5;-1:-1:-1;;;;;48214:11:0;:2;-1:-1:-1;;;;;48214:11:0;;;48206:57;;;;-1:-1:-1;;;48206:57:0;;8951:2:1;48206:57:0;;;8933:21:1;8990:2;8970:18;;;8963:30;9029:34;9009:18;;;9002:62;9100:3;9080:18;;;9073:31;9121:19;;48206:57:0;8749:397:1;48206:57:0;29475:10;-1:-1:-1;;;;;48298:21:0;;;;:62;;-1:-1:-1;48323:37:0;48340:5;29475:10;49071:164;:::i;48323:37::-;48276:168;;;;-1:-1:-1;;;48276:168:0;;9353:2:1;48276:168:0;;;9335:21:1;9392:2;9372:18;;;9365:30;9431:34;9411:18;;;9404:62;9502:26;9482:18;;;9475:54;9546:19;;48276:168:0;9151:420:1;48276:168:0;48457:21;48466:2;48470:7;48457:8;:21::i;:::-;48134:352;48064:422;;:::o;66118:105::-;66164:7;66191:24;:14;35612;;35520:114;66191:24;66184:31;;66118:105;:::o;49302:339::-;49497:41;29475:10;49530:7;49497:18;:41::i;:::-;49489:103;;;;-1:-1:-1;;;49489:103:0;;9778:2:1;49489:103:0;;;9760:21:1;9817:2;9797:18;;;9790:30;9856:34;9836:18;;;9829:62;9927:19;9907:18;;;9900:47;9964:19;;49489:103:0;9576:413:1;49489:103:0;49605:28;49615:4;49621:2;49625:7;49605:9;:28::i;63919:95::-;33085:6;;-1:-1:-1;;;;;33085:6:0;29475:10;33232:23;33224:68;;;;-1:-1:-1;;;33224:68:0;;10196:2:1;33224:68:0;;;10178:21:1;;;10215:18;;;10208:30;10274:34;10254:18;;;10247:62;10326:18;;33224:68:0;9994:356:1;33224:68:0;63984:13:::1;:22:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;63919:95::o;65884:136::-;-1:-1:-1;;;;;65989:23:0;;65947:7;65989:23;;;:13;:23;;;;;;65974:12;;:38;;65989:23;65974:38;:::i;27203:200::-;25744:4;-1:-1:-1;;;;;25753:6:0;25736:23;;;25728:80;;;;-1:-1:-1;;;25728:80:0;;10876:2:1;25728:80:0;;;10858:21:1;10915:2;10895:18;;;10888:30;10954:34;10934:18;;;10927:62;11025:14;11005:18;;;10998:42;11057:19;;25728:80:0;10674:408:1;25728:80:0;25851:6;-1:-1:-1;;;;;25827:30:0;:20;16610:66;16971:65;-1:-1:-1;;;;;16971:65:0;;16891:153;25827:20;-1:-1:-1;;;;;25827:30:0;;25819:87;;;;-1:-1:-1;;;25819:87:0;;11289:2:1;25819:87:0;;;11271:21:1;11328:2;11308:18;;;11301:30;11367:34;11347:18;;;11340:62;11438:14;11418:18;;;11411:42;11470:19;;25819:87:0;11087:408:1;25819:87:0;27287:36:::1;27305:17;27287;:36::i;:::-;27375:12;::::0;;27385:1:::1;27375:12:::0;;;::::1;::::0;::::1;::::0;;;27334:61:::1;::::0;27356:17;;27375:12;27334:21:::1;:61::i;:::-;27203:200:::0;:::o;49712:185::-;49850:39;49867:4;49873:2;49877:7;49850:39;;;;;;;;;;;;:16;:39::i;65548:248::-;65607:13;;;;;;;65599:42;;;;-1:-1:-1;;;65599:42:0;;11702:2:1;65599:42:0;;;11684:21:1;11741:2;11721:18;;;11714:30;11780:18;11760;;;11753:46;11816:18;;65599:42:0;11500:340:1;65599:42:0;65674:39;65693:10;65705:7;65674:18;:39::i;:::-;65652:111;;;;-1:-1:-1;;;65652:111:0;;12047:2:1;65652:111:0;;;12029:21:1;12086:2;12066:18;;;12059:30;12125:24;12105:18;;;12098:52;12167:18;;65652:111:0;11845:346:1;65652:111:0;65774:14;65780:7;65774:5;:14::i;65208:332::-;33085:6;;-1:-1:-1;;;;;33085:6:0;29475:10;33232:23;33224:68;;;;-1:-1:-1;;;33224:68:0;;10196:2:1;33224:68:0;;;10178:21:1;;;10215:18;;;10208:30;10274:34;10254:18;;;10247:62;10326:18;;33224:68:0;9994:356:1;33224:68:0;65336:7:::1;::::0;65320:12;;65293:14:::1;35612::::0;65293:39:::1;;;;:::i;:::-;:50;;65285:81;;;::::0;-1:-1:-1;;;65285:81:0;;12531:2:1;65285:81:0::1;::::0;::::1;12513:21:1::0;12570:2;12550:18;;;12543:30;12609:20;12589:18;;;12582:48;12647:18;;65285:81:0::1;12329:342:1::0;65285:81:0::1;65382:9;65377:156;65401:5;:12;65397:1;:16;65377:156;;;65435:26;:14;35731:19:::0;;35749:1;35731:19;;;35642:127;65435:26:::1;65476:45;65486:5;65492:1;65486:8;;;;;;;;:::i;:::-;;;;;;;65496:24;:14;35612::::0;;35520:114;65496:24:::1;65476:9;:45::i;:::-;65415:3:::0;::::1;::::0;::::1;:::i;:::-;;;;65377:156;;;;65208:332:::0;:::o;27662:225::-;25744:4;-1:-1:-1;;;;;25753:6:0;25736:23;;;25728:80;;;;-1:-1:-1;;;25728:80:0;;10876:2:1;25728:80:0;;;10858:21:1;10915:2;10895:18;;;10888:30;10954:34;10934:18;;;10927:62;11025:14;11005:18;;;10998:42;11057:19;;25728:80:0;10674:408:1;25728:80:0;25851:6;-1:-1:-1;;;;;25827:30:0;:20;16610:66;16971:65;-1:-1:-1;;;;;16971:65:0;;16891:153;25827:20;-1:-1:-1;;;;;25827:30:0;;25819:87;;;;-1:-1:-1;;;25819:87:0;;11289:2:1;25819:87:0;;;11271:21:1;11328:2;11308:18;;;11301:30;11367:34;11347:18;;;11340:62;11438:14;11418:18;;;11411:42;11470:19;;25819:87:0;11087:408:1;25819:87:0;27780:36:::1;27798:17;27780;:36::i;:::-;27827:52;27849:17;27868:4;27874;27827:21;:52::i;26881:133::-:0;26959:7;26189:4;-1:-1:-1;;;;;26198:6:0;26181:23;;26173:92;;;;-1:-1:-1;;;26173:92:0;;13267:2:1;26173:92:0;;;13249:21:1;13306:2;13286:18;;;13279:30;13345:34;13325:18;;;13318:62;13416:26;13396:18;;;13389:54;13460:19;;26173:92:0;13065:420:1;26173:92:0;-1:-1:-1;16610:66:0::1;26881:133:::0;:::o;64111:92::-;33085:6;;-1:-1:-1;;;;;33085:6:0;29475:10;33232:23;33224:68;;;;-1:-1:-1;;;33224:68:0;;10196:2:1;33224:68:0;;;10178:21:1;;;10215:18;;;10208:30;10274:34;10254:18;;;10247:62;10326:18;;33224:68:0;9994:356:1;33224:68:0;64181:14;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;64260:111::-:0;33085:6;;-1:-1:-1;;;;;33085:6:0;29475:10;33232:23;33224:68;;;;-1:-1:-1;;;33224:68:0;;10196:2:1;33224:68:0;;;10178:21:1;;;10215:18;;;10208:30;10274:34;10254:18;;;10247:62;10326:18;;33224:68:0;9994:356:1;33224:68:0;64333:13:::1;:30:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;64260:111::o;46676:239::-;46748:7;46784:16;;;:7;:16;;;;;;-1:-1:-1;;;;;46784:16:0;46819:19;46811:73;;;;-1:-1:-1;;;46811:73:0;;13692:2:1;46811:73:0;;;13674:21:1;13731:2;13711:18;;;13704:30;13770:34;13750:18;;;13743:62;13841:11;13821:18;;;13814:39;13870:19;;46811:73:0;13490:405:1;46406:208:0;46478:7;-1:-1:-1;;;;;46506:19:0;;46498:74;;;;-1:-1:-1;;;46498:74:0;;14102:2:1;46498:74:0;;;14084:21:1;14141:2;14121:18;;;14114:30;14180:34;14160:18;;;14153:62;14251:12;14231:18;;;14224:40;14281:19;;46498:74:0;13900:406:1;46498:74:0;-1:-1:-1;;;;;;46590:16:0;;;;;:9;:16;;;;;;;46406:208::o;33663:103::-;33085:6;;-1:-1:-1;;;;;33085:6:0;29475:10;33232:23;33224:68;;;;-1:-1:-1;;;33224:68:0;;10196:2:1;33224:68:0;;;10178:21:1;;;10215:18;;;10208:30;10274:34;10254:18;;;10247:62;10326:18;;33224:68:0;9994:356:1;33224:68:0;33728:30:::1;33755:1;33728:18;:30::i;:::-;33663:103::o:0;64420:734::-;61205:1;61980:7;;:19;;61972:63;;;;-1:-1:-1;;;61972:63:0;;14513:2:1;61972:63:0;;;14495:21:1;14552:2;14532:18;;;14525:30;14591:33;14571:18;;;14564:61;14642:18;;61972:63:0;14311:355:1;61972:63:0;61205:1;62113:7;:18;64495:13:::1;::::0;;;::::1;;;64487:62;;;::::0;-1:-1:-1;;;64487:62:0;;14873:2:1;64487:62:0::1;::::0;::::1;14855:21:1::0;14912:2;14892:18;;;14885:30;14951:34;14931:18;;;14924:62;15022:6;15002:18;;;14995:34;15046:19;;64487:62:0::1;14671:400:1::0;64487:62:0::1;64577:1;64568:6;:10;64560:42;;;::::0;-1:-1:-1;;;64560:42:0;;15278:2:1;64560:42:0::1;::::0;::::1;15260:21:1::0;15317:2;15297:18;;;15290:30;15356:21;15336:18;;;15329:49;15395:18;;64560:42:0::1;15076:343:1::0;64560:42:0::1;64672:7;;64662:6;64635:24;:14;35612::::0;;35520:114;64635:24:::1;:33;;;;:::i;:::-;:44;;64613:113;;;::::0;-1:-1:-1;;;64613:113:0;;15626:2:1;64613:113:0::1;::::0;::::1;15608:21:1::0;15665:2;15645:18;;;15638:30;15704:21;15684:18;;;15677:49;15743:18;;64613:113:0::1;15424:343:1::0;64613:113:0::1;64799:12;::::0;29475:10;64759:27:::1;::::0;;;:13:::1;:27;::::0;;;;;:36:::1;::::0;64789:6;;64759:36:::1;:::i;:::-;:52;;64737:126;;;::::0;-1:-1:-1;;;64737:126:0;;15974:2:1;64737:126:0::1;::::0;::::1;15956:21:1::0;16013:2;15993:18;;;15986:30;16052:26;16032:18;;;16025:54;16096:18;;64737:126:0::1;15772:348:1::0;64737:126:0::1;64914:9;64909:152;64933:6;64929:1;:10;64909:152;;;64961:26;:14;35731:19:::0;;35749:1;35731:19;;;35642:127;64961:26:::1;65002:47;65012:10;65024:24;:14;35612::::0;;35520:114;65002:47:::1;64941:3:::0;::::1;::::0;::::1;:::i;:::-;;;;64909:152;;;-1:-1:-1::0;65085:10:0::1;65071:25;::::0;;;:13:::1;:25;::::0;;;;:35;;65100:6;;65071:25;:35:::1;::::0;65100:6;;65071:35:::1;:::i;:::-;::::0;;;-1:-1:-1;;65122:24:0::1;::::0;65139:6;;65127:10:::1;::::0;65122:24:::1;::::0;;;::::1;-1:-1:-1::0;61161:1:0;62292:7;:22;64420:734::o;47151:104::-;47207:13;47240:7;47233:14;;;;;:::i;63496:372::-;4645:13;;;;;;;:48;;4681:12;;;;4680:13;4645:48;;;5448:4;7210:19;:23;4661:16;4637:107;;;;-1:-1:-1;;;4637:107:0;;16327:2:1;4637:107:0;;;16309:21:1;16366:2;16346:18;;;16339:30;16405:34;16385:18;;;16378:62;16476:16;16456:18;;;16449:44;16510:19;;4637:107:0;16125:410:1;4637:107:0;4757:19;4780:13;;;;;;4779:14;4804:101;;;;4839:13;:20;;4874:19;;;;;;4804:101;63641:24:::1;:22;:24::i;:::-;63676:16;:14;:16::i;:::-;63703:29;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;::::0;:13:::1;:29::i;:::-;63743:24;:22;:24::i;:::-;63778:14:::0;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;63803:7:0::1;:18:::0;;;63832:12:::1;:28:::0;;;4931:68;;;;4982:5;4966:21;;;;;;4931:68;4352:654;63496:372;;;:::o;48845:155::-;48940:52;29475:10;48973:8;48983;48940:18;:52::i;49968:328::-;50143:41;29475:10;50176:7;50143:18;:41::i;:::-;50135:103;;;;-1:-1:-1;;;50135:103:0;;9778:2:1;50135:103:0;;;9760:21:1;9817:2;9797:18;;;9790:30;9856:34;9836:18;;;9829:62;9927:19;9907:18;;;9900:47;9964:19;;50135:103:0;9576:413:1;50135:103:0;50249:39;50263:4;50269:2;50273:7;50282:5;50249:13;:39::i;47326:334::-;51871:4;51895:16;;;:7;:16;;;;;;47399:13;;-1:-1:-1;;;;;51895:16:0;47425:76;;;;-1:-1:-1;;;47425:76:0;;16742:2:1;47425:76:0;;;16724:21:1;16781:2;16761:18;;;16754:30;16820:34;16800:18;;;16793:62;16891:17;16871:18;;;16864:45;16926:19;;47425:76:0;16540:411:1;47425:76:0;47514:21;47538:10;:8;:10::i;:::-;47514:34;;47590:1;47572:7;47566:21;:25;:86;;;;;;;;;;;;;;;;;47618:7;47627:18;:7;:16;:18::i;:::-;47601:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47566:86;47559:93;47326:334;-1:-1:-1;;;47326:334:0:o;33921:201::-;33085:6;;-1:-1:-1;;;;;33085:6:0;29475:10;33232:23;33224:68;;;;-1:-1:-1;;;33224:68:0;;10196:2:1;33224:68:0;;;10178:21:1;;;10215:18;;;10208:30;10274:34;10254:18;;;10247:62;10326:18;;33224:68:0;9994:356:1;33224:68:0;-1:-1:-1;;;;;34010:22:0;::::1;34002:73;;;::::0;-1:-1:-1;;;34002:73:0;;17633:2:1;34002:73:0::1;::::0;::::1;17615:21:1::0;17672:2;17652:18;;;17645:30;17711:34;17691:18;;;17684:62;17782:8;17762:18;;;17755:36;17808:19;;34002:73:0::1;17431:402:1::0;34002:73:0::1;34086:28;34105:8;34086:18;:28::i;55985:185::-:0;56060:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;56060:29:0;-1:-1:-1;;;;;56060:29:0;;;;;;;;:24;;56114:34;56060:24;56114:25;:34::i;:::-;-1:-1:-1;;;;;56105:57:0;;;;;;;;;;;55985:185;;:::o;52100:359::-;52193:4;51895:16;;;:7;:16;;;;;;-1:-1:-1;;;;;51895:16:0;52210:73;;;;-1:-1:-1;;;52210:73:0;;18040:2:1;52210:73:0;;;18022:21:1;18079:2;18059:18;;;18052:30;18118:34;18098:18;;;18091:62;18189:14;18169:18;;;18162:42;18221:19;;52210:73:0;17838:408:1;52210:73:0;52294:13;52310:34;52336:7;52310:25;:34::i;:::-;52294:50;;52374:5;-1:-1:-1;;;;;52363:16:0;:7;-1:-1:-1;;;;;52363:16:0;;:51;;;;52407:7;-1:-1:-1;;;;;52383:31:0;:20;52395:7;52383:11;:20::i;:::-;-1:-1:-1;;;;;52383:31:0;;52363:51;:87;;;-1:-1:-1;;;;;;49192:25:0;;;49168:4;49192:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;52418:32;52355:96;52100:359;-1:-1:-1;;;;52100:359:0:o;55231:636::-;55401:4;-1:-1:-1;;;;;55363:42:0;:34;55389:7;55363:25;:34::i;:::-;-1:-1:-1;;;;;55363:42:0;;55355:92;;;;-1:-1:-1;;;55355:92:0;;18453:2:1;55355:92:0;;;18435:21:1;18492:2;18472:18;;;18465:30;18531:34;18511:18;;;18504:62;18602:7;18582:18;;;18575:35;18627:19;;55355:92:0;18251:401:1;55355:92:0;-1:-1:-1;;;;;55466:16:0;;55458:65;;;;-1:-1:-1;;;55458:65:0;;18859:2:1;55458:65:0;;;18841:21:1;18898:2;18878:18;;;18871:30;18937:34;18917:18;;;18910:62;19008:6;18988:18;;;18981:34;19032:19;;55458:65:0;18657:400:1;55458:65:0;55640:29;55657:1;55661:7;55640:8;:29::i;:::-;-1:-1:-1;;;;;55682:15:0;;;;;;:9;:15;;;;;:20;;55701:1;;55682:15;:20;;55701:1;;55682:20;:::i;:::-;;;;-1:-1:-1;;;;;;;55713:13:0;;;;;;:9;:13;;;;;:18;;55730:1;;55713:13;:18;;55730:1;;55713:18;:::i;:::-;;;;-1:-1:-1;;55742:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;55742:21:0;-1:-1:-1;;;;;55742:21:0;;;;;;;;;55781:27;;55742:16;;55781:27;;;;;;;48134:352;48064:422;;:::o;66276:116::-;33085:6;;-1:-1:-1;;;;;33085:6:0;29475:10;33232:23;33224:68;;;;-1:-1:-1;;;33224:68:0;;10196:2:1;33224:68:0;;;10178:21:1;;;10215:18;;;10208:30;10274:34;10254:18;;;10247:62;10326:18;;33224:68:0;9994:356:1;18309:992:0;16262:66;18763:59;;;18759:535;;;18839:37;18858:17;18839:18;:37::i;18759:535::-;18942:17;-1:-1:-1;;;;;18913:61:0;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18913:63:0;;;;;;;;-1:-1:-1;;18913:63:0;;;;;;;;;;;;:::i;:::-;;;18909:306;;19143:56;;-1:-1:-1;;;19143:56:0;;19453:2:1;19143:56:0;;;19435:21:1;19492:2;19472:18;;;19465:30;19531:34;19511:18;;;19504:62;19602:16;19582:18;;;19575:44;19636:19;;19143:56:0;19251:410:1;18909:306:0;16610:66;19027:28;;19019:82;;;;-1:-1:-1;;;19019:82:0;;19868:2:1;19019:82:0;;;19850:21:1;19907:2;19887:18;;;19880:30;19946:34;19926:18;;;19919:62;20017:11;19997:18;;;19990:39;20046:19;;19019:82:0;19666:405:1;19019:82:0;18977:140;19229:53;19247:17;19266:4;19272:9;19229:17;:53::i;54463:431::-;54523:13;54539:34;54565:7;54539:25;:34::i;:::-;54523:50;;54675:29;54692:1;54696:7;54675:8;:29::i;:::-;-1:-1:-1;;;;;54717:16:0;;;;;;:9;:16;;;;;:21;;54737:1;;54717:16;:21;;54737:1;;54717:21;:::i;:::-;;;;-1:-1:-1;;54756:16:0;;;;:7;:16;;;;;;54749:23;;-1:-1:-1;;54749:23:0;;;54790:36;54764:7;;54756:16;-1:-1:-1;;;;;54790:36:0;;;;;54756:16;;54790:36;65377:156:::1;65208:332:::0;:::o;52801:110::-;52877:26;52887:2;52891:7;52877:26;;;;;;;;;;;;:9;:26::i;34282:191::-;34375:6;;;-1:-1:-1;;;;;34392:17:0;;;-1:-1:-1;;34392:17:0;;;;;;;34425:40;;34375:6;;;34392:17;34375:6;;34425:40;;34356:16;;34425:40;34345:128;34282:191;:::o;24881:68::-;5248:13;;;;;;;5240:69;;;;-1:-1:-1;;;5240:69:0;;20278:2:1;5240:69:0;;;20260:21:1;20317:2;20297:18;;;20290:30;20356:34;20336:18;;;20329:62;-1:-1:-1;;;20407:18:1;;;20400:41;20458:19;;5240:69:0;20076:407:1;32713:97:0;5248:13;;;;;;;5240:69;;;;-1:-1:-1;;;5240:69:0;;20278:2:1;5240:69:0;;;20260:21:1;20317:2;20297:18;;;20290:30;20356:34;20336:18;;;20329:62;-1:-1:-1;;;20407:18:1;;;20400:41;20458:19;;5240:69:0;20076:407:1;5240:69:0;32776:26:::1;:24;:26::i;45599:151::-:0;5248:13;;;;;;;5240:69;;;;-1:-1:-1;;;5240:69:0;;20278:2:1;5240:69:0;;;20260:21:1;20317:2;20297:18;;;20290:30;20356:34;20336:18;;;20329:62;-1:-1:-1;;;20407:18:1;;;20400:41;20458:19;;5240:69:0;20076:407:1;5240:69:0;45703:39:::1;45727:5;45734:7;45703:23;:39::i;61247:113::-:0;5248:13;;;;;;;5240:69;;;;-1:-1:-1;;;5240:69:0;;20278:2:1;5240:69:0;;;20260:21:1;20317:2;20297:18;;;20290:30;20356:34;20336:18;;;20329:62;-1:-1:-1;;;20407:18:1;;;20400:41;20458:19;;5240:69:0;20076:407:1;5240:69:0;61318:34:::1;:32;:34::i;56312:315::-:0;56467:8;-1:-1:-1;;;;;56458:17:0;:5;-1:-1:-1;;;;;56458:17:0;;;56450:55;;;;-1:-1:-1;;;56450:55:0;;20690:2:1;56450:55:0;;;20672:21:1;20729:2;20709:18;;;20702:30;20768:27;20748:18;;;20741:55;20813:18;;56450:55:0;20488:349:1;56450:55:0;-1:-1:-1;;;;;56516:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;56578:41;;586::1;;;56578::0;;559:18:1;56578:41:0;;;;;;;56312:315;;;:::o;51178:::-;51335:28;51345:4;51351:2;51355:7;51335:9;:28::i;:::-;51382:48;51405:4;51411:2;51415:7;51424:5;51382:22;:48::i;:::-;51374:111;;;;-1:-1:-1;;;51374:111:0;;21044:2:1;51374:111:0;;;21026:21:1;21083:2;21063:18;;;21056:30;21122:34;21102:18;;;21095:62;21193:20;21173:18;;;21166:48;21231:19;;51374:111:0;20842:414:1;66445:108:0;66505:13;66538:7;66531:14;;;;;:::i;30144:723::-;30200:13;30421:10;30417:53;;-1:-1:-1;;30448:10:0;;;;;;;;;;;;;;;;;;30144:723::o;30417:53::-;30495:5;30480:12;30536:78;30543:9;;30536:78;;30569:8;;;;:::i;:::-;;-1:-1:-1;30592:10:0;;-1:-1:-1;30600:2:0;30592:10;;:::i;:::-;;;30536:78;;;30624:19;30656:6;30646:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30646:17:0;;30624:39;;30674:154;30681:10;;30674:154;;30708:11;30718:1;30708:11;;:::i;:::-;;-1:-1:-1;30777:10:0;30785:2;30777:5;:10;:::i;:::-;30764:24;;:2;:24;:::i;:::-;30751:39;;30734:6;30741;30734:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;30805:11:0;30814:2;30805:11;;:::i;:::-;;;30674:154;;17140:284;-1:-1:-1;;;;;7210:19:0;;;17214:106;;;;-1:-1:-1;;;17214:106:0;;21894:2:1;17214:106:0;;;21876:21:1;21933:2;21913:18;;;21906:30;21972:34;21952:18;;;21945:62;22043:15;22023:18;;;22016:43;22076:19;;17214:106:0;21692:409:1;17214:106:0;16610:66;17331:85;;-1:-1:-1;;17331:85:0;-1:-1:-1;;;;;17331:85:0;;;;;;;;;;17140:284::o;17833:297::-;17976:29;17987:17;17976:10;:29::i;:::-;18034:1;18020:4;:11;:15;:28;;;;18039:9;18020:28;18016:107;;;18065:46;18087:17;18106:4;18065:21;:46::i;53138:321::-;53268:18;53274:2;53278:7;53268:5;:18::i;:::-;53319:54;53350:1;53354:2;53358:7;53367:5;53319:22;:54::i;:::-;53297:154;;;;-1:-1:-1;;;53297:154:0;;21044:2:1;53297:154:0;;;21026:21:1;21083:2;21063:18;;;21056:30;21122:34;21102:18;;;21095:62;21193:20;21173:18;;;21166:48;21231:19;;53297:154:0;20842:414:1;32818:113:0;5248:13;;;;;;;5240:69;;;;-1:-1:-1;;;5240:69:0;;20278:2:1;5240:69:0;;;20260:21:1;20317:2;20297:18;;;20290:30;20356:34;20336:18;;;20329:62;-1:-1:-1;;;20407:18:1;;;20400:41;20458:19;;5240:69:0;20076:407:1;5240:69:0;32891:32:::1;29475:10:::0;32891:18:::1;:32::i;45758:163::-:0;5248:13;;;;;;;5240:69;;;;-1:-1:-1;;;5240:69:0;;20278:2:1;5240:69:0;;;20260:21:1;20317:2;20297:18;;;20290:30;20356:34;20336:18;;;20329:62;-1:-1:-1;;;20407:18:1;;;20400:41;20458:19;;5240:69:0;20076:407:1;5240:69:0;45872:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;45896:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;61368:111::-:0;5248:13;;;;;;;5240:69;;;;-1:-1:-1;;;5240:69:0;;20278:2:1;5240:69:0;;;20260:21:1;20317:2;20297:18;;;20290:30;20356:34;20336:18;;;20329:62;-1:-1:-1;;;20407:18:1;;;20400:41;20458:19;;5240:69:0;20076:407:1;5240:69:0;61161:1:::1;61449:7;:22:::0;61368:111::o;57192:821::-;57347:4;-1:-1:-1;;;;;57368:13:0;;7210:19;:23;57364:642;;57404:83;;;;;-1:-1:-1;;;;;57404:47:0;;;;;:83;;29475:10;;57466:4;;57472:7;;57481:5;;57404:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57404:83:0;;;;;;;;-1:-1:-1;;57404:83:0;;;;;;;;;;;;:::i;:::-;;;57400:551;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57668:13:0;;57664:272;;57711:60;;-1:-1:-1;;;57711:60:0;;21044:2:1;57711:60:0;;;21026:21:1;21083:2;21063:18;;;21056:30;21122:34;21102:18;;;21095:62;21193:20;21173:18;;;21166:48;21231:19;;57711:60:0;20842:414:1;57664:272:0;57886:6;57880:13;57871:6;57867:2;57863:15;57856:38;57400:551;57538:62;;57548:52;57538:62;;-1:-1:-1;57531:69:0;;57364:642;-1:-1:-1;57990:4:0;57192:821;;;;;;:::o;17537:155::-;17604:37;17623:17;17604:18;:37::i;:::-;17657:27;;-1:-1:-1;;;;;17657:27:0;;;;;;;;17537:155;:::o;22570:461::-;22653:12;-1:-1:-1;;;;;7210:19:0;;;22678:88;;;;-1:-1:-1;;;22678:88:0;;23079:2:1;22678:88:0;;;23061:21:1;23118:2;23098:18;;;23091:30;23157:34;23137:18;;;23130:62;23228:8;23208:18;;;23201:36;23254:19;;22678:88:0;22877:402:1;22678:88:0;22840:12;22854:23;22881:6;-1:-1:-1;;;;;22881:19:0;22901:4;22881:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22839:67;;;;22924:99;22960:7;22969:10;22924:99;;;;;;;;;;;;;;;;;:35;:99::i;:::-;22917:106;22570:461;-1:-1:-1;;;;;22570:461:0:o;53795:439::-;-1:-1:-1;;;;;53875:16:0;;53867:61;;;;-1:-1:-1;;;53867:61:0;;23765:2:1;53867:61:0;;;23747:21:1;;;23784:18;;;23777:30;23843:34;23823:18;;;23816:62;23895:18;;53867:61:0;23563:356:1;53867:61:0;51871:4;51895:16;;;:7;:16;;;;;;-1:-1:-1;;;;;51895:16:0;:30;53939:58;;;;-1:-1:-1;;;53939:58:0;;24126:2:1;53939:58:0;;;24108:21:1;24165:2;24145:18;;;24138:30;24204;24184:18;;;24177:58;24252:18;;53939:58:0;23924:352:1;53939:58:0;-1:-1:-1;;;;;54068:13:0;;;;;;:9;:13;;;;;:18;;54085:1;;54068:13;:18;;54085:1;;54068:18;:::i;:::-;;;;-1:-1:-1;;54097:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;54097:21:0;-1:-1:-1;;;;;54097:21:0;;;;;;;;54136:33;;54097:16;;;54136:33;;54097:16;;54136:33;65377:156:::1;65208:332:::0;:::o;12489:712::-;12639:12;12668:7;12664:530;;;-1:-1:-1;12699:10:0;12692:17;;12664:530;12813:17;;:21;12809:374;;13011:10;13005:17;13072:15;13059:10;13055:2;13051:19;13044:44;12809:374;13154:12;13147:20;;-1:-1:-1;;;13147:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:1;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:1;868:16;;861:27;638:258::o;901:317::-;943:3;981:5;975:12;1008:6;1003:3;996:19;1024:63;1080:6;1073:4;1068:3;1064:14;1057:4;1050:5;1046:16;1024:63;:::i;:::-;1132:2;1120:15;-1:-1:-1;;1116:88:1;1107:98;;;;1207:4;1103:109;;901:317;-1:-1:-1;;901:317:1:o;1223:220::-;1372:2;1361:9;1354:21;1335:4;1392:45;1433:2;1422:9;1418:18;1410:6;1392:45;:::i;1448:180::-;1507:6;1560:2;1548:9;1539:7;1535:23;1531:32;1528:52;;;1576:1;1573;1566:12;1528:52;-1:-1:-1;1599:23:1;;1448:180;-1:-1:-1;1448:180:1:o;1864:196::-;1932:20;;-1:-1:-1;;;;;1981:54:1;;1971:65;;1961:93;;2050:1;2047;2040:12;1961:93;1864:196;;;:::o;2065:254::-;2133:6;2141;2194:2;2182:9;2173:7;2169:23;2165:32;2162:52;;;2210:1;2207;2200:12;2162:52;2233:29;2252:9;2233:29;:::i;:::-;2223:39;2309:2;2294:18;;;;2281:32;;-1:-1:-1;;;2065:254:1:o;2506:328::-;2583:6;2591;2599;2652:2;2640:9;2631:7;2627:23;2623:32;2620:52;;;2668:1;2665;2658:12;2620:52;2691:29;2710:9;2691:29;:::i;:::-;2681:39;;2739:38;2773:2;2762:9;2758:18;2739:38;:::i;:::-;2729:48;;2824:2;2813:9;2809:18;2796:32;2786:42;;2506:328;;;;;:::o;2839:160::-;2904:20;;2960:13;;2953:21;2943:32;;2933:60;;2989:1;2986;2979:12;3004:180;3060:6;3113:2;3101:9;3092:7;3088:23;3084:32;3081:52;;;3129:1;3126;3119:12;3081:52;3152:26;3168:9;3152:26;:::i;3189:186::-;3248:6;3301:2;3289:9;3280:7;3276:23;3272:32;3269:52;;;3317:1;3314;3307:12;3269:52;3340:29;3359:9;3340:29;:::i;3380:184::-;-1:-1:-1;;;3429:1:1;3422:88;3529:4;3526:1;3519:15;3553:4;3550:1;3543:15;3569:334;3640:2;3634:9;3696:2;3686:13;;-1:-1:-1;;3682:86:1;3670:99;;3799:18;3784:34;;3820:22;;;3781:62;3778:88;;;3846:18;;:::i;:::-;3882:2;3875:22;3569:334;;-1:-1:-1;3569:334:1:o;3908:952::-;3992:6;4023:2;4066;4054:9;4045:7;4041:23;4037:32;4034:52;;;4082:1;4079;4072:12;4034:52;4122:9;4109:23;4151:18;4192:2;4184:6;4181:14;4178:34;;;4208:1;4205;4198:12;4178:34;4246:6;4235:9;4231:22;4221:32;;4291:7;4284:4;4280:2;4276:13;4272:27;4262:55;;4313:1;4310;4303:12;4262:55;4349:2;4336:16;4371:2;4367;4364:10;4361:36;;;4377:18;;:::i;:::-;4423:2;4420:1;4416:10;4406:20;;4446:28;4470:2;4466;4462:11;4446:28;:::i;:::-;4508:15;;;4578:11;;;4574:20;;;4539:12;;;;4606:19;;;4603:39;;;4638:1;4635;4628:12;4603:39;4662:11;;;;4682:148;4698:6;4693:3;4690:15;4682:148;;;4764:23;4783:3;4764:23;:::i;:::-;4752:36;;4715:12;;;;4808;;;;4682:148;;;4849:5;3908:952;-1:-1:-1;;;;;;;;3908:952:1:o;4865:589::-;4907:5;4960:3;4953:4;4945:6;4941:17;4937:27;4927:55;;4978:1;4975;4968:12;4927:55;5014:6;5001:20;5040:18;5036:2;5033:26;5030:52;;;5062:18;;:::i;:::-;5106:114;5214:4;-1:-1:-1;;5138:4:1;5134:2;5130:13;5126:86;5122:97;5106:114;:::i;:::-;5245:2;5236:7;5229:19;5291:3;5284:4;5279:2;5271:6;5267:15;5263:26;5260:35;5257:55;;;5308:1;5305;5298:12;5257:55;5373:2;5366:4;5358:6;5354:17;5347:4;5338:7;5334:18;5321:55;5421:1;5396:16;;;5414:4;5392:27;5385:38;;;;5400:7;4865:589;-1:-1:-1;;;4865:589:1:o;5459:394::-;5536:6;5544;5597:2;5585:9;5576:7;5572:23;5568:32;5565:52;;;5613:1;5610;5603:12;5565:52;5636:29;5655:9;5636:29;:::i;:::-;5626:39;;5716:2;5705:9;5701:18;5688:32;5743:18;5735:6;5732:30;5729:50;;;5775:1;5772;5765:12;5729:50;5798:49;5839:7;5830:6;5819:9;5815:22;5798:49;:::i;:::-;5788:59;;;5459:394;;;;;:::o;6040:321::-;6109:6;6162:2;6150:9;6141:7;6137:23;6133:32;6130:52;;;6178:1;6175;6168:12;6130:52;6218:9;6205:23;6251:18;6243:6;6240:30;6237:50;;;6283:1;6280;6273:12;6237:50;6306:49;6347:7;6338:6;6327:9;6323:22;6306:49;:::i;6366:457::-;6453:6;6461;6469;6522:2;6510:9;6501:7;6497:23;6493:32;6490:52;;;6538:1;6535;6528:12;6490:52;6578:9;6565:23;6611:18;6603:6;6600:30;6597:50;;;6643:1;6640;6633:12;6597:50;6666:49;6707:7;6698:6;6687:9;6683:22;6666:49;:::i;:::-;6656:59;6762:2;6747:18;;6734:32;;-1:-1:-1;6813:2:1;6798:18;;;6785:32;;6366:457;-1:-1:-1;;;;6366:457:1:o;6828:254::-;6893:6;6901;6954:2;6942:9;6933:7;6929:23;6925:32;6922:52;;;6970:1;6967;6960:12;6922:52;6993:29;7012:9;6993:29;:::i;:::-;6983:39;;7041:35;7072:2;7061:9;7057:18;7041:35;:::i;:::-;7031:45;;6828:254;;;;;:::o;7087:537::-;7182:6;7190;7198;7206;7259:3;7247:9;7238:7;7234:23;7230:33;7227:53;;;7276:1;7273;7266:12;7227:53;7299:29;7318:9;7299:29;:::i;:::-;7289:39;;7347:38;7381:2;7370:9;7366:18;7347:38;:::i;:::-;7337:48;;7432:2;7421:9;7417:18;7404:32;7394:42;;7487:2;7476:9;7472:18;7459:32;7514:18;7506:6;7503:30;7500:50;;;7546:1;7543;7536:12;7500:50;7569:49;7610:7;7601:6;7590:9;7586:22;7569:49;:::i;:::-;7559:59;;;7087:537;;;;;;;:::o;7629:260::-;7697:6;7705;7758:2;7746:9;7737:7;7733:23;7729:32;7726:52;;;7774:1;7771;7764:12;7726:52;7797:29;7816:9;7797:29;:::i;:::-;7787:39;;7845:38;7879:2;7868:9;7864:18;7845:38;:::i;7894:437::-;7973:1;7969:12;;;;8016;;;8037:61;;8091:4;8083:6;8079:17;8069:27;;8037:61;8144:2;8136:6;8133:14;8113:18;8110:38;8107:218;;;-1:-1:-1;;;8178:1:1;8171:88;8282:4;8279:1;8272:15;8310:4;8307:1;8300:15;8107:218;;7894:437;;;:::o;10355:184::-;-1:-1:-1;;;10404:1:1;10397:88;10504:4;10501:1;10494:15;10528:4;10525:1;10518:15;10544:125;10584:4;10612:1;10609;10606:8;10603:34;;;10617:18;;:::i;:::-;-1:-1:-1;10654:9:1;;10544:125::o;12196:128::-;12236:3;12267:1;12263:6;12260:1;12257:13;12254:39;;;12273:18;;:::i;:::-;-1:-1:-1;12309:9:1;;12196:128::o;12676:184::-;-1:-1:-1;;;12725:1:1;12718:88;12825:4;12822:1;12815:15;12849:4;12846:1;12839:15;12865:195;12904:3;12935:66;12928:5;12925:77;12922:103;;;13005:18;;:::i;:::-;-1:-1:-1;13052:1:1;13041:13;;12865:195::o;16956:470::-;17135:3;17173:6;17167:13;17189:53;17235:6;17230:3;17223:4;17215:6;17211:17;17189:53;:::i;:::-;17305:13;;17264:16;;;;17327:57;17305:13;17264:16;17361:4;17349:17;;17327:57;:::i;:::-;17400:20;;16956:470;-1:-1:-1;;;;16956:470:1:o;19062:184::-;19132:6;19185:2;19173:9;19164:7;19160:23;19156:32;19153:52;;;19201:1;19198;19191:12;19153:52;-1:-1:-1;19224:16:1;;19062:184;-1:-1:-1;19062:184:1:o;21261:::-;-1:-1:-1;;;21310:1:1;21303:88;21410:4;21407:1;21400:15;21434:4;21431:1;21424:15;21450:120;21490:1;21516;21506:35;;21521:18;;:::i;:::-;-1:-1:-1;21555:9:1;;21450:120::o;21575:112::-;21607:1;21633;21623:35;;21638:18;;:::i;:::-;-1:-1:-1;21672:9:1;;21575:112::o;22106:512::-;22300:4;-1:-1:-1;;;;;22410:2:1;22402:6;22398:15;22387:9;22380:34;22462:2;22454:6;22450:15;22445:2;22434:9;22430:18;22423:43;;22502:6;22497:2;22486:9;22482:18;22475:34;22545:3;22540:2;22529:9;22525:18;22518:31;22566:46;22607:3;22596:9;22592:19;22584:6;22566:46;:::i;:::-;22558:54;22106:512;-1:-1:-1;;;;;;22106:512:1:o;22623:249::-;22692:6;22745:2;22733:9;22724:7;22720:23;22716:32;22713:52;;;22761:1;22758;22751:12;22713:52;22793:9;22787:16;22812:30;22836:5;22812:30;:::i;23284:274::-;23413:3;23451:6;23445:13;23467:53;23513:6;23508:3;23501:4;23493:6;23489:17;23467:53;:::i;:::-;23536:16;;;;;23284:274;-1:-1:-1;;23284:274:1:o
Swarm Source
ipfs://cac8e180de4b99f833dc91100b8a6088da5898d2fb30088ebbd5984524eec0a9
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.