From 3c247355814f6a6e8d1d8f8984422c7488e43aa6 Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Wed, 17 Jul 2024 21:22:55 +0200 Subject: [PATCH 001/134] chore: revisit staking flow --- operate/constants.py | 2 +- operate/services/manage.py | 142 +++++++++++++++++--------- operate/services/protocol.py | 192 +++++++++++++++++------------------ operate/services/service.py | 5 +- operate/types.py | 13 +-- 5 files changed, 202 insertions(+), 152 deletions(-) diff --git a/operate/constants.py b/operate/constants.py index 6136f15c2..8af868559 100644 --- a/operate/constants.py +++ b/operate/constants.py @@ -33,5 +33,5 @@ SERVICE_YAML = "service.yaml" ON_CHAIN_INTERACT_TIMEOUT = 120.0 -ON_CHAIN_INTERACT_RETRIES = 40.0 +ON_CHAIN_INTERACT_RETRIES = 40 ON_CHAIN_INTERACT_SLEEP = 3.0 diff --git a/operate/services/manage.py b/operate/services/manage.py index 927fff7cc..f27bbccd5 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -28,6 +28,7 @@ from pathlib import Path import aiohttp # type: ignore +import requests from aea.helpers.base import IPFSHash from aea.helpers.logging import setup_logger from autonomy.chain.base import registry_contracts @@ -39,6 +40,7 @@ from operate.services.service import ( DELETE_PREFIX, Deployment, + NON_EXISTENT_TOKEN, OnChainData, OnChainState, OnChainUserParams, @@ -60,6 +62,8 @@ DOCKER_COMPOSE_YAML = "docker-compose.yaml" SERVICE_YAML = "service.yaml" HTTP_OK = 200 +IPFS_GATEWAY = "https://gateway.autonolas.tech/ipfs/" +URI_HASH_POSITION = 7 async def check_service_health() -> bool: @@ -180,6 +184,36 @@ def load_or_create( return service + def _get_on_chain_state(self, service: Service) -> OnChainState: + if service.chain_data.token == NON_EXISTENT_TOKEN: + service_state = OnChainState.NON_EXISTENT + service.chain_data.on_chain_state = service_state + service.store() + return service_state + + sftxb = self.get_eth_safe_tx_builder(service=service) + info = sftxb.info(token_id=service.chain_data.token) + service_state = OnChainState(info["service_state"]) + service.chain_data.on_chain_state = service_state + service.store() + return service_state + + + def _get_on_chain_hash(self, service: Service) -> t.Optional[str]: + if service.chain_data.token == NON_EXISTENT_TOKEN: + return None + + sftxb = self.get_eth_safe_tx_builder(service=service) + info = sftxb.info(token_id=service.chain_data.token) + config_hash = info["config_hash"] + res = requests.get(f"{IPFS_GATEWAY}f01701220{config_hash}", timeout=30) + if res.status_code == 200: + return res.json().get("code_uri", "")[URI_HASH_POSITION:] + raise ValueError( + f"Something went wrong while trying to get the code uri from IPFS: {res}" + ) + + def deploy_service_onchain( # pylint: disable=too-many-statements self, hash: str, @@ -219,13 +253,13 @@ def deploy_service_onchain( # pylint: disable=too-many-statements if user_params.use_staking: self.logger.info("Checking staking compatibility") if service.chain_data.on_chain_state in ( - OnChainState.NOTMINTED, - OnChainState.MINTED, + OnChainState.NON_EXISTENT, + OnChainState.PRE_REGISTRATION, ): required_olas = ( user_params.olas_cost_of_bond + user_params.olas_required_to_stake ) - elif service.chain_data.on_chain_state == OnChainState.ACTIVATED: + elif service.chain_data.on_chain_state == OnChainState.ACTIVE_REGISTRATION: required_olas = user_params.olas_required_to_stake else: required_olas = 0 @@ -244,7 +278,7 @@ def deploy_service_onchain( # pylint: disable=too-many-statements f"required olas: {required_olas}; your balance {balance}" ) - if service.chain_data.on_chain_state == OnChainState.NOTMINTED: + if service.chain_data.on_chain_state == OnChainState.NON_EXISTENT: self.logger.info("Minting service") service.chain_data.token = t.cast( int, @@ -267,13 +301,13 @@ def deploy_service_onchain( # pylint: disable=too-many-statements ), ).get("token"), ) - service.chain_data.on_chain_state = OnChainState.MINTED + service.chain_data.on_chain_state = OnChainState.PRE_REGISTRATION service.store() info = ocm.info(token_id=service.chain_data.token) service.chain_data.on_chain_state = OnChainState(info["service_state"]) - if service.chain_data.on_chain_state == OnChainState.MINTED: + if service.chain_data.on_chain_state == OnChainState.PRE_REGISTRATION: self.logger.info("Activating service") ocm.activate( service_id=service.chain_data.token, @@ -283,13 +317,13 @@ def deploy_service_onchain( # pylint: disable=too-many-statements else None ), ) - service.chain_data.on_chain_state = OnChainState.ACTIVATED + service.chain_data.on_chain_state = OnChainState.ACTIVE_REGISTRATION service.store() info = ocm.info(token_id=service.chain_data.token) service.chain_data.on_chain_state = OnChainState(info["service_state"]) - if service.chain_data.on_chain_state == OnChainState.ACTIVATED: + if service.chain_data.on_chain_state == OnChainState.ACTIVE_REGISTRATION: self.logger.info("Registering service") ocm.register( service_id=service.chain_data.token, @@ -301,13 +335,13 @@ def deploy_service_onchain( # pylint: disable=too-many-statements else None ), ) - service.chain_data.on_chain_state = OnChainState.REGISTERED + service.chain_data.on_chain_state = OnChainState.FINISHED_REGISTRATION service.store() info = ocm.info(token_id=service.chain_data.token) service.chain_data.on_chain_state = OnChainState(info["service_state"]) - if service.chain_data.on_chain_state == OnChainState.REGISTERED: + if service.chain_data.on_chain_state == OnChainState.FINISHED_REGISTRATION: self.logger.info("Deploying service") ocm.deploy( service_id=service.chain_data.token, @@ -335,7 +369,6 @@ def deploy_service_onchain( # pylint: disable=too-many-statements def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too-many-locals self, hash: str, - update: bool = False, ) -> None: """ Deploy as service on-chain @@ -343,6 +376,8 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too :param hash: Service hash :param update: Update the existing deployment """ + self.logger.info("DEPLOY SERVICE ONCHAIN FROM SAFE ====================") + self.logger.info("Loading service") service = self.load_or_create(hash=hash) user_params = service.chain_data.user_params @@ -350,6 +385,10 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too instances = [key.address for key in keys] wallet = self.wallet_manager.load(service.ledger_config.type) sftxb = self.get_eth_safe_tx_builder(service=service) + + + + if user_params.use_staking and not sftxb.staking_slots_available( staking_contract=STAKING[service.ledger_config.chain] ): @@ -367,13 +406,13 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too if user_params.use_staking: self.logger.info("Checking staking compatibility") if service.chain_data.on_chain_state in ( - OnChainState.NOTMINTED, - OnChainState.MINTED, + OnChainState.NON_EXISTENT, + OnChainState.PRE_REGISTRATION, ): required_olas = ( user_params.olas_cost_of_bond + user_params.olas_required_to_stake ) - elif service.chain_data.on_chain_state == OnChainState.ACTIVATED: + elif service.chain_data.on_chain_state == OnChainState.ACTIVE_REGISTRATION: required_olas = user_params.olas_required_to_stake else: required_olas = 0 @@ -392,8 +431,22 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too f"address: {wallet.safe}; required olas: {required_olas}; your balance: {balance}" ) - if service.chain_data.on_chain_state == OnChainState.NOTMINTED: - self.logger.info("Minting service") + + + + on_chain_hash = self._get_on_chain_hash(service) + is_first_mint = self._get_on_chain_state(service) == OnChainState.NON_EXISTENT + is_update = (not is_first_mint) and on_chain_hash and (on_chain_hash != service.hash) + + self.logger.info(f"{on_chain_hash=}") + self.logger.info(f"{is_first_mint=}") + self.logger.info(f"{is_update=}") + + if is_update: + #TERMINATE SERVICE + + if is_first_mint or (is_update and self._get_on_chain_state(service) == OnChainState.PRE_REGISTRATION): + self.logger.info("Minting the on-chain service") receipt = ( sftxb.new_tx() .add( @@ -408,7 +461,7 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too ), threshold=user_params.threshold, nft=IPFSHash(user_params.nft), - update_token=service.chain_data.token if update else None, + update_token=service.chain_data.token if is_update else None, token=( OLAS[service.ledger_config.chain] if user_params.use_staking @@ -428,13 +481,10 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too ).get("events"), ) service.chain_data.token = event_data["args"]["serviceId"] - service.chain_data.on_chain_state = OnChainState.MINTED + service.chain_data.on_chain_state = OnChainState.PRE_REGISTRATION service.store() - info = sftxb.info(token_id=service.chain_data.token) - service.chain_data.on_chain_state = OnChainState(info["service_state"]) - - if service.chain_data.on_chain_state == OnChainState.MINTED: + if self._get_on_chain_state(service) == OnChainState.PRE_REGISTRATION: cost_of_bond = user_params.cost_of_bond if user_params.use_staking: token_utility = "0xa45E64d13A30a51b91ae0eb182e88a40e9b18eD8" # nosec @@ -480,13 +530,10 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too cost_of_bond=cost_of_bond, ) ).settle() - service.chain_data.on_chain_state = OnChainState.ACTIVATED + service.chain_data.on_chain_state = OnChainState.ACTIVE_REGISTRATION service.store() - info = sftxb.info(token_id=service.chain_data.token) - service.chain_data.on_chain_state = OnChainState(info["service_state"]) - - if service.chain_data.on_chain_state == OnChainState.ACTIVATED: + if self._get_on_chain_state(service) == OnChainState.ACTIVE_REGISTRATION: cost_of_bond = user_params.cost_of_bond if user_params.use_staking: token_utility = "0xa45E64d13A30a51b91ae0eb182e88a40e9b18eD8" # nosec @@ -536,18 +583,15 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too cost_of_bond=cost_of_bond, ) ).settle() - service.chain_data.on_chain_state = OnChainState.REGISTERED + service.chain_data.on_chain_state = OnChainState.FINISHED_REGISTRATION service.store() - info = sftxb.info(token_id=service.chain_data.token) - service.chain_data.on_chain_state = OnChainState(info["service_state"]) - - if service.chain_data.on_chain_state == OnChainState.REGISTERED: + if self._get_on_chain_state(service) == OnChainState.FINISHED_REGISTRATION: self.logger.info("Deploying service") sftxb.new_tx().add( sftxb.get_deploy_data( service_id=service.chain_data.token, - reuse_multisig=update, + reuse_multisig=is_update, ) ).settle() service.chain_data.on_chain_state = OnChainState.DEPLOYED @@ -588,7 +632,7 @@ def terminate_service_on_chain(self, hash: str) -> None: else None ), ) - service.chain_data.on_chain_state = OnChainState.TERMINATED + service.chain_data.on_chain_state = OnChainState.TERMINATED_BONDED service.store() def terminate_service_on_chain_from_safe(self, hash: str) -> None: @@ -612,7 +656,7 @@ def terminate_service_on_chain_from_safe(self, hash: str) -> None: service_id=service.chain_data.token, ) ).settle() - service.chain_data.on_chain_state = OnChainState.TERMINATED + service.chain_data.on_chain_state = OnChainState.TERMINATED_BONDED service.store() def unbond_service_on_chain(self, hash: str) -> None: @@ -626,7 +670,7 @@ def unbond_service_on_chain(self, hash: str) -> None: info = ocm.info(token_id=service.chain_data.token) service.chain_data.on_chain_state = OnChainState(info["service_state"]) - if service.chain_data.on_chain_state != OnChainState.TERMINATED: + if service.chain_data.on_chain_state != OnChainState.TERMINATED_BONDED: self.logger.info("Cannot unbond service") return @@ -653,7 +697,7 @@ def unbond_service_on_chain_from_safe(self, hash: str) -> None: info = sftxb.info(token_id=service.chain_data.token) service.chain_data.on_chain_state = OnChainState(info["service_state"]) - if service.chain_data.on_chain_state != OnChainState.TERMINATED: + if service.chain_data.on_chain_state != OnChainState.TERMINATED_BONDED: self.logger.info("Cannot unbond service") return @@ -663,7 +707,7 @@ def unbond_service_on_chain_from_safe(self, hash: str) -> None: service_id=service.chain_data.token, ) ).settle() - service.chain_data.on_chain_state = OnChainState.TERMINATED + service.chain_data.on_chain_state = OnChainState.TERMINATED_BONDED service.store() def stake_service_on_chain(self, hash: str) -> None: @@ -984,6 +1028,8 @@ def update_service( from_safe: bool = True, # pylint: disable=unused-argument ) -> Service: """Update a service.""" + + self.logger.info("-----Entering update service on-chain-----") old_service = self.load_or_create( hash=old_hash, ) @@ -1016,19 +1062,21 @@ def update_service( # owner, *_ = old_service.chain_data.instances # noqa: E800 # if from_safe: # noqa: E800 # sftx = self.get_eth_safe_tx_builder(service=old_service) # noqa: E800 - # sftx.new_tx().add( # noqa: E800 - # sftx.get_swap_data( # noqa: E800 - # service_id=old_service.chain_data.token, # noqa: E800 - # multisig=old_service.chain_data.multisig, # noqa: E800 - # owner_key=str(self.keys_manager.get(key=owner).private_key), # noqa: E800 - # ) # noqa: E800 - # ).settle() # noqa: E800 + # sftx.swap( # noqa: E800 + # service_id=old_service.chain_data.token, # noqa: E800 + # multisig=old_service.chain_data.multisig, # noqa: E800 + # owner_key=str( + # self.keys_manager.get(key=owner).private_key + # ), # noqa: E800 + # ) # noqa: E800 # else: # noqa: E800 # ocm = self.get_on_chain_manager(service=old_service) # noqa: E800 # ocm.swap( # noqa: E800 # service_id=old_service.chain_data.token, # noqa: E800 # multisig=old_service.chain_data.multisig, # noqa: E800 - # owner_key=str(self.keys_manager.get(key=owner).private_key), # noqa: E800 + # owner_key=str( + # self.keys_manager.get(key=owner).private_key + # ), # noqa: E800 # ) # noqa: E800 new_service = self.load_or_create( @@ -1040,7 +1088,7 @@ def update_service( new_service.keys = old_service.keys new_service.chain_data = old_service.chain_data new_service.ledger_config = old_service.ledger_config - new_service.chain_data.on_chain_state = OnChainState.NOTMINTED + new_service.chain_data.on_chain_state = OnChainState.NON_EXISTENT new_service.store() # The following logging has been added to identify OS issues when diff --git a/operate/services/protocol.py b/operate/services/protocol.py index f6d8acf46..b79522533 100644 --- a/operate/services/protocol.py +++ b/operate/services/protocol.py @@ -521,6 +521,102 @@ def info(self, token_id: int) -> t.Dict: instances=instances, ) + def swap( # pylint: disable=too-many-arguments,too-many-locals + self, + service_id: int, + multisig: str, + owner_key: str, + ) -> None: + """Swap safe owner.""" + logging.info(f"Swapping safe for service {service_id} [{multisig}]...") + self._patch() + manager = ServiceManager( + service_id=service_id, + chain_type=self.chain_type, + key=self.wallet.key_path, + password=self.wallet.password, + timeout=ON_CHAIN_INTERACT_TIMEOUT, + retries=ON_CHAIN_INTERACT_RETRIES, + sleep=ON_CHAIN_INTERACT_SLEEP, + ) + with tempfile.TemporaryDirectory() as temp_dir: + key_file = Path(temp_dir, "key.txt") + key_file.write_text(owner_key, encoding="utf-8") + owner_crypto = EthereumCrypto(private_key_path=str(key_file)) + owner_cryptos: t.List[EthereumCrypto] = [owner_crypto] + owners = [ + manager.ledger_api.api.to_checksum_address(owner_crypto.address) + for owner_crypto in owner_cryptos + ] + owner_to_swap = owners[0] + multisend_txs = [] + txd = registry_contracts.gnosis_safe.get_swap_owner_data( + ledger_api=manager.ledger_api, + contract_address=multisig, + old_owner=manager.ledger_api.api.to_checksum_address(owner_to_swap), + new_owner=manager.ledger_api.api.to_checksum_address( + manager.crypto.address + ), + ).get("data") + multisend_txs.append( + { + "operation": MultiSendOperation.CALL, + "to": multisig, + "value": 0, + "data": HexBytes(txd[2:]), + } + ) + multisend_txd = registry_contracts.multisend.get_tx_data( # type: ignore + ledger_api=manager.ledger_api, + contract_address=ContractConfigs.multisend.contracts[self.chain_type], + multi_send_txs=multisend_txs, + ).get("data") + multisend_data = bytes.fromhex(multisend_txd[2:]) + safe_tx_hash = registry_contracts.gnosis_safe.get_raw_safe_transaction_hash( + ledger_api=manager.ledger_api, + contract_address=multisig, + to_address=ContractConfigs.multisend.contracts[self.chain_type], + value=0, + data=multisend_data, + safe_tx_gas=0, + operation=SafeOperation.DELEGATE_CALL.value, + ).get("tx_hash")[2:] + payload_data = hash_payload_to_hex( + safe_tx_hash=safe_tx_hash, + ether_value=0, + safe_tx_gas=0, + to_address=ContractConfigs.multisend.contracts[self.chain_type], + data=multisend_data, + ) + tx_params = skill_input_hex_to_payload(payload=payload_data) + safe_tx_bytes = binascii.unhexlify(tx_params["safe_tx_hash"]) + owner_to_signature = {} + for owner_crypto in owner_cryptos: + signature = owner_crypto.sign_message( + message=safe_tx_bytes, + is_deprecated_mode=True, + ) + owner_to_signature[ + manager.ledger_api.api.to_checksum_address(owner_crypto.address) + ] = signature[2:] + tx = registry_contracts.gnosis_safe.get_raw_safe_transaction( + ledger_api=manager.ledger_api, + contract_address=multisig, + sender_address=owner_crypto.address, + owners=tuple(owners), # type: ignore + to_address=tx_params["to_address"], + value=tx_params["ether_value"], + data=tx_params["data"], + safe_tx_gas=tx_params["safe_tx_gas"], + signatures_by_owner=owner_to_signature, + operation=SafeOperation.DELEGATE_CALL.value, + ) + stx = owner_crypto.sign_transaction(tx) + tx_digest = manager.ledger_api.send_signed_transaction(stx) + receipt = manager.ledger_api.api.eth.wait_for_transaction_receipt(tx_digest) + if receipt["status"] != 1: + raise RuntimeError("Error swapping owners") + class OnChainManager(_ChainUtil): """On chain service management.""" @@ -657,102 +753,6 @@ def deploy( reuse_multisig=reuse_multisig, ) - def swap( # pylint: disable=too-many-arguments,too-many-locals - self, - service_id: int, - multisig: str, - owner_key: str, - ) -> None: - """Swap safe owner.""" - logging.info(f"Swapping safe for service {service_id} [{multisig}]...") - self._patch() - manager = ServiceManager( - service_id=service_id, - chain_type=self.chain_type, - key=self.wallet.key_path, - password=self.wallet.password, - timeout=ON_CHAIN_INTERACT_TIMEOUT, - retries=ON_CHAIN_INTERACT_RETRIES, - sleep=ON_CHAIN_INTERACT_SLEEP, - ) - with tempfile.TemporaryDirectory() as temp_dir: - key_file = Path(temp_dir, "key.txt") - key_file.write_text(owner_key, encoding="utf-8") - owner_crypto = EthereumCrypto(private_key_path=str(key_file)) - owner_cryptos: t.List[EthereumCrypto] = [owner_crypto] - owners = [ - manager.ledger_api.api.to_checksum_address(owner_crypto.address) - for owner_crypto in owner_cryptos - ] - owner_to_swap = owners[0] - multisend_txs = [] - txd = registry_contracts.gnosis_safe.get_swap_owner_data( - ledger_api=manager.ledger_api, - contract_address=multisig, - old_owner=manager.ledger_api.api.to_checksum_address(owner_to_swap), - new_owner=manager.ledger_api.api.to_checksum_address( - manager.crypto.address - ), - ).get("data") - multisend_txs.append( - { - "operation": MultiSendOperation.CALL, - "to": multisig, - "value": 0, - "data": HexBytes(txd[2:]), - } - ) - multisend_txd = registry_contracts.multisend.get_tx_data( # type: ignore - ledger_api=manager.ledger_api, - contract_address=ContractConfigs.multisend.contracts[self.chain_type], - multi_send_txs=multisend_txs, - ).get("data") - multisend_data = bytes.fromhex(multisend_txd[2:]) - safe_tx_hash = registry_contracts.gnosis_safe.get_raw_safe_transaction_hash( - ledger_api=manager.ledger_api, - contract_address=multisig, - to_address=ContractConfigs.multisend.contracts[self.chain_type], - value=0, - data=multisend_data, - safe_tx_gas=0, - operation=SafeOperation.DELEGATE_CALL.value, - ).get("tx_hash")[2:] - payload_data = hash_payload_to_hex( - safe_tx_hash=safe_tx_hash, - ether_value=0, - safe_tx_gas=0, - to_address=ContractConfigs.multisend.contracts[self.chain_type], - data=multisend_data, - ) - tx_params = skill_input_hex_to_payload(payload=payload_data) - safe_tx_bytes = binascii.unhexlify(tx_params["safe_tx_hash"]) - owner_to_signature = {} - for owner_crypto in owner_cryptos: - signature = owner_crypto.sign_message( - message=safe_tx_bytes, - is_deprecated_mode=True, - ) - owner_to_signature[ - manager.ledger_api.api.to_checksum_address(owner_crypto.address) - ] = signature[2:] - tx = registry_contracts.gnosis_safe.get_raw_safe_transaction( - ledger_api=manager.ledger_api, - contract_address=multisig, - sender_address=owner_crypto.address, - owners=tuple(owners), # type: ignore - to_address=tx_params["to_address"], - value=tx_params["ether_value"], - data=tx_params["data"], - safe_tx_gas=tx_params["safe_tx_gas"], - signatures_by_owner=owner_to_signature, - operation=SafeOperation.DELEGATE_CALL.value, - ) - stx = owner_crypto.sign_transaction(tx) - tx_digest = manager.ledger_api.send_signed_transaction(stx) - receipt = manager.ledger_api.api.eth.wait_for_transaction_receipt(tx_digest) - if receipt["status"] != 1: - raise RuntimeError("Error swapping owners") - def terminate(self, service_id: int, token: t.Optional[str] = None) -> None: """Terminate service.""" logging.info(f"Terminating service {service_id}...") diff --git a/operate/services/service.py b/operate/services/service.py index 193ba7561..67121bb44 100644 --- a/operate/services/service.py +++ b/operate/services/service.py @@ -86,6 +86,7 @@ # pylint: disable=no-member,redefined-builtin,too-many-instance-attributes DUMMY_MULTISIG = "0xm" +NON_EXISTENT_TOKEN = -1 def mkdirs(build_dir: Path) -> None: @@ -690,10 +691,10 @@ def new( ), chain_data=OnChainData( instances=[], - token=-1, + token=NON_EXISTENT_TOKEN, multisig=DUMMY_MULTISIG, staked=False, - on_chain_state=OnChainState.NOTMINTED, + on_chain_state=OnChainState.NON_EXISTENT, user_params=on_chain_user_params, ), path=service_path.parent, diff --git a/operate/types.py b/operate/types.py index 29f83ec71..1babb5f82 100644 --- a/operate/types.py +++ b/operate/types.py @@ -130,16 +130,17 @@ class DeploymentStatus(enum.IntEnum): DELETED = 6 +# TODO defined in aea.chain.base.OnChainState class OnChainState(enum.IntEnum): """On-chain state.""" - NOTMINTED = 0 - MINTED = 1 - ACTIVATED = 2 - REGISTERED = 3 + NON_EXISTENT = 0 + PRE_REGISTRATION = 1 + ACTIVE_REGISTRATION = 2 + FINISHED_REGISTRATION = 3 DEPLOYED = 4 - TERMINATED = 5 - UNBONDED = 6 + TERMINATED_BONDED = 5 + UNBONDED = 6 # TODO this is not an on-chain state https://github.com/valory-xyz/autonolas-registries/blob/main/contracts/ServiceRegistryL2.sol class ContractAddresses(TypedDict): From e294ad0a0c940b05da93e308c5e71d3bd1b98996 Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Wed, 17 Jul 2024 22:56:28 +0200 Subject: [PATCH 002/134] chore: updates --- operate/services/manage.py | 93 +++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 51 deletions(-) diff --git a/operate/services/manage.py b/operate/services/manage.py index f27bbccd5..78f654515 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -386,9 +386,6 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too wallet = self.wallet_manager.load(service.ledger_config.type) sftxb = self.get_eth_safe_tx_builder(service=service) - - - if user_params.use_staking and not sftxb.staking_slots_available( staking_contract=STAKING[service.ledger_config.chain] ): @@ -432,21 +429,23 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too ) - - on_chain_hash = self._get_on_chain_hash(service) is_first_mint = self._get_on_chain_state(service) == OnChainState.NON_EXISTENT - is_update = (not is_first_mint) and on_chain_hash and (on_chain_hash != service.hash) + is_update = (not is_first_mint) and (on_chain_hash is not None) and (on_chain_hash != service.hash) self.logger.info(f"{on_chain_hash=}") self.logger.info(f"{is_first_mint=}") self.logger.info(f"{is_update=}") if is_update: - #TERMINATE SERVICE + self.terminate_service_on_chain_from_safe(hash=hash) if is_first_mint or (is_update and self._get_on_chain_state(service) == OnChainState.PRE_REGISTRATION): - self.logger.info("Minting the on-chain service") + if not is_update: + self.logger.info("Minting the on-chain service") + else: + self.logger.info("Updating the on-chain service") + receipt = ( sftxb.new_tx() .add( @@ -597,13 +596,15 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too service.chain_data.on_chain_state = OnChainState.DEPLOYED service.store() + + # Update local Service info = sftxb.info(token_id=service.chain_data.token) service.chain_data = OnChainData( token=service.chain_data.token, instances=info["instances"], multisig=info["multisig"], staked=False, - on_chain_state=service.chain_data.on_chain_state, + on_chain_state=OnChainState(info["service_state"]), user_params=service.chain_data.user_params, ) service.store() @@ -641,23 +642,44 @@ def terminate_service_on_chain_from_safe(self, hash: str) -> None: :param hash: Service hash """ + service = self.load_or_create(hash=hash) sftxb = self.get_eth_safe_tx_builder(service=service) info = sftxb.info(token_id=service.chain_data.token) service.chain_data.on_chain_state = OnChainState(info["service_state"]) - if service.chain_data.on_chain_state != OnChainState.DEPLOYED: - self.logger.info("Cannot terminate service") + if service.chain_data.user_params.use_staking and not self._can_unstake_service(hash=hash): return - self.logger.info("Terminating service") - sftxb.new_tx().add( - sftxb.get_terminate_data( - service_id=service.chain_data.token, - ) - ).settle() - service.chain_data.on_chain_state = OnChainState.TERMINATED_BONDED - service.store() + self.unstake_service_on_chain(hash=hash) + + if self._get_on_chain_state(service) in (OnChainState.ACTIVE_REGISTRATION, OnChainState.FINISHED_REGISTRATION, OnChainState.DEPLOYED): + self.logger.info("Terminating service") + sftxb.new_tx().add( + sftxb.get_terminate_data( + service_id=service.chain_data.token, + ) + ).settle() + + if self._get_on_chain_state(service) == OnChainState.TERMINATED_BONDED: + self.logger.info("Unbonding service") + sftxb.new_tx().add( + sftxb.get_unbond_data( + service_id=service.chain_data.token, + ) + ).settle() + + + if [[ "$current_safe_owners" == "['$agent_address']" ]]: + sftx = self.get_eth_safe_tx_builder(service=old_service) # noqa: E800 + sftx.swap( # noqa: E800 + service_id=old_service.chain_data.token, # noqa: E800 + multisig=old_service.chain_data.multisig, # noqa: E800 + owner_key=str( + self.keys_manager.get(key=owner).private_key + ), # noqa: E800 + ) # noqa: E800 + def unbond_service_on_chain(self, hash: str) -> None: """ @@ -686,30 +708,6 @@ def unbond_service_on_chain(self, hash: str) -> None: service.chain_data.on_chain_state = OnChainState.UNBONDED service.store() - def unbond_service_on_chain_from_safe(self, hash: str) -> None: - """ - Terminate service on-chain - - :param hash: Service hash - """ - service = self.load_or_create(hash=hash) - sftxb = self.get_eth_safe_tx_builder(service=service) - info = sftxb.info(token_id=service.chain_data.token) - service.chain_data.on_chain_state = OnChainState(info["service_state"]) - - if service.chain_data.on_chain_state != OnChainState.TERMINATED_BONDED: - self.logger.info("Cannot unbond service") - return - - self.logger.info("Unbonding service") - sftxb.new_tx().add( - sftxb.get_unbond_data( - service_id=service.chain_data.token, - ) - ).settle() - service.chain_data.on_chain_state = OnChainState.TERMINATED_BONDED - service.store() - def stake_service_on_chain(self, hash: str) -> None: """ Stake service on-chain @@ -1061,14 +1059,7 @@ def update_service( # owner, *_ = old_service.chain_data.instances # noqa: E800 # if from_safe: # noqa: E800 - # sftx = self.get_eth_safe_tx_builder(service=old_service) # noqa: E800 - # sftx.swap( # noqa: E800 - # service_id=old_service.chain_data.token, # noqa: E800 - # multisig=old_service.chain_data.multisig, # noqa: E800 - # owner_key=str( - # self.keys_manager.get(key=owner).private_key - # ), # noqa: E800 - # ) # noqa: E800 + # else: # noqa: E800 # ocm = self.get_on_chain_manager(service=old_service) # noqa: E800 # ocm.swap( # noqa: E800 From 4184f208a0e9344c127d9ba0929a18f998c5530a Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Fri, 19 Jul 2024 15:19:11 +0200 Subject: [PATCH 003/134] [no ci] chore: update --- operate/services/manage.py | 1 - 1 file changed, 1 deletion(-) diff --git a/operate/services/manage.py b/operate/services/manage.py index 78f654515..e8d452728 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -374,7 +374,6 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too Deploy as service on-chain :param hash: Service hash - :param update: Update the existing deployment """ self.logger.info("DEPLOY SERVICE ONCHAIN FROM SAFE ====================") From 5eff7eef60c5eb1b81c7c23aae253e0a4e0121bc Mon Sep 17 00:00:00 2001 From: mohandast52 Date: Tue, 23 Jul 2024 16:29:47 +0530 Subject: [PATCH 004/134] feat: Update NotifyRewards component name --- frontend/components/Main/MainRewards.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/components/Main/MainRewards.tsx b/frontend/components/Main/MainRewards.tsx index 8f775b163..50ef32f30 100644 --- a/frontend/components/Main/MainRewards.tsx +++ b/frontend/components/Main/MainRewards.tsx @@ -65,7 +65,7 @@ const DisplayRewards = () => { const SHARE_TEXT = `I just earned my first reward through the Operate app powered by #olas!\n\nDownload the Pearl app:`; const OPERATE_URL = 'https://olas.network/operate?pearl=first-reward'; -const NotifyRewards = () => { +const NotifyRewardsModal = () => { const { isEligibleForRewards, availableRewardsForEpochEth } = useReward(); const { totalOlasBalance } = useBalance(); const { showNotification, store } = useElectronApi(); @@ -179,6 +179,6 @@ const NotifyRewards = () => { export const MainRewards = () => ( <> - + ); From 34d0eb6769c2a86e5d3b6165e5bb1dc3e0406b9a Mon Sep 17 00:00:00 2001 From: mohandast52 Date: Tue, 23 Jul 2024 17:45:01 +0530 Subject: [PATCH 005/134] feat: Add agent eviction alert to MainOlasBalance component --- electron/store.js | 1 + frontend/components/Main/MainOlasBalance.tsx | 84 ++++++++++++++++++-- frontend/components/Main/MainRewards.tsx | 3 + frontend/types/ElectronApi.ts | 1 + 4 files changed, 81 insertions(+), 8 deletions(-) diff --git a/electron/store.js b/electron/store.js index 5577decff..afbc7f62d 100644 --- a/electron/store.js +++ b/electron/store.js @@ -4,6 +4,7 @@ const defaultSchema = { isInitialFunded: { type: 'boolean', default: false }, firstStakingRewardAchieved: { type: 'boolean', default: false }, firstRewardNotificationShown: { type: 'boolean', default: false }, + agentEvictionAlertShown: { type: 'boolean', default: false }, }; const setupStoreIpc = async (ipcChannel, mainWindow, storeInitialValues) => { diff --git a/frontend/components/Main/MainOlasBalance.tsx b/frontend/components/Main/MainOlasBalance.tsx index f51cf2ef9..2595a15bf 100644 --- a/frontend/components/Main/MainOlasBalance.tsx +++ b/frontend/components/Main/MainOlasBalance.tsx @@ -1,17 +1,20 @@ import { InfoCircleOutlined } from '@ant-design/icons'; -import { Flex, Skeleton, Tooltip, Typography } from 'antd'; +import { Button, Flex, Skeleton, Tooltip, Typography } from 'antd'; import { useMemo } from 'react'; import styled from 'styled-components'; +import { Alert } from '@/components/Alert'; import { COLOR } from '@/constants/colors'; import { UNICODE_SYMBOLS } from '@/constants/symbols'; import { useBalance } from '@/hooks/useBalance'; +import { useElectronApi } from '@/hooks/useElectronApi'; import { useReward } from '@/hooks/useReward'; +import { useStore } from '@/hooks/useStore'; import { balanceFormat } from '@/utils/numberFormatters'; import { CardSection } from '../styled/CardSection'; -const { Text } = Typography; +const { Text, Title } = Typography; const Balance = styled.span` letter-spacing: -2px; margin-right: 4px; @@ -103,6 +106,68 @@ const CurrentBalance = () => { ); }; +// const AvoidSuspensionAlert = styled(Alert)` +// .anticon.ant-alert-icon { +// height: 20px; +// width: 20px; +// svg { +// width: 100%; +// height: 100%; +// } +// } +// `; +const AvoidSuspensionAlert = () => { + const { store } = useElectronApi(); + + return ( + + + Avoid suspension! + + + Run your agent for at least half an hour a day to make sure it hits + its targets. If it misses its targets 2 days in a row, it’ll be + suspended. You won’t be able to run it or earn rewards for several + days. + + + + } + style={{ marginBottom: 8 }} + /> + ); +}; + +const AvoidSuspension = () => { + const { storeState } = useStore(); + + // console.log(storeState); + + // If first reward notification is shown BUT + // agent eviction alert is not shown, show this alert + const isAvoidSuspensionAlertShown = + storeState?.firstRewardNotificationShown && + !storeState?.agentEvictionAlertShown; + + if (!isAvoidSuspensionAlertShown) { + return ; + } + + return null; +}; + export const MainOlasBalance = () => { const { isBalanceLoaded, totalOlasBalance } = useBalance(); @@ -113,14 +178,17 @@ export const MainOlasBalance = () => { return ( + {isBalanceLoaded ? ( <> - - - {UNICODE_SYMBOLS.OLAS} - {balance} - OLAS - +
+ + + {UNICODE_SYMBOLS.OLAS} + {balance} + OLAS + +
) : ( diff --git a/frontend/components/Main/MainRewards.tsx b/frontend/components/Main/MainRewards.tsx index 50ef32f30..bb022d1ec 100644 --- a/frontend/components/Main/MainRewards.tsx +++ b/frontend/components/Main/MainRewards.tsx @@ -101,6 +101,9 @@ const NotifyRewardsModal = () => { // once the notification is closed, set the flag to true store?.set?.('firstRewardNotificationShown', true); + + // and show the eviction educate information to the user + // store?.set?.('agentEvictionAlertShown', true); }, [store]); const onTwitterShare = useCallback(() => { diff --git a/frontend/types/ElectronApi.ts b/frontend/types/ElectronApi.ts index 2f586a0d9..df0456a47 100644 --- a/frontend/types/ElectronApi.ts +++ b/frontend/types/ElectronApi.ts @@ -3,6 +3,7 @@ export type ElectronStore = { isInitialFunded?: boolean; firstStakingRewardAchieved?: boolean; firstRewardNotificationShown?: boolean; + agentEvictionAlertShown?: boolean; }; export type ElectronTrayIconStatus = 'low-gas' | 'running' | 'paused'; From 8b59c2a2e0cb89ed4066d1aa82ba21abaf16abbb Mon Sep 17 00:00:00 2001 From: mohandast52 Date: Tue, 23 Jul 2024 17:54:17 +0530 Subject: [PATCH 006/134] feat: Refactor AvoidSuspensionAlert in MainOlasBalance component --- frontend/components/Main/MainOlasBalance.tsx | 121 +++++++++---------- frontend/components/Main/MainRewards.tsx | 3 - 2 files changed, 59 insertions(+), 65 deletions(-) diff --git a/frontend/components/Main/MainOlasBalance.tsx b/frontend/components/Main/MainOlasBalance.tsx index 2595a15bf..38e358350 100644 --- a/frontend/components/Main/MainOlasBalance.tsx +++ b/frontend/components/Main/MainOlasBalance.tsx @@ -106,70 +106,69 @@ const CurrentBalance = () => { ); }; -// const AvoidSuspensionAlert = styled(Alert)` -// .anticon.ant-alert-icon { -// height: 20px; -// width: 20px; -// svg { -// width: 100%; -// height: 100%; -// } -// } -// `; +const AvoidSuspensionAlertContainer = styled.div` + .ant-alert-info { + margin-bottom: 8px; + .anticon.ant-alert-icon { + height: 20px; + width: 20px; + svg { + width: 100%; + height: 100%; + } + } + } +`; + const AvoidSuspensionAlert = () => { const { store } = useElectronApi(); return ( - - - Avoid suspension! - - - Run your agent for at least half an hour a day to make sure it hits - its targets. If it misses its targets 2 days in a row, it’ll be - suspended. You won’t be able to run it or earn rewards for several - days. - - - - } - style={{ marginBottom: 8 }} - /> + + + + Avoid suspension! + + + Run your agent for at least half an hour a day to make sure it + hits its targets. If it misses its targets 2 days in a row, it’ll + be suspended. You won’t be able to run it or earn rewards for + several days. + + + + } + /> + ); }; -const AvoidSuspension = () => { +export const MainOlasBalance = () => { const { storeState } = useStore(); - - // console.log(storeState); + const { isBalanceLoaded, totalOlasBalance } = useBalance(); // If first reward notification is shown BUT - // agent eviction alert is not shown, show this alert - const isAvoidSuspensionAlertShown = - storeState?.firstRewardNotificationShown && - !storeState?.agentEvictionAlertShown; - - if (!isAvoidSuspensionAlertShown) { - return ; - } + // agent eviction alert is NOT yet shown, show this alert. + const canShowAvoidSuspensionAlert = useMemo(() => { + if (!storeState) return false; - return null; -}; - -export const MainOlasBalance = () => { - const { isBalanceLoaded, totalOlasBalance } = useBalance(); + return ( + storeState.firstRewardNotificationShown && + !storeState.agentEvictionAlertShown + ); + }, [storeState]); const balance = useMemo(() => { if (totalOlasBalance === undefined) return '--'; @@ -178,17 +177,15 @@ export const MainOlasBalance = () => { return ( - + {canShowAvoidSuspensionAlert ? : null} {isBalanceLoaded ? ( <> -
- - - {UNICODE_SYMBOLS.OLAS} - {balance} - OLAS - -
+ + + {UNICODE_SYMBOLS.OLAS} + {balance} + OLAS + ) : ( diff --git a/frontend/components/Main/MainRewards.tsx b/frontend/components/Main/MainRewards.tsx index bb022d1ec..50ef32f30 100644 --- a/frontend/components/Main/MainRewards.tsx +++ b/frontend/components/Main/MainRewards.tsx @@ -101,9 +101,6 @@ const NotifyRewardsModal = () => { // once the notification is closed, set the flag to true store?.set?.('firstRewardNotificationShown', true); - - // and show the eviction educate information to the user - // store?.set?.('agentEvictionAlertShown', true); }, [store]); const onTwitterShare = useCallback(() => { From ee0db5afeb7abfc6733a264f6ad13cba6a1398bb Mon Sep 17 00:00:00 2001 From: sarthak_dev Date: Tue, 23 Jul 2024 20:07:27 +0530 Subject: [PATCH 007/134] add download binaries script --- download_binaries.sh | 8 ++++++++ package.json | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) create mode 100755 download_binaries.sh diff --git a/download_binaries.sh b/download_binaries.sh new file mode 100755 index 000000000..eb40216d8 --- /dev/null +++ b/download_binaries.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +ARCH=$1 +BIN_DIR="electron/bins/" +mkdir -p $BIN_DIR + +trader_version=$(poetry run python -c "import yaml; config = yaml.safe_load(open('templates/trader.yaml')); print(config['configuration']['trader_version'])") +curl -L -o "${BIN_DIR}aea_bin" "https://github.com/valory-xyz/trader/releases/download/${trader_version}/trader_bin_${ARCH}" diff --git a/package.json b/package.json index e41167849..fa7de32dc 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,6 @@ "productName": "Pearl", "description": "An all-in-one application designed to streamline your entry into the world of autonomous agents and earning OLAS through staking.", "scripts": { - "build": "rm -rf dist/ && node build.tester.js", "build:frontend": "cd frontend && yarn build && rm -rf ../electron/.next && cp -r .next ../electron/.next && rm -rf ../electron/public && cp -r public ../electron/public", "dev:backend": "poetry run python operate/cli.py", "dev:frontend": "cd frontend && yarn dev", @@ -52,9 +51,10 @@ "install:backend": "poetry install --no-root", "install:frontend": "cd frontend && yarn", "lint:frontend": "cd frontend && yarn lint", - "start": "electron .", + "start": "dotenv -e .env -- yarn electron .", "start:frontend": "cd frontend && yarn start", - "test:frontend": "cd frontend && yarn test" + "test:frontend": "cd frontend && yarn test", + "download-binaries": "sh download_binaries.sh x64" }, "version": "0.1.0-rc71" } From 694ff4e08ccd6ad574c2d063af0021313bb68ddc Mon Sep 17 00:00:00 2001 From: mohandast52 Date: Wed, 24 Jul 2024 16:34:59 +0530 Subject: [PATCH 008/134] chore: Update LOW_BALANCE threshold to 3 --- frontend/constants/thresholds.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/constants/thresholds.ts b/frontend/constants/thresholds.ts index ced09c8c5..f26aa18ef 100644 --- a/frontend/constants/thresholds.ts +++ b/frontend/constants/thresholds.ts @@ -7,4 +7,4 @@ export const MIN_ETH_BALANCE_THRESHOLDS = { }, }; -export const LOW_BALANCE = 0.5; +export const LOW_BALANCE = 3; From 7638b6bcea0dfa95160ab604eb0c12ba749d2e9e Mon Sep 17 00:00:00 2001 From: mohandast52 Date: Wed, 24 Jul 2024 17:17:21 +0530 Subject: [PATCH 009/134] feat: Add low trading balance alert to MainOlasBalance component --- frontend/components/Main/MainOlasBalance.tsx | 45 +++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/frontend/components/Main/MainOlasBalance.tsx b/frontend/components/Main/MainOlasBalance.tsx index f51cf2ef9..e9ed2a132 100644 --- a/frontend/components/Main/MainOlasBalance.tsx +++ b/frontend/components/Main/MainOlasBalance.tsx @@ -3,15 +3,17 @@ import { Flex, Skeleton, Tooltip, Typography } from 'antd'; import { useMemo } from 'react'; import styled from 'styled-components'; +import { Alert } from '@/components/Alert'; import { COLOR } from '@/constants/colors'; import { UNICODE_SYMBOLS } from '@/constants/symbols'; +import { LOW_BALANCE } from '@/constants/thresholds'; import { useBalance } from '@/hooks/useBalance'; import { useReward } from '@/hooks/useReward'; import { balanceFormat } from '@/utils/numberFormatters'; import { CardSection } from '../styled/CardSection'; -const { Text } = Typography; +const { Text, Title } = Typography; const Balance = styled.span` letter-spacing: -2px; margin-right: 4px; @@ -103,6 +105,46 @@ const CurrentBalance = () => { ); }; +const LowTradingBalanceAlertContainer = styled.div` + .ant-alert { + margin-bottom: 8px; + .anticon.ant-alert-icon { + height: 20px; + width: 20px; + svg { + width: 100%; + height: 100%; + } + } + } +`; + +const LowTradingBalanceAlert = () => { + return ( + + + + Trading balance is too low + + + {`To run your agent, add at least $${LOW_BALANCE - 0.5} XDAI to your account.`} + + + Do it quickly to avoid your agent missing its targets and getting + suspended! + + + } + /> + + ); +}; + export const MainOlasBalance = () => { const { isBalanceLoaded, totalOlasBalance } = useBalance(); @@ -113,6 +155,7 @@ export const MainOlasBalance = () => { return ( + {isBalanceLoaded ? ( <> From 802d3c54dc1c986e62981f072c33e473989f1fd8 Mon Sep 17 00:00:00 2001 From: mohandast52 Date: Wed, 24 Jul 2024 17:17:46 +0530 Subject: [PATCH 010/134] fix: Update MainGasBalance component to display 'Too low' status for empty ETH balance --- frontend/components/Main/MainGasBalance.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/components/Main/MainGasBalance.tsx b/frontend/components/Main/MainGasBalance.tsx index 3f8e77487..f370e63c2 100644 --- a/frontend/components/Main/MainGasBalance.tsx +++ b/frontend/components/Main/MainGasBalance.tsx @@ -39,7 +39,7 @@ const BalanceStatus = () => { const status = useMemo(() => { if (!safeBalance || safeBalance.ETH === 0) { - return { statusName: 'Empty', StatusComponent: EmptyDot }; + return { statusName: 'Too low', StatusComponent: EmptyDot }; } if (safeBalance.ETH < LOW_BALANCE) { From a9386a4e6d7d130e6905ff427fe24a7adcf1b4de Mon Sep 17 00:00:00 2001 From: mohandast52 Date: Wed, 24 Jul 2024 18:52:54 +0530 Subject: [PATCH 011/134] Update MainGasBalance component to display 'Too low' status for empty ETH balance --- frontend/components/Main/MainGasBalance.tsx | 9 +-------- frontend/components/Main/MainHeader/index.tsx | 3 +++ frontend/components/Main/MainOlasBalance.tsx | 2 +- frontend/constants/thresholds.ts | 2 +- frontend/context/BalanceProvider.tsx | 8 ++++++++ frontend/hooks/useBalance.ts | 2 ++ 6 files changed, 16 insertions(+), 10 deletions(-) diff --git a/frontend/components/Main/MainGasBalance.tsx b/frontend/components/Main/MainGasBalance.tsx index f370e63c2..98155f1cb 100644 --- a/frontend/components/Main/MainGasBalance.tsx +++ b/frontend/components/Main/MainGasBalance.tsx @@ -30,22 +30,15 @@ const EmptyDot = styled(Dot)` const FineDot = styled(Dot)` background-color: ${COLOR.GREEN_2}; `; -const LowDot = styled(Dot)` - background-color: ${COLOR.ORANGE}; -`; const BalanceStatus = () => { const { safeBalance } = useBalance(); const status = useMemo(() => { - if (!safeBalance || safeBalance.ETH === 0) { + if (!safeBalance || safeBalance.ETH < LOW_BALANCE) { return { statusName: 'Too low', StatusComponent: EmptyDot }; } - if (safeBalance.ETH < LOW_BALANCE) { - return { statusName: 'Low', StatusComponent: LowDot }; - } - return { statusName: 'Fine', StatusComponent: FineDot }; }, [safeBalance]); diff --git a/frontend/components/Main/MainHeader/index.tsx b/frontend/components/Main/MainHeader/index.tsx index 8942363f8..b15e14ad0 100644 --- a/frontend/components/Main/MainHeader/index.tsx +++ b/frontend/components/Main/MainHeader/index.tsx @@ -263,6 +263,8 @@ export const MainHeader = () => { if (safeOlasBalanceWithStaked === undefined) return false; if (!services) return false; + if (!safeBalance || safeBalance.ETH < LOW_BALANCE) return false; + // deployment statuses where agent should not be deployed // if (serviceStatus === DeploymentStatus.DEPLOYED) return false; // condition already checked above if (serviceStatus === DeploymentStatus.DEPLOYING) return false; @@ -303,6 +305,7 @@ export const MainHeader = () => { totalEthBalance, isEligibleForStakingAction, canStartEvictedAgent, + safeBalance, ]); return ( diff --git a/frontend/components/Main/MainOlasBalance.tsx b/frontend/components/Main/MainOlasBalance.tsx index e9ed2a132..e4327b7a0 100644 --- a/frontend/components/Main/MainOlasBalance.tsx +++ b/frontend/components/Main/MainOlasBalance.tsx @@ -132,7 +132,7 @@ const LowTradingBalanceAlert = () => { Trading balance is too low - {`To run your agent, add at least $${LOW_BALANCE - 0.5} XDAI to your account.`} + {`To run your agent, add at least $${LOW_BALANCE} XDAI to your account.`} Do it quickly to avoid your agent missing its targets and getting diff --git a/frontend/constants/thresholds.ts b/frontend/constants/thresholds.ts index f26aa18ef..fb5ab3515 100644 --- a/frontend/constants/thresholds.ts +++ b/frontend/constants/thresholds.ts @@ -7,4 +7,4 @@ export const MIN_ETH_BALANCE_THRESHOLDS = { }, }; -export const LOW_BALANCE = 3; +export const LOW_BALANCE = 2; diff --git a/frontend/context/BalanceProvider.tsx b/frontend/context/BalanceProvider.tsx index 12c5400ec..6d56d186c 100644 --- a/frontend/context/BalanceProvider.tsx +++ b/frontend/context/BalanceProvider.tsx @@ -16,6 +16,7 @@ import { useInterval } from 'usehooks-ts'; import { Wallet } from '@/client'; import { FIVE_SECONDS_INTERVAL } from '@/constants/intervals'; +import { LOW_BALANCE } from '@/constants/thresholds'; import { TOKENS } from '@/constants/tokens'; import { ServiceRegistryL2ServiceState } from '@/enums/ServiceRegistryL2ServiceState'; import { Token } from '@/enums/Token'; @@ -41,6 +42,8 @@ export const BalanceContext = createContext<{ olasDepositBalance?: number; eoaBalance?: ValueOf; safeBalance?: ValueOf; + /** If the safe balance is below the threshold (LOW_BALANCE) */ + isSafeBalanceBelowThreshold: boolean; totalEthBalance?: number; totalOlasBalance?: number; wallets?: Wallet[]; @@ -56,6 +59,7 @@ export const BalanceContext = createContext<{ olasDepositBalance: undefined, eoaBalance: undefined, safeBalance: undefined, + isSafeBalanceBelowThreshold: true, totalEthBalance: undefined, totalOlasBalance: undefined, wallets: undefined, @@ -195,6 +199,9 @@ export const BalanceProvider = ({ children }: PropsWithChildren) => { () => masterSafeAddress && walletBalances[masterSafeAddress], [masterSafeAddress, walletBalances], ); + const isSafeBalanceBelowThreshold = safeBalance + ? safeBalance.ETH < LOW_BALANCE + : false; useInterval( () => { @@ -213,6 +220,7 @@ export const BalanceProvider = ({ children }: PropsWithChildren) => { olasDepositBalance, eoaBalance, safeBalance, + isSafeBalanceBelowThreshold, totalEthBalance, totalOlasBalance, wallets, diff --git a/frontend/hooks/useBalance.ts b/frontend/hooks/useBalance.ts index 4132572a1..8fdac2716 100644 --- a/frontend/hooks/useBalance.ts +++ b/frontend/hooks/useBalance.ts @@ -9,6 +9,7 @@ export const useBalance = () => { isBalanceLoaded, eoaBalance, safeBalance, + isSafeBalanceBelowThreshold, totalEthBalance, totalOlasBalance, wallets, @@ -24,6 +25,7 @@ export const useBalance = () => { isBalanceLoaded, eoaBalance, safeBalance, + isSafeBalanceBelowThreshold, totalEthBalance, totalOlasBalance, wallets, From 9be7b1fcb3e5346d92cae1c0aeab16f6c1796635 Mon Sep 17 00:00:00 2001 From: SarthakDev12 Date: Wed, 24 Jul 2024 19:50:43 +0530 Subject: [PATCH 012/134] make requested changes --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index fa7de32dc..2c75d489c 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,8 @@ "install:backend": "poetry install --no-root", "install:frontend": "cd frontend && yarn", "lint:frontend": "cd frontend && yarn lint", - "start": "dotenv -e .env -- yarn electron .", + "start": "yarn electron .", + "dev": "dotenv -e .env -- yarn start", "start:frontend": "cd frontend && yarn start", "test:frontend": "cd frontend && yarn test", "download-binaries": "sh download_binaries.sh x64" From 8550c0de17ab31235192831ec8063fbdb4cfbb4f Mon Sep 17 00:00:00 2001 From: mohandast52 Date: Thu, 25 Jul 2024 00:50:44 +0530 Subject: [PATCH 013/134] chore: Update MainHeader component to prevent starting agent with low balance --- frontend/components/Main/MainHeader/index.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/frontend/components/Main/MainHeader/index.tsx b/frontend/components/Main/MainHeader/index.tsx index b15e14ad0..13a73c94c 100644 --- a/frontend/components/Main/MainHeader/index.tsx +++ b/frontend/components/Main/MainHeader/index.tsx @@ -263,7 +263,15 @@ export const MainHeader = () => { if (safeOlasBalanceWithStaked === undefined) return false; if (!services) return false; - if (!safeBalance || safeBalance.ETH < LOW_BALANCE) return false; + // if the agent is NOT running and the balance is too low, + // user should not be able to start the agent + if ( + serviceButtonState === ServiceButtonLoadingState.NotLoading && + safeBalance && + safeBalance.ETH < LOW_BALANCE + ) { + return false; + } // deployment statuses where agent should not be deployed // if (serviceStatus === DeploymentStatus.DEPLOYED) return false; // condition already checked above From b5e27b0c8dc738e5df80304409aa49ead515e3ec Mon Sep 17 00:00:00 2001 From: mohandast52 Date: Thu, 25 Jul 2024 01:19:37 +0530 Subject: [PATCH 014/134] feat: Show low balance notification in MainGasBalance component --- frontend/components/Main/MainGasBalance.tsx | 32 +++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/frontend/components/Main/MainGasBalance.tsx b/frontend/components/Main/MainGasBalance.tsx index 98155f1cb..7dbd78181 100644 --- a/frontend/components/Main/MainGasBalance.tsx +++ b/frontend/components/Main/MainGasBalance.tsx @@ -1,11 +1,12 @@ import { ArrowUpOutlined, InfoCircleOutlined } from '@ant-design/icons'; import { Skeleton, Tooltip, Typography } from 'antd'; -import { useMemo } from 'react'; +import { useEffect, useMemo, useState } from 'react'; import styled from 'styled-components'; import { COLOR } from '@/constants/colors'; import { LOW_BALANCE } from '@/constants/thresholds'; import { useBalance } from '@/hooks/useBalance'; +import { useElectronApi } from '@/hooks/useElectronApi'; import { useWallet } from '@/hooks/useWallet'; import { CardSection } from '../styled/CardSection'; @@ -32,7 +33,34 @@ const FineDot = styled(Dot)` `; const BalanceStatus = () => { - const { safeBalance } = useBalance(); + const { isBalanceLoaded, safeBalance } = useBalance(); + const { showNotification } = useElectronApi(); + + const [isLowBalanceNotificationShown, setIsLowBalanceNotificationShown] = + useState(false); + + // show notification if balance is too low + useEffect(() => { + if (!isBalanceLoaded) return; + if (!safeBalance) return; + if (!showNotification) return; + + if (safeBalance.ETH < LOW_BALANCE && !isLowBalanceNotificationShown) { + showNotification('Trading balance is too low'); + setIsLowBalanceNotificationShown(true); + } + + // if already shown and the balance has increased, + // can show the notification again if it goes below the threshold + if (safeBalance.ETH >= LOW_BALANCE && isLowBalanceNotificationShown) { + setIsLowBalanceNotificationShown(false); + } + }, [ + isBalanceLoaded, + isLowBalanceNotificationShown, + safeBalance, + showNotification, + ]); const status = useMemo(() => { if (!safeBalance || safeBalance.ETH < LOW_BALANCE) { From 82e229bbc69712f8c59196145b624b165f8f32b4 Mon Sep 17 00:00:00 2001 From: mohandast52 Date: Thu, 25 Jul 2024 01:27:31 +0530 Subject: [PATCH 015/134] chore: Remove unused isSafeBalanceBelowThreshold property from BalanceContext --- frontend/context/BalanceProvider.tsx | 8 -------- frontend/hooks/useBalance.ts | 2 -- 2 files changed, 10 deletions(-) diff --git a/frontend/context/BalanceProvider.tsx b/frontend/context/BalanceProvider.tsx index 6d56d186c..12c5400ec 100644 --- a/frontend/context/BalanceProvider.tsx +++ b/frontend/context/BalanceProvider.tsx @@ -16,7 +16,6 @@ import { useInterval } from 'usehooks-ts'; import { Wallet } from '@/client'; import { FIVE_SECONDS_INTERVAL } from '@/constants/intervals'; -import { LOW_BALANCE } from '@/constants/thresholds'; import { TOKENS } from '@/constants/tokens'; import { ServiceRegistryL2ServiceState } from '@/enums/ServiceRegistryL2ServiceState'; import { Token } from '@/enums/Token'; @@ -42,8 +41,6 @@ export const BalanceContext = createContext<{ olasDepositBalance?: number; eoaBalance?: ValueOf; safeBalance?: ValueOf; - /** If the safe balance is below the threshold (LOW_BALANCE) */ - isSafeBalanceBelowThreshold: boolean; totalEthBalance?: number; totalOlasBalance?: number; wallets?: Wallet[]; @@ -59,7 +56,6 @@ export const BalanceContext = createContext<{ olasDepositBalance: undefined, eoaBalance: undefined, safeBalance: undefined, - isSafeBalanceBelowThreshold: true, totalEthBalance: undefined, totalOlasBalance: undefined, wallets: undefined, @@ -199,9 +195,6 @@ export const BalanceProvider = ({ children }: PropsWithChildren) => { () => masterSafeAddress && walletBalances[masterSafeAddress], [masterSafeAddress, walletBalances], ); - const isSafeBalanceBelowThreshold = safeBalance - ? safeBalance.ETH < LOW_BALANCE - : false; useInterval( () => { @@ -220,7 +213,6 @@ export const BalanceProvider = ({ children }: PropsWithChildren) => { olasDepositBalance, eoaBalance, safeBalance, - isSafeBalanceBelowThreshold, totalEthBalance, totalOlasBalance, wallets, diff --git a/frontend/hooks/useBalance.ts b/frontend/hooks/useBalance.ts index 8fdac2716..4132572a1 100644 --- a/frontend/hooks/useBalance.ts +++ b/frontend/hooks/useBalance.ts @@ -9,7 +9,6 @@ export const useBalance = () => { isBalanceLoaded, eoaBalance, safeBalance, - isSafeBalanceBelowThreshold, totalEthBalance, totalOlasBalance, wallets, @@ -25,7 +24,6 @@ export const useBalance = () => { isBalanceLoaded, eoaBalance, safeBalance, - isSafeBalanceBelowThreshold, totalEthBalance, totalOlasBalance, wallets, From d5a884aad803b1830268640478e285e0850d19a3 Mon Sep 17 00:00:00 2001 From: Ardian Date: Tue, 23 Jul 2024 17:53:55 +0200 Subject: [PATCH 016/134] fix: remove invalid services --- operate/services/manage.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/operate/services/manage.py b/operate/services/manage.py index 927fff7cc..4d3041b93 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -111,8 +111,14 @@ def json(self) -> t.List[t.Dict]: continue if not path.name.startswith("bafybei"): continue - service = Service.load(path=path) - data.append(service.json) + try: + service = Service.load(path=path) + data.append(service.json) + except Exception as e: + self.logger.warning(f"Failed to load service: {path.name}. Exception: {e}") + # delete the invalid path + shutil.rmtree(path) + self.logger.info(f"Deleted invalid service: {path.name}") return data def exists(self, service: str) -> bool: From 29bf7d6419e91de56d28d1ed2e93c153511fe6af Mon Sep 17 00:00:00 2001 From: Ardian Date: Wed, 24 Jul 2024 10:23:16 +0200 Subject: [PATCH 017/134] release: rc86 --- electron/install.js | 2 +- package.json | 2 +- pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/electron/install.js b/electron/install.js index ba13ac9f8..04893a6dc 100644 --- a/electron/install.js +++ b/electron/install.js @@ -13,7 +13,7 @@ const { paths } = require('./constants'); * - use "" (nothing as a suffix) for latest release candidate, for example "0.1.0rc26" * - use "alpha" for alpha release, for example "0.1.0rc26-alpha" */ -const OlasMiddlewareVersion = '0.1.0rc71'; +const OlasMiddlewareVersion = '0.1.0rc86'; const Env = { ...process.env, diff --git a/package.json b/package.json index e41167849..967f801ce 100644 --- a/package.json +++ b/package.json @@ -56,5 +56,5 @@ "start:frontend": "cd frontend && yarn start", "test:frontend": "cd frontend && yarn test" }, - "version": "0.1.0-rc71" + "version": "0.1.0-rc86" } diff --git a/pyproject.toml b/pyproject.toml index 8ac78d250..71d3158cb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "olas-operate-middleware" -version = "0.1.0-rc71" +version = "0.1.0-rc86" description = "" authors = ["David Vilela ", "Viraj Patel "] readme = "README.md" From 8232ff5c1ef50cc94ae656a23e65f1e485cd41b7 Mon Sep 17 00:00:00 2001 From: Ardian Date: Thu, 25 Jul 2024 11:02:42 +0200 Subject: [PATCH 018/134] chore: lint --- operate/services/manage.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/operate/services/manage.py b/operate/services/manage.py index 4d3041b93..2673b991c 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -114,8 +114,10 @@ def json(self) -> t.List[t.Dict]: try: service = Service.load(path=path) data.append(service.json) - except Exception as e: - self.logger.warning(f"Failed to load service: {path.name}. Exception: {e}") + except Exception as e: # pylint: disable=broad-except + self.logger.warning( + f"Failed to load service: {path.name}. Exception: {e}" + ) # delete the invalid path shutil.rmtree(path) self.logger.info(f"Deleted invalid service: {path.name}") From 3ae15add1137d68cc8a6fbfcf7b2e6fa15ed7d6b Mon Sep 17 00:00:00 2001 From: SarthakDev12 Date: Thu, 25 Jul 2024 14:51:17 +0530 Subject: [PATCH 019/134] fix unstyled text visible after splash screen --- frontend/components/Loading.tsx | 9 +++++++ frontend/pages/_app.tsx | 27 ++++++++++++++++++- frontend/pages/_document.tsx | 47 +++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 frontend/components/Loading.tsx create mode 100644 frontend/pages/_document.tsx diff --git a/frontend/components/Loading.tsx b/frontend/components/Loading.tsx new file mode 100644 index 000000000..aa3570888 --- /dev/null +++ b/frontend/components/Loading.tsx @@ -0,0 +1,9 @@ +import styled from 'styled-components'; + +const LoadingWrapper = styled.div` + background-color: #0000; +`; + +const Loading = () => ; + +export default Loading; diff --git a/frontend/pages/_app.tsx b/frontend/pages/_app.tsx index 7a6c2efe8..442d6e14c 100644 --- a/frontend/pages/_app.tsx +++ b/frontend/pages/_app.tsx @@ -2,7 +2,7 @@ import '../styles/globals.scss'; import { ConfigProvider } from 'antd'; import type { AppProps } from 'next/app'; -import { useEffect, useRef } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { Layout } from '@/components/Layout'; import { BalanceProvider } from '@/context/BalanceProvider'; @@ -18,17 +18,42 @@ import { StakingContractInfoProvider } from '@/context/StakingContractInfoProvid import { StoreProvider } from '@/context/StoreProvider'; import { WalletProvider } from '@/context/WalletProvider'; import { mainTheme } from '@/theme'; +import Loading from '@/components/Loading'; export default function App({ Component, pageProps }: AppProps) { const isMounted = useRef(false); + const [isLoaded, setIsLoaded] = useState(false); + const [loadingTimeReached, setLoadingTimeReached] = useState(false); useEffect(() => { isMounted.current = true; + + const handleLoad = () => { + setIsLoaded(true); + }; + const checkStylesLoaded = () => { + const styles = document.querySelectorAll('link[rel="stylesheet"]'); + if (styles.length > 0) { + handleLoad(); + } + }; + + const timer = setTimeout(() => { + setLoadingTimeReached(true); + }, 1000); + + checkStylesLoaded(); + window.addEventListener('load', checkStylesLoaded); return () => { isMounted.current = false; + clearTimeout(timer); + window.removeEventListener('load', checkStylesLoaded); }; }, []); + if (!loadingTimeReached || !isLoaded) { + return ; + } return ( diff --git a/frontend/pages/_document.tsx b/frontend/pages/_document.tsx new file mode 100644 index 000000000..2d1d90e53 --- /dev/null +++ b/frontend/pages/_document.tsx @@ -0,0 +1,47 @@ +// _document.tsx +import Document, { Html, Head, Main, NextScript, DocumentContext, DocumentInitialProps } from 'next/document'; +import { ServerStyleSheet } from 'styled-components'; + +class MyDocument extends Document { + static async getInitialProps(ctx: DocumentContext): Promise { + const sheet = new ServerStyleSheet(); + const originalRenderPage = ctx.renderPage; + + try { + ctx.renderPage = () => + originalRenderPage({ + enhanceApp: (App) => (props) => sheet.collectStyles(), + }); + + const initialProps = await Document.getInitialProps(ctx); + return { + ...initialProps, + styles: ( + <> + {initialProps.styles} + {sheet.getStyleElement()} + + ), + }; + } finally { + sheet.seal(); + } + } + + render() { + return ( + + + + + + +
+ + + + ); + } +} + +export default MyDocument; From 66b0943d62cab0de5b7318c1c703fda4e9934f69 Mon Sep 17 00:00:00 2001 From: SarthakDev12 Date: Thu, 25 Jul 2024 16:14:31 +0530 Subject: [PATCH 020/134] add both variant x64 and arm64 in script --- download_binaries.sh | 6 ++++-- package.json | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/download_binaries.sh b/download_binaries.sh index eb40216d8..db12c6223 100755 --- a/download_binaries.sh +++ b/download_binaries.sh @@ -1,8 +1,10 @@ #!/bin/bash -ARCH=$1 BIN_DIR="electron/bins/" mkdir -p $BIN_DIR trader_version=$(poetry run python -c "import yaml; config = yaml.safe_load(open('templates/trader.yaml')); print(config['configuration']['trader_version'])") -curl -L -o "${BIN_DIR}aea_bin" "https://github.com/valory-xyz/trader/releases/download/${trader_version}/trader_bin_${ARCH}" + +curl -L -o "${BIN_DIR}aea_bin_x64" "https://github.com/valory-xyz/trader/releases/download/${trader_version}/trader_bin_x64" + +curl -L -o "${BIN_DIR}aea_bin_arm64" "https://github.com/valory-xyz/trader/releases/download/${trader_version}/trader_bin_arm64" diff --git a/package.json b/package.json index 2c75d489c..b116e7068 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "dev": "dotenv -e .env -- yarn start", "start:frontend": "cd frontend && yarn start", "test:frontend": "cd frontend && yarn test", - "download-binaries": "sh download_binaries.sh x64" + "download-binaries": "sh download_binaries.sh" }, "version": "0.1.0-rc71" } From fecab4899fb37194e4d119795b59a3898cab7ed6 Mon Sep 17 00:00:00 2001 From: SarthakDev12 Date: Thu, 25 Jul 2024 18:14:40 +0530 Subject: [PATCH 021/134] Fix linting --- frontend/pages/_app.tsx | 10 +++++----- frontend/pages/_document.tsx | 16 +++++++++++++--- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/frontend/pages/_app.tsx b/frontend/pages/_app.tsx index 442d6e14c..2d4394736 100644 --- a/frontend/pages/_app.tsx +++ b/frontend/pages/_app.tsx @@ -5,6 +5,7 @@ import type { AppProps } from 'next/app'; import { useEffect, useRef, useState } from 'react'; import { Layout } from '@/components/Layout'; +import Loading from '@/components/Loading'; import { BalanceProvider } from '@/context/BalanceProvider'; import { ElectronApiProvider } from '@/context/ElectronApiProvider'; import { MasterSafeProvider } from '@/context/MasterSafeProvider'; @@ -18,11 +19,10 @@ import { StakingContractInfoProvider } from '@/context/StakingContractInfoProvid import { StoreProvider } from '@/context/StoreProvider'; import { WalletProvider } from '@/context/WalletProvider'; import { mainTheme } from '@/theme'; -import Loading from '@/components/Loading'; export default function App({ Component, pageProps }: AppProps) { const isMounted = useRef(false); - const [isLoaded, setIsLoaded] = useState(false); + const [isLoaded, setIsLoaded] = useState(false); const [loadingTimeReached, setLoadingTimeReached] = useState(false); useEffect(() => { @@ -31,14 +31,14 @@ export default function App({ Component, pageProps }: AppProps) { const handleLoad = () => { setIsLoaded(true); }; - const checkStylesLoaded = () => { + const checkStylesLoaded = () => { const styles = document.querySelectorAll('link[rel="stylesheet"]'); if (styles.length > 0) { handleLoad(); } }; - const timer = setTimeout(() => { + const timer = setTimeout(() => { setLoadingTimeReached(true); }, 1000); @@ -51,7 +51,7 @@ export default function App({ Component, pageProps }: AppProps) { }; }, []); - if (!loadingTimeReached || !isLoaded) { + if (!loadingTimeReached || !isLoaded) { return ; } return ( diff --git a/frontend/pages/_document.tsx b/frontend/pages/_document.tsx index 2d1d90e53..722104270 100644 --- a/frontend/pages/_document.tsx +++ b/frontend/pages/_document.tsx @@ -1,16 +1,26 @@ // _document.tsx -import Document, { Html, Head, Main, NextScript, DocumentContext, DocumentInitialProps } from 'next/document'; +import Document, { + DocumentContext, + DocumentInitialProps, + Head, + Html, + Main, + NextScript, +} from 'next/document'; import { ServerStyleSheet } from 'styled-components'; class MyDocument extends Document { - static async getInitialProps(ctx: DocumentContext): Promise { + static async getInitialProps( + ctx: DocumentContext, + ): Promise { const sheet = new ServerStyleSheet(); const originalRenderPage = ctx.renderPage; try { ctx.renderPage = () => originalRenderPage({ - enhanceApp: (App) => (props) => sheet.collectStyles(), + enhanceApp: (App) => (props) => + sheet.collectStyles(), }); const initialProps = await Document.getInitialProps(ctx); From 3b95c45f4ab10ae3bdf9fe7ce19b9a9e8429a7b1 Mon Sep 17 00:00:00 2001 From: mohandast52 Date: Thu, 25 Jul 2024 19:19:37 +0530 Subject: [PATCH 022/134] feat: Add low trading balance alert to MainOlasBalance component --- frontend/components/Main/MainOlasBalance.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frontend/components/Main/MainOlasBalance.tsx b/frontend/components/Main/MainOlasBalance.tsx index e4327b7a0..46a26d780 100644 --- a/frontend/components/Main/MainOlasBalance.tsx +++ b/frontend/components/Main/MainOlasBalance.tsx @@ -120,6 +120,12 @@ const LowTradingBalanceAlertContainer = styled.div` `; const LowTradingBalanceAlert = () => { + const { isBalanceLoaded, safeBalance } = useBalance(); + + if (!isBalanceLoaded) return null; + if (!safeBalance) return null; + if (safeBalance.ETH >= LOW_BALANCE) return null; + return ( Date: Thu, 25 Jul 2024 19:43:20 +0530 Subject: [PATCH 023/134] feat: update comment --- frontend/components/Main/MainGasBalance.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/components/Main/MainGasBalance.tsx b/frontend/components/Main/MainGasBalance.tsx index 7dbd78181..f9eb5de6a 100644 --- a/frontend/components/Main/MainGasBalance.tsx +++ b/frontend/components/Main/MainGasBalance.tsx @@ -46,12 +46,12 @@ const BalanceStatus = () => { if (!showNotification) return; if (safeBalance.ETH < LOW_BALANCE && !isLowBalanceNotificationShown) { - showNotification('Trading balance is too low'); + showNotification('Trading balance is too low.'); setIsLowBalanceNotificationShown(true); } - // if already shown and the balance has increased, - // can show the notification again if it goes below the threshold + // If it has already been shown and the balance has increased, + // should show the notification again if it goes below the threshold. if (safeBalance.ETH >= LOW_BALANCE && isLowBalanceNotificationShown) { setIsLowBalanceNotificationShown(false); } From 4ffddccfde68aa889cb21ec8141f56ec6fb7eade Mon Sep 17 00:00:00 2001 From: SarthakDev12 Date: Fri, 26 Jul 2024 12:18:13 +0530 Subject: [PATCH 024/134] make recommended changes --- frontend/components/Loading.tsx | 9 ------ frontend/pages/_app.tsx | 43 ++++--------------------- frontend/pages/_document.tsx | 57 --------------------------------- 3 files changed, 7 insertions(+), 102 deletions(-) delete mode 100644 frontend/components/Loading.tsx delete mode 100644 frontend/pages/_document.tsx diff --git a/frontend/components/Loading.tsx b/frontend/components/Loading.tsx deleted file mode 100644 index aa3570888..000000000 --- a/frontend/components/Loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import styled from 'styled-components'; - -const LoadingWrapper = styled.div` - background-color: #0000; -`; - -const Loading = () => ; - -export default Loading; diff --git a/frontend/pages/_app.tsx b/frontend/pages/_app.tsx index 2d4394736..68727cf8c 100644 --- a/frontend/pages/_app.tsx +++ b/frontend/pages/_app.tsx @@ -2,10 +2,9 @@ import '../styles/globals.scss'; import { ConfigProvider } from 'antd'; import type { AppProps } from 'next/app'; -import { useEffect, useRef, useState } from 'react'; +import { useEffect, useState } from 'react'; import { Layout } from '@/components/Layout'; -import Loading from '@/components/Loading'; import { BalanceProvider } from '@/context/BalanceProvider'; import { ElectronApiProvider } from '@/context/ElectronApiProvider'; import { MasterSafeProvider } from '@/context/MasterSafeProvider'; @@ -21,39 +20,11 @@ import { WalletProvider } from '@/context/WalletProvider'; import { mainTheme } from '@/theme'; export default function App({ Component, pageProps }: AppProps) { - const isMounted = useRef(false); - const [isLoaded, setIsLoaded] = useState(false); - const [loadingTimeReached, setLoadingTimeReached] = useState(false); - + const [isMounted, setIsMounted] = useState(false); useEffect(() => { - isMounted.current = true; - - const handleLoad = () => { - setIsLoaded(true); - }; - const checkStylesLoaded = () => { - const styles = document.querySelectorAll('link[rel="stylesheet"]'); - if (styles.length > 0) { - handleLoad(); - } - }; - - const timer = setTimeout(() => { - setLoadingTimeReached(true); - }, 1000); - - checkStylesLoaded(); - window.addEventListener('load', checkStylesLoaded); - return () => { - isMounted.current = false; - clearTimeout(timer); - window.removeEventListener('load', checkStylesLoaded); - }; + setIsMounted(true); }, []); - if (!loadingTimeReached || !isLoaded) { - return ; - } return ( @@ -67,13 +38,13 @@ export default function App({ Component, pageProps }: AppProps) { - {isMounted ? ( - + + {isMounted ? ( - - ) : null} + ) : null} + diff --git a/frontend/pages/_document.tsx b/frontend/pages/_document.tsx deleted file mode 100644 index 722104270..000000000 --- a/frontend/pages/_document.tsx +++ /dev/null @@ -1,57 +0,0 @@ -// _document.tsx -import Document, { - DocumentContext, - DocumentInitialProps, - Head, - Html, - Main, - NextScript, -} from 'next/document'; -import { ServerStyleSheet } from 'styled-components'; - -class MyDocument extends Document { - static async getInitialProps( - ctx: DocumentContext, - ): Promise { - const sheet = new ServerStyleSheet(); - const originalRenderPage = ctx.renderPage; - - try { - ctx.renderPage = () => - originalRenderPage({ - enhanceApp: (App) => (props) => - sheet.collectStyles(), - }); - - const initialProps = await Document.getInitialProps(ctx); - return { - ...initialProps, - styles: ( - <> - {initialProps.styles} - {sheet.getStyleElement()} - - ), - }; - } finally { - sheet.seal(); - } - } - - render() { - return ( - - - - - - -
- - - - ); - } -} - -export default MyDocument; From e3cb6c0bbece2be6272815de9905ba854a658f80 Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Fri, 26 Jul 2024 13:21:27 +0200 Subject: [PATCH 025/134] chore: bump framework --- poetry.lock | 889 +++++++++++++++++++++++-------------------------- pyproject.toml | 12 +- 2 files changed, 430 insertions(+), 471 deletions(-) diff --git a/poetry.lock b/poetry.lock index f98e0f9a6..fd3b19a72 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,10 +1,9 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "aiohttp" version = "3.9.5" description = "Async http client/server framework (asyncio)" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -101,7 +100,6 @@ speedups = ["Brotli", "aiodns", "brotlicffi"] name = "aiosignal" version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -116,7 +114,6 @@ frozenlist = ">=1.1.0" name = "altgraph" version = "0.17.4" description = "Python graph (network) package" -category = "main" optional = false python-versions = "*" files = [ @@ -128,7 +125,6 @@ files = [ name = "annotated-types" version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -140,7 +136,6 @@ files = [ name = "anyio" version = "4.4.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -163,7 +158,6 @@ trio = ["trio (>=0.23)"] name = "asn1crypto" version = "1.5.1" description = "Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, PKCS#5, X.509 and TSP" -category = "main" optional = false python-versions = "*" files = [ @@ -175,7 +169,6 @@ files = [ name = "async-timeout" version = "4.0.3" description = "Timeout context manager for asyncio programs" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -187,7 +180,6 @@ files = [ name = "attrs" version = "23.2.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -207,7 +199,6 @@ tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "p name = "backoff" version = "2.2.1" description = "Function decoration for backoff and retry" -category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -219,7 +210,6 @@ files = [ name = "base58" version = "2.1.1" description = "Base58 and Base58Check implementation." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -232,39 +222,38 @@ tests = ["PyHamcrest (>=2.0.2)", "mypy", "pytest (>=4.6)", "pytest-benchmark", " [[package]] name = "bcrypt" -version = "4.1.3" +version = "4.2.0" description = "Modern password hashing for your software and your servers" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "bcrypt-4.1.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:48429c83292b57bf4af6ab75809f8f4daf52aa5d480632e53707805cc1ce9b74"}, - {file = "bcrypt-4.1.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a8bea4c152b91fd8319fef4c6a790da5c07840421c2b785084989bf8bbb7455"}, - {file = "bcrypt-4.1.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d3b317050a9a711a5c7214bf04e28333cf528e0ed0ec9a4e55ba628d0f07c1a"}, - {file = "bcrypt-4.1.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:094fd31e08c2b102a14880ee5b3d09913ecf334cd604af27e1013c76831f7b05"}, - {file = "bcrypt-4.1.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4fb253d65da30d9269e0a6f4b0de32bd657a0208a6f4e43d3e645774fb5457f3"}, - {file = "bcrypt-4.1.3-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:193bb49eeeb9c1e2db9ba65d09dc6384edd5608d9d672b4125e9320af9153a15"}, - {file = "bcrypt-4.1.3-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:8cbb119267068c2581ae38790e0d1fbae65d0725247a930fc9900c285d95725d"}, - {file = "bcrypt-4.1.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6cac78a8d42f9d120b3987f82252bdbeb7e6e900a5e1ba37f6be6fe4e3848286"}, - {file = "bcrypt-4.1.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:01746eb2c4299dd0ae1670234bf77704f581dd72cc180f444bfe74eb80495b64"}, - {file = "bcrypt-4.1.3-cp37-abi3-win32.whl", hash = "sha256:037c5bf7c196a63dcce75545c8874610c600809d5d82c305dd327cd4969995bf"}, - {file = "bcrypt-4.1.3-cp37-abi3-win_amd64.whl", hash = "sha256:8a893d192dfb7c8e883c4576813bf18bb9d59e2cfd88b68b725990f033f1b978"}, - {file = "bcrypt-4.1.3-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:0d4cf6ef1525f79255ef048b3489602868c47aea61f375377f0d00514fe4a78c"}, - {file = "bcrypt-4.1.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5698ce5292a4e4b9e5861f7e53b1d89242ad39d54c3da451a93cac17b61921a"}, - {file = "bcrypt-4.1.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec3c2e1ca3e5c4b9edb94290b356d082b721f3f50758bce7cce11d8a7c89ce84"}, - {file = "bcrypt-4.1.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3a5be252fef513363fe281bafc596c31b552cf81d04c5085bc5dac29670faa08"}, - {file = "bcrypt-4.1.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5f7cd3399fbc4ec290378b541b0cf3d4398e4737a65d0f938c7c0f9d5e686611"}, - {file = "bcrypt-4.1.3-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:c4c8d9b3e97209dd7111bf726e79f638ad9224b4691d1c7cfefa571a09b1b2d6"}, - {file = "bcrypt-4.1.3-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:31adb9cbb8737a581a843e13df22ffb7c84638342de3708a98d5c986770f2834"}, - {file = "bcrypt-4.1.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:551b320396e1d05e49cc18dd77d970accd52b322441628aca04801bbd1d52a73"}, - {file = "bcrypt-4.1.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6717543d2c110a155e6821ce5670c1f512f602eabb77dba95717ca76af79867d"}, - {file = "bcrypt-4.1.3-cp39-abi3-win32.whl", hash = "sha256:6004f5229b50f8493c49232b8e75726b568535fd300e5039e255d919fc3a07f2"}, - {file = "bcrypt-4.1.3-cp39-abi3-win_amd64.whl", hash = "sha256:2505b54afb074627111b5a8dc9b6ae69d0f01fea65c2fcaea403448c503d3991"}, - {file = "bcrypt-4.1.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:cb9c707c10bddaf9e5ba7cdb769f3e889e60b7d4fea22834b261f51ca2b89fed"}, - {file = "bcrypt-4.1.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9f8ea645eb94fb6e7bea0cf4ba121c07a3a182ac52876493870033141aa687bc"}, - {file = "bcrypt-4.1.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:f44a97780677e7ac0ca393bd7982b19dbbd8d7228c1afe10b128fd9550eef5f1"}, - {file = "bcrypt-4.1.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d84702adb8f2798d813b17d8187d27076cca3cd52fe3686bb07a9083930ce650"}, - {file = "bcrypt-4.1.3.tar.gz", hash = "sha256:2ee15dd749f5952fe3f0430d0ff6b74082e159c50332a1413d51b5689cf06623"}, + {file = "bcrypt-4.2.0-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:096a15d26ed6ce37a14c1ac1e48119660f21b24cba457f160a4b830f3fe6b5cb"}, + {file = "bcrypt-4.2.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c02d944ca89d9b1922ceb8a46460dd17df1ba37ab66feac4870f6862a1533c00"}, + {file = "bcrypt-4.2.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d84cf6d877918620b687b8fd1bf7781d11e8a0998f576c7aa939776b512b98d"}, + {file = "bcrypt-4.2.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:1bb429fedbe0249465cdd85a58e8376f31bb315e484f16e68ca4c786dcc04291"}, + {file = "bcrypt-4.2.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:655ea221910bcac76ea08aaa76df427ef8625f92e55a8ee44fbf7753dbabb328"}, + {file = "bcrypt-4.2.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:1ee38e858bf5d0287c39b7a1fc59eec64bbf880c7d504d3a06a96c16e14058e7"}, + {file = "bcrypt-4.2.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:0da52759f7f30e83f1e30a888d9163a81353ef224d82dc58eb5bb52efcabc399"}, + {file = "bcrypt-4.2.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3698393a1b1f1fd5714524193849d0c6d524d33523acca37cd28f02899285060"}, + {file = "bcrypt-4.2.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:762a2c5fb35f89606a9fde5e51392dad0cd1ab7ae64149a8b935fe8d79dd5ed7"}, + {file = "bcrypt-4.2.0-cp37-abi3-win32.whl", hash = "sha256:5a1e8aa9b28ae28020a3ac4b053117fb51c57a010b9f969603ed885f23841458"}, + {file = "bcrypt-4.2.0-cp37-abi3-win_amd64.whl", hash = "sha256:8f6ede91359e5df88d1f5c1ef47428a4420136f3ce97763e31b86dd8280fbdf5"}, + {file = "bcrypt-4.2.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:c52aac18ea1f4a4f65963ea4f9530c306b56ccd0c6f8c8da0c06976e34a6e841"}, + {file = "bcrypt-4.2.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3bbbfb2734f0e4f37c5136130405332640a1e46e6b23e000eeff2ba8d005da68"}, + {file = "bcrypt-4.2.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3413bd60460f76097ee2e0a493ccebe4a7601918219c02f503984f0a7ee0aebe"}, + {file = "bcrypt-4.2.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8d7bb9c42801035e61c109c345a28ed7e84426ae4865511eb82e913df18f58c2"}, + {file = "bcrypt-4.2.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3d3a6d28cb2305b43feac298774b997e372e56c7c7afd90a12b3dc49b189151c"}, + {file = "bcrypt-4.2.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:9c1c4ad86351339c5f320ca372dfba6cb6beb25e8efc659bedd918d921956bae"}, + {file = "bcrypt-4.2.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:27fe0f57bb5573104b5a6de5e4153c60814c711b29364c10a75a54bb6d7ff48d"}, + {file = "bcrypt-4.2.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:8ac68872c82f1add6a20bd489870c71b00ebacd2e9134a8aa3f98a0052ab4b0e"}, + {file = "bcrypt-4.2.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:cb2a8ec2bc07d3553ccebf0746bbf3d19426d1c6d1adbd4fa48925f66af7b9e8"}, + {file = "bcrypt-4.2.0-cp39-abi3-win32.whl", hash = "sha256:77800b7147c9dc905db1cba26abe31e504d8247ac73580b4aa179f98e6608f34"}, + {file = "bcrypt-4.2.0-cp39-abi3-win_amd64.whl", hash = "sha256:61ed14326ee023917ecd093ee6ef422a72f3aec6f07e21ea5f10622b735538a9"}, + {file = "bcrypt-4.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:39e1d30c7233cfc54f5c3f2c825156fe044efdd3e0b9d309512cc514a263ec2a"}, + {file = "bcrypt-4.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f4f4acf526fcd1c34e7ce851147deedd4e26e6402369304220250598b26448db"}, + {file = "bcrypt-4.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:1ff39b78a52cf03fdf902635e4c81e544714861ba3f0efc56558979dd4f09170"}, + {file = "bcrypt-4.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:373db9abe198e8e2c70d12b479464e0d5092cc122b20ec504097b5f2297ed184"}, + {file = "bcrypt-4.2.0.tar.gz", hash = "sha256:cf69eaf5185fd58f268f805b505ce31f9b9fc2d64b376642164e9244540c1221"}, ] [package.extras] @@ -275,7 +264,6 @@ typecheck = ["mypy"] name = "bech32" version = "1.2.0" description = "Reference implementation for Bech32 and segwit addresses." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -287,7 +275,6 @@ files = [ name = "bitarray" version = "2.9.2" description = "efficient arrays of booleans -- C extension" -category = "main" optional = false python-versions = "*" files = [ @@ -419,7 +406,6 @@ files = [ name = "certifi" version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -431,7 +417,6 @@ files = [ name = "cffi" version = "1.16.0" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -494,24 +479,107 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.1.1" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false -python-versions = ">=3.6.0" -files = [ - {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, - {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] -[package.extras] -unicode-backport = ["unicodedata2"] - [[package]] name = "clea" version = "0.1.0rc4" description = "Framework for writing CLI application quickly" -category = "main" optional = false python-versions = ">=3.8,<4.0" files = [ @@ -524,14 +592,13 @@ typing-extensions = ">=4.7.1,<5.0.0" [[package]] name = "click" -version = "8.0.2" +version = "8.1.7" description = "Composable command line interface toolkit" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "click-8.0.2-py3-none-any.whl", hash = "sha256:3fab8aeb8f15f5452ae7511ad448977b3417325bceddd53df87e0bb81f3a8cf8"}, - {file = "click-8.0.2.tar.gz", hash = "sha256:7027bc7bbafaab8b2c2816861d8eb372429ee3c02e193fc2f93d6c4ab9de49c5"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -541,7 +608,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "coincurve" version = "18.0.0" description = "Cross-platform Python CFFI bindings for libsecp256k1" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -597,7 +663,6 @@ cffi = ">=1.3.0" name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -609,7 +674,6 @@ files = [ name = "cosmpy" version = "0.9.2" description = "A library for interacting with the cosmos networks" -category = "main" optional = false python-versions = ">=3.8,<4.0" files = [ @@ -630,64 +694,63 @@ requests = "*" [[package]] name = "coverage" -version = "7.5.4" +version = "7.6.0" description = "Code coverage measurement for Python" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"}, - {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"}, - {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"}, - {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"}, - {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"}, - {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"}, - {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"}, - {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"}, - {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"}, - {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"}, - {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"}, - {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"}, - {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"}, - {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"}, - {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"}, - {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"}, - {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"}, - {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"}, - {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"}, - {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"}, - {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"}, - {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"}, + {file = "coverage-7.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd"}, + {file = "coverage-7.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb"}, + {file = "coverage-7.6.0-cp310-cp310-win32.whl", hash = "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c"}, + {file = "coverage-7.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169"}, + {file = "coverage-7.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933"}, + {file = "coverage-7.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63"}, + {file = "coverage-7.6.0-cp311-cp311-win32.whl", hash = "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713"}, + {file = "coverage-7.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605"}, + {file = "coverage-7.6.0-cp312-cp312-win32.whl", hash = "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da"}, + {file = "coverage-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67"}, + {file = "coverage-7.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b"}, + {file = "coverage-7.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b"}, + {file = "coverage-7.6.0-cp38-cp38-win32.whl", hash = "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428"}, + {file = "coverage-7.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8"}, + {file = "coverage-7.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c"}, + {file = "coverage-7.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd"}, + {file = "coverage-7.6.0-cp39-cp39-win32.whl", hash = "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2"}, + {file = "coverage-7.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca"}, + {file = "coverage-7.6.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6"}, + {file = "coverage-7.6.0.tar.gz", hash = "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51"}, ] [package.extras] @@ -695,44 +758,38 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "42.0.8" +version = "43.0.0" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, - {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, - {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, - {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, - {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, - {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, - {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, + {file = "cryptography-43.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf"}, + {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55"}, + {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431"}, + {file = "cryptography-43.0.0-cp37-abi3-win32.whl", hash = "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc"}, + {file = "cryptography-43.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778"}, + {file = "cryptography-43.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f"}, + {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0"}, + {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b"}, + {file = "cryptography-43.0.0-cp39-abi3-win32.whl", hash = "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf"}, + {file = "cryptography-43.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1"}, + {file = "cryptography-43.0.0.tar.gz", hash = "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e"}, ] [package.dependencies] @@ -745,14 +802,13 @@ nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "cryptography-vectors (==43.0.0)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] name = "cytoolz" version = "0.12.3" description = "Cython implementation of Toolz: High performance functional utilities" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -872,7 +928,6 @@ cython = ["cython"] name = "distlib" version = "0.3.8" description = "Distribution utilities" -category = "dev" optional = false python-versions = "*" files = [ @@ -884,7 +939,6 @@ files = [ name = "distro" version = "1.9.0" description = "Distro - an OS platform information API" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -896,7 +950,6 @@ files = [ name = "docker" version = "6.1.2" description = "A Python library for the Docker Engine API." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -919,7 +972,6 @@ ssh = ["paramiko (>=2.4.3)"] name = "dockerpty" version = "0.4.1" description = "Python library to use the pseudo-tty of a docker container" -category = "main" optional = false python-versions = "*" files = [ @@ -933,7 +985,6 @@ six = ">=1.3.0" name = "docopt" version = "0.6.2" description = "Pythonic argument parser, that will make you smile" -category = "main" optional = false python-versions = "*" files = [ @@ -944,7 +995,6 @@ files = [ name = "ecdsa" version = "0.16.1" description = "ECDSA cryptographic signature library (pure python)" -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -963,7 +1013,6 @@ gmpy2 = ["gmpy2"] name = "eth-abi" version = "5.1.0" description = "eth_abi: Python utilities for working with Ethereum ABI definitions, especially encoding and decoding" -category = "main" optional = false python-versions = "<4,>=3.8" files = [ @@ -986,7 +1035,6 @@ tools = ["hypothesis (>=4.18.2,<5.0.0)"] name = "eth-account" version = "0.8.0" description = "eth-account: Sign Ethereum transactions and messages with local private keys" -category = "main" optional = false python-versions = ">=3.6, <4" files = [ @@ -1014,7 +1062,6 @@ test = ["coverage", "hypothesis (>=4.18.0,<5)", "pytest (>=6.2.5,<7)", "pytest-x name = "eth-hash" version = "0.7.0" description = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3" -category = "main" optional = false python-versions = ">=3.8, <4" files = [ @@ -1036,7 +1083,6 @@ test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] name = "eth-keyfile" version = "0.6.1" description = "A library for handling the encrypted keyfiles used to store ethereum private keys." -category = "main" optional = false python-versions = "*" files = [ @@ -1059,7 +1105,6 @@ test = ["pytest (>=6.2.5,<7)"] name = "eth-keys" version = "0.4.0" description = "Common API for Ethereum key operations." -category = "main" optional = false python-versions = "*" files = [ @@ -1082,7 +1127,6 @@ test = ["asn1tools (>=0.146.2,<0.147)", "eth-hash[pycryptodome]", "eth-hash[pysh name = "eth-rlp" version = "0.3.0" description = "eth-rlp: RLP definitions for common Ethereum objects in Python" -category = "main" optional = false python-versions = ">=3.7, <4" files = [ @@ -1105,7 +1149,6 @@ test = ["eth-hash[pycryptodome]", "pytest (>=6.2.5,<7)", "pytest-xdist", "tox (= name = "eth-typing" version = "3.5.2" description = "eth-typing: Common type annotations for ethereum python packages" -category = "main" optional = false python-versions = ">=3.7.2, <4" files = [ @@ -1126,7 +1169,6 @@ test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] name = "eth-utils" version = "2.3.1" description = "eth-utils: Common utility functions for python code that interacts with Ethereum" -category = "main" optional = false python-versions = ">=3.7,<4" files = [ @@ -1148,14 +1190,13 @@ test = ["hypothesis (>=4.43.0)", "mypy (==0.971)", "pytest (>=7.0.0)", "pytest-x [[package]] name = "exceptiongroup" -version = "1.2.1" +version = "1.2.2" description = "Backport of PEP 654 (exception groups)" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] @@ -1165,7 +1206,6 @@ test = ["pytest (>=6)"] name = "fastapi" version = "0.110.0" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1185,7 +1225,6 @@ all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)" name = "filelock" version = "3.15.4" description = "A platform independent file lock." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1202,7 +1241,6 @@ typing = ["typing-extensions (>=4.8)"] name = "flask" version = "2.1.3" description = "A simple framework for building complex web applications." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1225,7 +1263,6 @@ dotenv = ["python-dotenv"] name = "frozenlist" version = "1.4.1" description = "A list-like structure which implements collections.abc.MutableSequence" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1312,7 +1349,6 @@ files = [ name = "googleapis-common-protos" version = "1.63.2" description = "Common protobufs used in Google APIs" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1330,7 +1366,6 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] name = "gql" version = "3.5.0" description = "GraphQL client for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -1359,7 +1394,6 @@ websockets = ["websockets (>=10,<12)"] name = "graphql-core" version = "3.2.3" description = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL." -category = "main" optional = false python-versions = ">=3.6,<4" files = [ @@ -1369,68 +1403,66 @@ files = [ [[package]] name = "grpcio" -version = "1.64.1" +version = "1.65.1" description = "HTTP/2-based RPC framework" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "grpcio-1.64.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:55697ecec192bc3f2f3cc13a295ab670f51de29884ca9ae6cd6247df55df2502"}, - {file = "grpcio-1.64.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3b64ae304c175671efdaa7ec9ae2cc36996b681eb63ca39c464958396697daff"}, - {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:bac71b4b28bc9af61efcdc7630b166440bbfbaa80940c9a697271b5e1dabbc61"}, - {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c024ffc22d6dc59000faf8ad781696d81e8e38f4078cb0f2630b4a3cf231a90"}, - {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cd5c1325f6808b8ae31657d281aadb2a51ac11ab081ae335f4f7fc44c1721d"}, - {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0a2813093ddb27418a4c99f9b1c223fab0b053157176a64cc9db0f4557b69bd9"}, - {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2981c7365a9353f9b5c864595c510c983251b1ab403e05b1ccc70a3d9541a73b"}, - {file = "grpcio-1.64.1-cp310-cp310-win32.whl", hash = "sha256:1262402af5a511c245c3ae918167eca57342c72320dffae5d9b51840c4b2f86d"}, - {file = "grpcio-1.64.1-cp310-cp310-win_amd64.whl", hash = "sha256:19264fc964576ddb065368cae953f8d0514ecc6cb3da8903766d9fb9d4554c33"}, - {file = "grpcio-1.64.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:58b1041e7c870bb30ee41d3090cbd6f0851f30ae4eb68228955d973d3efa2e61"}, - {file = "grpcio-1.64.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bbc5b1d78a7822b0a84c6f8917faa986c1a744e65d762ef6d8be9d75677af2ca"}, - {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:5841dd1f284bd1b3d8a6eca3a7f062b06f1eec09b184397e1d1d43447e89a7ae"}, - {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8caee47e970b92b3dd948371230fcceb80d3f2277b3bf7fbd7c0564e7d39068e"}, - {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73819689c169417a4f978e562d24f2def2be75739c4bed1992435d007819da1b"}, - {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6503b64c8b2dfad299749cad1b595c650c91e5b2c8a1b775380fcf8d2cbba1e9"}, - {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1de403fc1305fd96cfa75e83be3dee8538f2413a6b1685b8452301c7ba33c294"}, - {file = "grpcio-1.64.1-cp311-cp311-win32.whl", hash = "sha256:d4d29cc612e1332237877dfa7fe687157973aab1d63bd0f84cf06692f04c0367"}, - {file = "grpcio-1.64.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e56462b05a6f860b72f0fa50dca06d5b26543a4e88d0396259a07dc30f4e5aa"}, - {file = "grpcio-1.64.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:4657d24c8063e6095f850b68f2d1ba3b39f2b287a38242dcabc166453e950c59"}, - {file = "grpcio-1.64.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:62b4e6eb7bf901719fce0ca83e3ed474ae5022bb3827b0a501e056458c51c0a1"}, - {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:ee73a2f5ca4ba44fa33b4d7d2c71e2c8a9e9f78d53f6507ad68e7d2ad5f64a22"}, - {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:198908f9b22e2672a998870355e226a725aeab327ac4e6ff3a1399792ece4762"}, - {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39b9d0acaa8d835a6566c640f48b50054f422d03e77e49716d4c4e8e279665a1"}, - {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5e42634a989c3aa6049f132266faf6b949ec2a6f7d302dbb5c15395b77d757eb"}, - {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1a82e0b9b3022799c336e1fc0f6210adc019ae84efb7321d668129d28ee1efb"}, - {file = "grpcio-1.64.1-cp312-cp312-win32.whl", hash = "sha256:55260032b95c49bee69a423c2f5365baa9369d2f7d233e933564d8a47b893027"}, - {file = "grpcio-1.64.1-cp312-cp312-win_amd64.whl", hash = "sha256:c1a786ac592b47573a5bb7e35665c08064a5d77ab88a076eec11f8ae86b3e3f6"}, - {file = "grpcio-1.64.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:a011ac6c03cfe162ff2b727bcb530567826cec85eb8d4ad2bfb4bd023287a52d"}, - {file = "grpcio-1.64.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4d6dab6124225496010bd22690f2d9bd35c7cbb267b3f14e7a3eb05c911325d4"}, - {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a5e771d0252e871ce194d0fdcafd13971f1aae0ddacc5f25615030d5df55c3a2"}, - {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3c1b90ab93fed424e454e93c0ed0b9d552bdf1b0929712b094f5ecfe7a23ad"}, - {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20405cb8b13fd779135df23fabadc53b86522d0f1cba8cca0e87968587f50650"}, - {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0cc79c982ccb2feec8aad0e8fb0d168bcbca85bc77b080d0d3c5f2f15c24ea8f"}, - {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a3a035c37ce7565b8f4f35ff683a4db34d24e53dc487e47438e434eb3f701b2a"}, - {file = "grpcio-1.64.1-cp38-cp38-win32.whl", hash = "sha256:1257b76748612aca0f89beec7fa0615727fd6f2a1ad580a9638816a4b2eb18fd"}, - {file = "grpcio-1.64.1-cp38-cp38-win_amd64.whl", hash = "sha256:0a12ddb1678ebc6a84ec6b0487feac020ee2b1659cbe69b80f06dbffdb249122"}, - {file = "grpcio-1.64.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:75dbbf415026d2862192fe1b28d71f209e2fd87079d98470db90bebe57b33179"}, - {file = "grpcio-1.64.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e3d9f8d1221baa0ced7ec7322a981e28deb23749c76eeeb3d33e18b72935ab62"}, - {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5f8b75f64d5d324c565b263c67dbe4f0af595635bbdd93bb1a88189fc62ed2e5"}, - {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c84ad903d0d94311a2b7eea608da163dace97c5fe9412ea311e72c3684925602"}, - {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:940e3ec884520155f68a3b712d045e077d61c520a195d1a5932c531f11883489"}, - {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f10193c69fc9d3d726e83bbf0f3d316f1847c3071c8c93d8090cf5f326b14309"}, - {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac15b6c2c80a4d1338b04d42a02d376a53395ddf0ec9ab157cbaf44191f3ffdd"}, - {file = "grpcio-1.64.1-cp39-cp39-win32.whl", hash = "sha256:03b43d0ccf99c557ec671c7dede64f023c7da9bb632ac65dbc57f166e4970040"}, - {file = "grpcio-1.64.1-cp39-cp39-win_amd64.whl", hash = "sha256:ed6091fa0adcc7e4ff944090cf203a52da35c37a130efa564ded02b7aff63bcd"}, - {file = "grpcio-1.64.1.tar.gz", hash = "sha256:8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a"}, + {file = "grpcio-1.65.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:3dc5f928815b8972fb83b78d8db5039559f39e004ec93ebac316403fe031a062"}, + {file = "grpcio-1.65.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:8333ca46053c35484c9f2f7e8d8ec98c1383a8675a449163cea31a2076d93de8"}, + {file = "grpcio-1.65.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:7af64838b6e615fff0ec711960ed9b6ee83086edfa8c32670eafb736f169d719"}, + {file = "grpcio-1.65.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbb64b4166362d9326f7efbf75b1c72106c1aa87f13a8c8b56a1224fac152f5c"}, + {file = "grpcio-1.65.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8422dc13ad93ec8caa2612b5032a2b9cd6421c13ed87f54db4a3a2c93afaf77"}, + {file = "grpcio-1.65.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4effc0562b6c65d4add6a873ca132e46ba5e5a46f07c93502c37a9ae7f043857"}, + {file = "grpcio-1.65.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a6c71575a2fedf259724981fd73a18906513d2f306169c46262a5bae956e6364"}, + {file = "grpcio-1.65.1-cp310-cp310-win32.whl", hash = "sha256:34966cf526ef0ea616e008d40d989463e3db157abb213b2f20c6ce0ae7928875"}, + {file = "grpcio-1.65.1-cp310-cp310-win_amd64.whl", hash = "sha256:ca931de5dd6d9eb94ff19a2c9434b23923bce6f767179fef04dfa991f282eaad"}, + {file = "grpcio-1.65.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:bbb46330cc643ecf10bd9bd4ca8e7419a14b6b9dedd05f671c90fb2c813c6037"}, + {file = "grpcio-1.65.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d827a6fb9215b961eb73459ad7977edb9e748b23e3407d21c845d1d8ef6597e5"}, + {file = "grpcio-1.65.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:6e71aed8835f8d9fbcb84babc93a9da95955d1685021cceb7089f4f1e717d719"}, + {file = "grpcio-1.65.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a1c84560b3b2d34695c9ba53ab0264e2802721c530678a8f0a227951f453462"}, + {file = "grpcio-1.65.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27adee2338d697e71143ed147fe286c05810965d5d30ec14dd09c22479bfe48a"}, + {file = "grpcio-1.65.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f62652ddcadc75d0e7aa629e96bb61658f85a993e748333715b4ab667192e4e8"}, + {file = "grpcio-1.65.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:71a05fd814700dd9cb7d9a507f2f6a1ef85866733ccaf557eedacec32d65e4c2"}, + {file = "grpcio-1.65.1-cp311-cp311-win32.whl", hash = "sha256:b590f1ad056294dfaeac0b7e1b71d3d5ace638d8dd1f1147ce4bd13458783ba8"}, + {file = "grpcio-1.65.1-cp311-cp311-win_amd64.whl", hash = "sha256:12e9bdf3b5fd48e5fbe5b3da382ad8f97c08b47969f3cca81dd9b36b86ed39e2"}, + {file = "grpcio-1.65.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:54cb822e177374b318b233e54b6856c692c24cdbd5a3ba5335f18a47396bac8f"}, + {file = "grpcio-1.65.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:aaf3c54419a28d45bd1681372029f40e5bfb58e5265e3882eaf21e4a5f81a119"}, + {file = "grpcio-1.65.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:557de35bdfbe8bafea0a003dbd0f4da6d89223ac6c4c7549d78e20f92ead95d9"}, + {file = "grpcio-1.65.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8bfd95ef3b097f0cc86ade54eafefa1c8ed623aa01a26fbbdcd1a3650494dd11"}, + {file = "grpcio-1.65.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e6a8f3d6c41e6b642870afe6cafbaf7b61c57317f9ec66d0efdaf19db992b90"}, + {file = "grpcio-1.65.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1faaf7355ceed07ceaef0b9dcefa4c98daf1dd8840ed75c2de128c3f4a4d859d"}, + {file = "grpcio-1.65.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:60f1f38eed830488ad2a1b11579ef0f345ff16fffdad1d24d9fbc97ba31804ff"}, + {file = "grpcio-1.65.1-cp312-cp312-win32.whl", hash = "sha256:e75acfa52daf5ea0712e8aa82f0003bba964de7ae22c26d208cbd7bc08500177"}, + {file = "grpcio-1.65.1-cp312-cp312-win_amd64.whl", hash = "sha256:ff5a84907e51924973aa05ed8759210d8cdae7ffcf9e44fd17646cf4a902df59"}, + {file = "grpcio-1.65.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:1fbd6331f18c3acd7e09d17fd840c096f56eaf0ef830fbd50af45ae9dc8dfd83"}, + {file = "grpcio-1.65.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:de5b6be29116e094c5ef9d9e4252e7eb143e3d5f6bd6d50a78075553ab4930b0"}, + {file = "grpcio-1.65.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:e4a3cdba62b2d6aeae6027ae65f350de6dc082b72e6215eccf82628e79efe9ba"}, + {file = "grpcio-1.65.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941c4869aa229d88706b78187d60d66aca77fe5c32518b79e3c3e03fc26109a2"}, + {file = "grpcio-1.65.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f40cebe5edb518d78b8131e87cb83b3ee688984de38a232024b9b44e74ee53d3"}, + {file = "grpcio-1.65.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2ca684ba331fb249d8a1ce88db5394e70dbcd96e58d8c4b7e0d7b141a453dce9"}, + {file = "grpcio-1.65.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8558f0083ddaf5de64a59c790bffd7568e353914c0c551eae2955f54ee4b857f"}, + {file = "grpcio-1.65.1-cp38-cp38-win32.whl", hash = "sha256:8d8143a3e3966f85dce6c5cc45387ec36552174ba5712c5dc6fcc0898fb324c0"}, + {file = "grpcio-1.65.1-cp38-cp38-win_amd64.whl", hash = "sha256:76e81a86424d6ca1ce7c16b15bdd6a964a42b40544bf796a48da241fdaf61153"}, + {file = "grpcio-1.65.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:cb5175f45c980ff418998723ea1b3869cce3766d2ab4e4916fbd3cedbc9d0ed3"}, + {file = "grpcio-1.65.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b12c1aa7b95abe73b3e04e052c8b362655b41c7798da69f1eaf8d186c7d204df"}, + {file = "grpcio-1.65.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:3019fb50128b21a5e018d89569ffaaaa361680e1346c2f261bb84a91082eb3d3"}, + {file = "grpcio-1.65.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ae15275ed98ea267f64ee9ddedf8ecd5306a5b5bb87972a48bfe24af24153e8"}, + {file = "grpcio-1.65.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f096ffb881f37e8d4f958b63c74bfc400c7cebd7a944b027357cd2fb8d91a57"}, + {file = "grpcio-1.65.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2f56b5a68fdcf17a0a1d524bf177218c3c69b3947cb239ea222c6f1867c3ab68"}, + {file = "grpcio-1.65.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:941596d419b9736ab548aa0feb5bbba922f98872668847bf0720b42d1d227b9e"}, + {file = "grpcio-1.65.1-cp39-cp39-win32.whl", hash = "sha256:5fd7337a823b890215f07d429f4f193d24b80d62a5485cf88ee06648591a0c57"}, + {file = "grpcio-1.65.1-cp39-cp39-win_amd64.whl", hash = "sha256:1bceeec568372cbebf554eae1b436b06c2ff24cfaf04afade729fb9035408c6c"}, + {file = "grpcio-1.65.1.tar.gz", hash = "sha256:3c492301988cd720cd145d84e17318d45af342e29ef93141228f9cd73222368b"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.64.1)"] +protobuf = ["grpcio-tools (>=1.65.1)"] [[package]] name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1442,7 +1474,6 @@ files = [ name = "hexbytes" version = "0.3.1" description = "hexbytes: Python `bytes` subclass that decodes hex, with a readable console output" -category = "main" optional = false python-versions = ">=3.7, <4" files = [ @@ -1460,7 +1491,6 @@ test = ["eth-utils (>=1.0.1,<3)", "hypothesis (>=3.44.24,<=6.31.6)", "pytest (>= name = "idna" version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1470,14 +1500,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "8.0.0" +version = "8.2.0" description = "Read metadata from Python packages" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, - {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, + {file = "importlib_metadata-8.2.0-py3-none-any.whl", hash = "sha256:11901fa0c2f97919b288679932bb64febaeacf289d18ac84dd68cb2e74213369"}, + {file = "importlib_metadata-8.2.0.tar.gz", hash = "sha256:72e8d4399996132204f9a16dcc751af254a48f8d1b20b9ff0f98d4a8f901e73d"}, ] [package.dependencies] @@ -1492,7 +1521,6 @@ test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "p name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1504,7 +1532,6 @@ files = [ name = "ipfshttpclient" version = "0.8.0a2" description = "Python IPFS HTTP CLIENT library" -category = "main" optional = false python-versions = ">=3.6.2,!=3.7.0,!=3.7.1" files = [ @@ -1520,7 +1547,6 @@ requests = ">=2.11" name = "itsdangerous" version = "2.2.0" description = "Safely pass data to untrusted environments and back." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1532,7 +1558,6 @@ files = [ name = "jinja2" version = "3.1.4" description = "A very fast and expressive template engine." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1550,7 +1575,6 @@ i18n = ["Babel (>=2.7)"] name = "jsonschema" version = "4.3.3" description = "An implementation of JSON Schema validation for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1570,7 +1594,6 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- name = "lru-dict" version = "1.3.0" description = "An Dict like LRU container." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1664,7 +1687,6 @@ test = ["pytest"] name = "macholib" version = "1.16.3" description = "Mach-O header analysis and editing" -category = "main" optional = false python-versions = "*" files = [ @@ -1679,7 +1701,6 @@ altgraph = ">=0.17" name = "markupsafe" version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1749,7 +1770,6 @@ files = [ name = "morphys" version = "1.0" description = "Smart conversions between unicode and bytes types for common cases" -category = "main" optional = false python-versions = "*" files = [ @@ -1760,7 +1780,6 @@ files = [ name = "multiaddr" version = "0.0.9" description = "Python implementation of jbenet's multiaddr" -category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" files = [ @@ -1778,7 +1797,6 @@ varint = "*" name = "multidict" version = "6.0.5" description = "multidict implementation" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1878,7 +1896,6 @@ files = [ name = "netaddr" version = "1.3.0" description = "A network address manipulation library for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1891,24 +1908,23 @@ nicer-shell = ["ipython"] [[package]] name = "open-aea" -version = "1.51.0" +version = "1.53.0" description = "Open Autonomous Economic Agent framework (without vendor lock-in)" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "open-aea-1.51.0.tar.gz", hash = "sha256:a1b6b6be9c08cfc8eb0befd436f0b821d4b0cd9cabec4154e36695fd8bc555ec"}, - {file = "open_aea-1.51.0-py3-none-any.whl", hash = "sha256:94a93fef676352fba8a7fa2a0a68b140e9ca9f8999f78bf24c66bb4557b8e6f7"}, - {file = "open_aea-1.51.0-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:8887b1604163f5be1706fce5b9cbc5592b22d9ae621c200f77550ee76d487dc8"}, - {file = "open_aea-1.51.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:c16001b336b61863eb8bb557161718e0110853064a6f1afb990fd02fa672e307"}, - {file = "open_aea-1.51.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0c4abbf61de198f708a20b3cedd617b922727090781720687eb663288b015953"}, - {file = "open_aea-1.51.0-py3-none-win32.whl", hash = "sha256:75158aeaa4e395c92116581a0534d652979e3a0ce4986665207cde8050521467"}, - {file = "open_aea-1.51.0-py3-none-win_amd64.whl", hash = "sha256:b2eee2d1ee065d1cc48d73aa7db82256c80b792cf14ab4765c4a087af3087464"}, + {file = "open_aea-1.53.0-py3-none-any.whl", hash = "sha256:1244855875effe09e2c965750ac401a973a1ae56cdc880045eea70f19ed90dcb"}, + {file = "open_aea-1.53.0-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:d0a848e33798599953dc764d37083fc37642140a91624e06a56b8d2f95ae6cb9"}, + {file = "open_aea-1.53.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:48f5715f13a0389799b9461bc776e9638e6ae38173d0f2bf6d28bad637232914"}, + {file = "open_aea-1.53.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:87e4ae903ec9a7268eba0ead449f9693cb5bedb6dfc5846c90f94f2354bd35ab"}, + {file = "open_aea-1.53.0-py3-none-win32.whl", hash = "sha256:182e9f8a77fe8efcc768360ac7308a0951ec16bcb12e2ad4f55886b12258d702"}, + {file = "open_aea-1.53.0-py3-none-win_amd64.whl", hash = "sha256:cef9d4d177ea7d959ebacab962fbd1d03d7243c0b72d10a3ee7850df8d922e06"}, + {file = "open_aea-1.53.0.tar.gz", hash = "sha256:6fcb82ceed0b6841c0f41d116b207308556e3d18807fe140e9ef1a898c7a8a0b"}, ] [package.dependencies] base58 = ">=1.0.3,<3.0.0" -click = {version = "8.0.2", optional = true, markers = "extra == \"all\""} +click = {version = ">=8.1.0,<9", optional = true, markers = "extra == \"all\""} coverage = {version = ">=6.4.4,<8.0.0", optional = true, markers = "extra == \"all\""} ecdsa = ">=0.15,<0.17.0" jsonschema = ">=4.3.0,<4.4.0" @@ -1919,26 +1935,25 @@ py-multibase = ">=1.0.0" py-multicodec = ">=0.2.0" pymultihash = "0.8.2" pytest = {version = ">=7.0.0,<7.3.0", optional = true, markers = "extra == \"all\""} -python-dotenv = ">=0.14.0,<0.22.0" -pyyaml = "6.0.1" -requests = "2.28.1" +python-dotenv = ">=0.14.0,<1.0.1" +pyyaml = {version = ">=6.0.1,<7", optional = true, markers = "extra == \"all\""} +requests = ">=2.28.1,<3" semver = ">=2.9.1,<3.0.0" [package.extras] -all = ["click (==8.0.2)", "coverage (>=6.4.4,<8.0.0)", "jsonschema (>=4.3.0,<4.4.0)", "packaging (>=23.1,<24.0)", "pytest (>=7.0.0,<7.3.0)", "pyyaml (==6.0.1)", "semver (>=2.9.1,<3.0.0)"] -cli = ["click (==8.0.2)", "coverage (>=6.4.4,<8.0.0)", "jsonschema (>=4.3.0,<4.4.0)", "packaging (>=23.1,<24.0)", "pytest (>=7.0.0,<7.3.0)", "pyyaml (==6.0.1)", "semver (>=2.9.1,<3.0.0)"] -test-tools = ["click (==8.0.2)", "coverage (>=6.4.4,<8.0.0)", "jsonschema (>=4.3.0,<4.4.0)", "packaging (>=23.1,<24.0)", "pytest (>=7.0.0,<7.3.0)", "pyyaml (==6.0.1)", "semver (>=2.9.1,<3.0.0)"] +all = ["click (>=8.1.0,<9)", "coverage (>=6.4.4,<8.0.0)", "jsonschema (>=4.3.0,<4.4.0)", "packaging (>=23.1,<24.0)", "pytest (>=7.0.0,<7.3.0)", "pyyaml (>=6.0.1,<9)", "semver (>=2.9.1,<3.0.0)"] +cli = ["click (>=8.1.0,<9)", "coverage (>=6.4.4,<8.0.0)", "jsonschema (>=4.3.0,<4.4.0)", "packaging (>=23.1,<24.0)", "pytest (>=7.0.0,<7.3.0)", "pyyaml (>=6.0.1,<9)", "semver (>=2.9.1,<3.0.0)"] +test-tools = ["click (>=8.1.0,<9)", "coverage (>=6.4.4,<8.0.0)", "jsonschema (>=4.3.0,<4.4.0)", "packaging (>=23.1,<24.0)", "pytest (>=7.0.0,<7.3.0)", "pyyaml (>=6.0.1,<9)", "semver (>=2.9.1,<3.0.0)"] [[package]] name = "open-aea-cli-ipfs" -version = "1.51.0" +version = "1.53.0" description = "CLI extension for open AEA framework wrapping IPFS functionality." -category = "main" optional = false python-versions = "*" files = [ - {file = "open-aea-cli-ipfs-1.51.0.tar.gz", hash = "sha256:142174bb7516b8562a0114838c95d1466d4d4857a8d0aaaf076dd571b346f6c5"}, - {file = "open_aea_cli_ipfs-1.51.0-py3-none-any.whl", hash = "sha256:8c8e422bb63108fef65f5360374598275c737cb15df571f13af11f07961380e3"}, + {file = "open_aea_cli_ipfs-1.53.0-py3-none-any.whl", hash = "sha256:335a02473d1c6820bb63a31e2931749ba644f586a7acbc650da9efc4c7168efa"}, + {file = "open_aea_cli_ipfs-1.53.0.tar.gz", hash = "sha256:499a66a45925064e6946ec72f482182390263cc7726409832f1317fe831b6289"}, ] [package.dependencies] @@ -1950,7 +1965,6 @@ pytest = ">=7.0.0,<7.3.0" name = "open-aea-flashbots" version = "1.4.0" description = "" -category = "main" optional = false python-versions = ">=3.9,<4.0" files = [ @@ -1964,18 +1978,17 @@ web3 = ">=6.0.0,<7" [[package]] name = "open-aea-ledger-cosmos" -version = "1.51.0" +version = "1.53.0" description = "Python package wrapping the public and private key cryptography and ledger api of Cosmos." -category = "main" optional = false python-versions = "*" files = [ - {file = "open-aea-ledger-cosmos-1.51.0.tar.gz", hash = "sha256:d2b15cd4b5e6ba3bda2d7206689000356c0197508eea8031dced67a0965c2648"}, - {file = "open_aea_ledger_cosmos-1.51.0-py3-none-any.whl", hash = "sha256:a9f46895a502397d2b95c2cec13f0f12777e7f4811f27b5314e5363d44471ca5"}, + {file = "open_aea_ledger_cosmos-1.53.0-py3-none-any.whl", hash = "sha256:79b2eafc8723593634b72973da39e3e3c01bceae04b330b51a5059eb1200262b"}, + {file = "open_aea_ledger_cosmos-1.53.0.tar.gz", hash = "sha256:14a032918d7f0659fedbe21a53fa668b24505bb9e97358340b20325943f9fa26"}, ] [package.dependencies] -bech32 = "1.2.0" +bech32 = ">=1.2.0,<2" cosmpy = "0.9.2" ecdsa = ">=0.15,<0.17.0" open-aea = ">=1.0.0,<2.0.0" @@ -1983,14 +1996,13 @@ pycryptodome = ">=3.10.1,<4.0.0" [[package]] name = "open-aea-ledger-ethereum" -version = "1.51.0" +version = "1.53.0" description = "Python package wrapping the public and private key cryptography and ledger api of Ethereum." -category = "main" optional = false python-versions = "*" files = [ - {file = "open-aea-ledger-ethereum-1.51.0.tar.gz", hash = "sha256:3e47bcac5f0e062d8cf1837b120d259942a6194effe54c0febc876d528b8269b"}, - {file = "open_aea_ledger_ethereum-1.51.0-py3-none-any.whl", hash = "sha256:6c6d17c4170125af1bfcf0de80700c89d4cbec75fc4a39c43080476637847d33"}, + {file = "open_aea_ledger_ethereum-1.53.0-py3-none-any.whl", hash = "sha256:501eb9e9e228552bf9f6f8811d780f33dbbf477ddb33b63d335caaeb24840274"}, + {file = "open_aea_ledger_ethereum-1.53.0.tar.gz", hash = "sha256:734f335061c33a171b945ab1bcea5d47be9b9532457ed361b3aab727e85bca0d"}, ] [package.dependencies] @@ -2001,46 +2013,45 @@ web3 = ">=6.0.0,<7" [[package]] name = "open-aea-ledger-ethereum-flashbots" -version = "1.51.0" +version = "1.53.0" description = "Python package extending the default open-aea ethereum ledger plugin to add support for flashbots." -category = "main" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "open-aea-ledger-ethereum-flashbots-1.51.0.tar.gz", hash = "sha256:5e474c0d3cf7cbd8a8b55e3168877cd844daaacba1a2e8cf4eed6dddbad45504"}, - {file = "open_aea_ledger_ethereum_flashbots-1.51.0-py3-none-any.whl", hash = "sha256:6c30fa54f1f77f59adea01632f61c7cd162f8e2ab74ecba0201e21c206626da9"}, + {file = "open_aea_ledger_ethereum_flashbots-1.53.0-py3-none-any.whl", hash = "sha256:04e1d04b68159f092dbe8c94d419221ad45bac17497c8feed9cbe92270a675b3"}, + {file = "open_aea_ledger_ethereum_flashbots-1.53.0.tar.gz", hash = "sha256:683e0c73c04413a0098f4903e3afa8c1570f8c51591ad6cef66fd38cfad463d8"}, ] [package.dependencies] open-aea-flashbots = "1.4.0" -open-aea-ledger-ethereum = ">=1.51.0,<1.52.0" +open-aea-ledger-ethereum = ">=1.53.0,<1.54.0" [[package]] name = "open-autonomy" -version = "0.14.11.post1" +version = "0.14.14.post2" description = "A framework for the creation of autonomous agent services." -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "open-autonomy-0.14.11.post1.tar.gz", hash = "sha256:b44467cccffa3c72db21baca127d747fb62a60a22161613c4248e7cec78a0bb6"}, - {file = "open_autonomy-0.14.11.post1-py3-none-any.whl", hash = "sha256:1f2d8d22909c90f679fb6c24318abe8887f94668aa9decf018837853c828bc4a"}, + {file = "open_autonomy-0.14.14.post2-py3-none-any.whl", hash = "sha256:76efc0ce814c748eb02176477eef5b5ca4c6a84d77230e01a40c3df5ad2254b8"}, + {file = "open_autonomy-0.14.14.post2.tar.gz", hash = "sha256:0e1e7f3207fde38b8778a260c43153737a3b9fefe6d7abf373710a1aae9e267b"}, ] [package.dependencies] aiohttp = ">=3.8.5,<4.0.0" -click = "8.0.2" +click = ">=8.1.0,<9" coverage = ">=6.4.4,<8.0.0" docker = "6.1.2" Flask = ">=2.0.2,<3.0.0" gql = "3.5.0" hexbytes = "*" jsonschema = ">=4.3.0,<4.4.0" -open-aea = {version = "1.51.0", extras = ["all"]} -open-aea-cli-ipfs = "1.51.0" +open-aea = {version = "1.53.0", extras = ["all"]} +open-aea-cli-ipfs = "1.53.0" protobuf = ">=4.21.6,<4.25.0" pytest = "7.2.1" python-dotenv = ">=0.14.5,<0.22.0" +requests = ">=2.28.1,<2.31.2" requests-toolbelt = "1.0.0" texttable = "1.6.7" typing-extensions = ">=3.10.0.2" @@ -2049,14 +2060,13 @@ watchdog = ">=2.1.6" werkzeug = "2.0.3" [package.extras] -all = ["click (==8.0.2)", "coverage (>=6.4.4,<8.0.0)", "open-aea-cli-ipfs (==1.51.0)", "pytest (>=7.0.0,<7.3.0)", "python-dotenv (>=0.14.5,<0.22.0)", "texttable (==1.6.7)"] -cli = ["click (==8.0.2)", "coverage (>=6.4.4,<8.0.0)", "open-aea-cli-ipfs (==1.51.0)", "pytest (>=7.0.0,<7.3.0)", "python-dotenv (>=0.14.5,<0.22.0)", "texttable (==1.6.7)"] +all = ["click (>=8.1.0,<9)", "coverage (>=6.4.4,<8.0.0)", "open-aea-cli-ipfs (==1.53.0)", "pytest (>=7.0.0,<7.3.0)", "python-dotenv (>=0.14.5,<0.22.0)", "texttable (==1.6.7)"] +cli = ["click (>=8.1.0,<9)", "coverage (>=6.4.4,<8.0.0)", "open-aea-cli-ipfs (==1.53.0)", "pytest (>=7.0.0,<7.3.0)", "python-dotenv (>=0.14.5,<0.22.0)", "texttable (==1.6.7)"] [[package]] name = "packaging" version = "23.2" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2068,7 +2078,6 @@ files = [ name = "paramiko" version = "3.4.0" description = "SSH2 protocol library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2090,7 +2099,6 @@ invoke = ["invoke (>=2.0)"] name = "parsimonious" version = "0.10.0" description = "(Soon to be) the fastest pure-Python PEG parser I could muster" -category = "main" optional = false python-versions = "*" files = [ @@ -2105,7 +2113,6 @@ regex = ">=2022.3.15" name = "pefile" version = "2023.2.7" description = "Python PE parsing module" -category = "main" optional = false python-versions = ">=3.6.0" files = [ @@ -2117,7 +2124,6 @@ files = [ name = "platformdirs" version = "4.2.2" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2134,7 +2140,6 @@ type = ["mypy (>=1.8)"] name = "pluggy" version = "1.5.0" description = "plugin and hook calling mechanisms for python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2150,7 +2155,6 @@ testing = ["pytest", "pytest-benchmark"] name = "protobuf" version = "4.24.4" description = "" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2173,7 +2177,6 @@ files = [ name = "psutil" version = "5.9.8" description = "Cross-platform lib for process and system monitoring in Python." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ @@ -2202,7 +2205,6 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] name = "py" version = "1.11.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -2214,7 +2216,6 @@ files = [ name = "py-multibase" version = "1.0.3" description = "Multibase implementation for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -2231,7 +2232,6 @@ six = ">=1.10.0,<2.0" name = "py-multicodec" version = "0.2.1" description = "Multicodec implementation in Python" -category = "main" optional = false python-versions = "*" files = [ @@ -2248,7 +2248,6 @@ varint = ">=1.0.2,<2.0.0" name = "pycparser" version = "2.22" description = "C parser in Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2260,7 +2259,6 @@ files = [ name = "pycryptodome" version = "3.20.0" description = "Cryptographic library for Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -2302,7 +2300,6 @@ files = [ name = "pydantic" version = "2.8.2" description = "Data validation using Python type hints" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2322,7 +2319,6 @@ email = ["email-validator (>=2.0.0)"] name = "pydantic-core" version = "2.20.1" description = "Core functionality for Pydantic validation and serialization" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2422,24 +2418,23 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pyinstaller" -version = "6.8.0" +version = "6.9.0" description = "PyInstaller bundles a Python application and all its dependencies into a single package." -category = "main" optional = false python-versions = "<3.13,>=3.8" files = [ - {file = "pyinstaller-6.8.0-py3-none-macosx_10_13_universal2.whl", hash = "sha256:5ff6bc2784c1026f8e2f04aa3760cbed41408e108a9d4cf1dd52ee8351a3f6e1"}, - {file = "pyinstaller-6.8.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:39ac424d2ee2457d2ab11a5091436e75a0cccae207d460d180aa1fcbbafdd528"}, - {file = "pyinstaller-6.8.0-py3-none-manylinux2014_i686.whl", hash = "sha256:355832a3acc7de90a255ecacd4b9f9e166a547a79c8905d49f14e3a75c1acdb9"}, - {file = "pyinstaller-6.8.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:6303c7a009f47e6a96ef65aed49f41e36ece8d079b9193ca92fe807403e5fe80"}, - {file = "pyinstaller-6.8.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2b71509468c811968c0b5decb5bbe85b6292ea52d7b1f26313d2aabb673fa9a5"}, - {file = "pyinstaller-6.8.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ff31c5b99e05a4384bbe2071df67ec8b2b347640a375eae9b40218be2f1754c6"}, - {file = "pyinstaller-6.8.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:000c36b13fe4cd8d0d8c2bc855b1ddcf39867b5adf389e6b5ca45b25fa3e619d"}, - {file = "pyinstaller-6.8.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:fe0af018d7d5077180e3144ada89a4da5df8d07716eb7e9482834a56dc57a4e8"}, - {file = "pyinstaller-6.8.0-py3-none-win32.whl", hash = "sha256:d257f6645c7334cbd66f38a4fac62c3ad614cc46302b2b5d9f8cc48c563bce0e"}, - {file = "pyinstaller-6.8.0-py3-none-win_amd64.whl", hash = "sha256:81cccfa9b16699b457f4788c5cc119b50f3cd4d0db924955f15c33f2ad27a50d"}, - {file = "pyinstaller-6.8.0-py3-none-win_arm64.whl", hash = "sha256:1c3060a263758cf7f0144ab4c016097b20451b2469d468763414665db1bb743d"}, - {file = "pyinstaller-6.8.0.tar.gz", hash = "sha256:3f4b6520f4423fe19bcc2fd63ab7238851ae2bdcbc98f25bc5d2f97cc62012e9"}, + {file = "pyinstaller-6.9.0-py3-none-macosx_10_13_universal2.whl", hash = "sha256:5ced2e83acf222b936ea94abc5a5cc96588705654b39138af8fb321d9cf2b954"}, + {file = "pyinstaller-6.9.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:f18a3d551834ef8fb7830d48d4cc1527004d0e6b51ded7181e78374ad6111846"}, + {file = "pyinstaller-6.9.0-py3-none-manylinux2014_i686.whl", hash = "sha256:f2fc568de3d6d2a176716a3fc9f20da06d351e8bea5ddd10ecb5659fce3a05b0"}, + {file = "pyinstaller-6.9.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:a0f378f64ad0655d11ade9fde7877e7573fd3d5066231608ce7dfa9040faecdd"}, + {file = "pyinstaller-6.9.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:7bf0c13c5a8560c89540746ae742f4f4b82290e95a6b478374d9f34959fe25d6"}, + {file = "pyinstaller-6.9.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:da994aba14c5686db88796684de265a8665733b4df09b939f7ebdf097d18df72"}, + {file = "pyinstaller-6.9.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:4e3e50743c091a06e6d01c59bdd6d03967b453ee5384a9e790759be4129db4a4"}, + {file = "pyinstaller-6.9.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:b041be2fe78da47a269604d62c940d68c62f9a3913bdf64af4123f7689d47099"}, + {file = "pyinstaller-6.9.0-py3-none-win32.whl", hash = "sha256:2bf4de17a1c63c0b797b38e13bfb4d03b5ee7c0a68e28b915a7eaacf6b76087f"}, + {file = "pyinstaller-6.9.0-py3-none-win_amd64.whl", hash = "sha256:43709c70b1da8441a730327a8ed362bfcfdc3d42c1bf89f3e2b0a163cc4e7d33"}, + {file = "pyinstaller-6.9.0-py3-none-win_arm64.whl", hash = "sha256:f15c1ef11ed5ceb32447dfbdab687017d6adbef7fc32aa359d584369bfe56eda"}, + {file = "pyinstaller-6.9.0.tar.gz", hash = "sha256:f4a75c552facc2e2a370f1e422b971b5e5cdb4058ff38cea0235aa21fc0b378f"}, ] [package.dependencies] @@ -2448,7 +2443,7 @@ importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""} macholib = {version = ">=1.8", markers = "sys_platform == \"darwin\""} packaging = ">=22.0" pefile = {version = ">=2022.5.30", markers = "sys_platform == \"win32\""} -pyinstaller-hooks-contrib = ">=2024.6" +pyinstaller-hooks-contrib = ">=2024.7" pywin32-ctypes = {version = ">=0.2.1", markers = "sys_platform == \"win32\""} setuptools = ">=42.0.0" @@ -2460,7 +2455,6 @@ hook-testing = ["execnet (>=1.5.0)", "psutil", "pytest (>=2.7.3)"] name = "pyinstaller-hooks-contrib" version = "2024.7" description = "Community maintained hooks for PyInstaller" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2477,7 +2471,6 @@ setuptools = ">=42.0.0" name = "pymultihash" version = "0.8.2" description = "Python implementation of the multihash specification" -category = "main" optional = false python-versions = "*" files = [ @@ -2493,7 +2486,6 @@ sha3 = ["pysha3"] name = "pynacl" version = "1.5.0" description = "Python binding to the Networking and Cryptography (NaCl) library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2520,7 +2512,6 @@ tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] name = "pyrsistent" version = "0.20.0" description = "Persistent/Functional/Immutable data structures" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2562,7 +2553,6 @@ files = [ name = "pytest" version = "7.2.1" description = "pytest: simple powerful testing with Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2586,7 +2576,6 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2. name = "python-baseconv" version = "1.2.2" description = "Convert numbers from base 10 integers to base X strings and back again." -category = "main" optional = false python-versions = "*" files = [ @@ -2597,7 +2586,6 @@ files = [ name = "python-dateutil" version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -2612,7 +2600,6 @@ six = ">=1.5" name = "python-dotenv" version = "0.21.1" description = "Read key-value pairs from a .env file and set them as environment variables" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2627,7 +2614,6 @@ cli = ["click (>=5.0)"] name = "pywin32" version = "306" description = "Python for Window Extensions" -category = "main" optional = false python-versions = "*" files = [ @@ -2651,7 +2637,6 @@ files = [ name = "pywin32-ctypes" version = "0.2.2" description = "A (partial) reimplementation of pywin32 using ctypes/cffi" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2663,7 +2648,6 @@ files = [ name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2722,110 +2706,108 @@ files = [ [[package]] name = "regex" -version = "2024.5.15" +version = "2024.7.24" description = "Alternative regular expression module, to replace re." -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f"}, - {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6"}, - {file = "regex-2024.5.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53"}, - {file = "regex-2024.5.15-cp310-cp310-win32.whl", hash = "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3"}, - {file = "regex-2024.5.15-cp310-cp310-win_amd64.whl", hash = "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68"}, - {file = "regex-2024.5.15-cp311-cp311-win32.whl", hash = "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa"}, - {file = "regex-2024.5.15-cp311-cp311-win_amd64.whl", hash = "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80"}, - {file = "regex-2024.5.15-cp312-cp312-win32.whl", hash = "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe"}, - {file = "regex-2024.5.15-cp312-cp312-win_amd64.whl", hash = "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741"}, - {file = "regex-2024.5.15-cp38-cp38-win32.whl", hash = "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9"}, - {file = "regex-2024.5.15-cp38-cp38-win_amd64.whl", hash = "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456"}, - {file = "regex-2024.5.15-cp39-cp39-win32.whl", hash = "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694"}, - {file = "regex-2024.5.15-cp39-cp39-win_amd64.whl", hash = "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388"}, - {file = "regex-2024.5.15.tar.gz", hash = "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa"}, + {file = "regex-2024.7.24-cp310-cp310-win32.whl", hash = "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66"}, + {file = "regex-2024.7.24-cp310-cp310-win_amd64.whl", hash = "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e"}, + {file = "regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c"}, + {file = "regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38"}, + {file = "regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc"}, + {file = "regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8"}, + {file = "regex-2024.7.24-cp38-cp38-win32.whl", hash = "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96"}, + {file = "regex-2024.7.24-cp38-cp38-win_amd64.whl", hash = "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9"}, + {file = "regex-2024.7.24-cp39-cp39-win32.whl", hash = "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1"}, + {file = "regex-2024.7.24-cp39-cp39-win_amd64.whl", hash = "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9"}, + {file = "regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506"}, ] [[package]] name = "requests" -version = "2.28.1" +version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" files = [ - {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, - {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" +charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] @@ -2835,7 +2817,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "requests-toolbelt" version = "1.0.0" description = "A utility belt for advanced users of python-requests" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2850,7 +2831,6 @@ requests = ">=2.0.1,<3.0.0" name = "rlp" version = "3.0.0" description = "A package for Recursive Length Prefix encoding and decoding" -category = "main" optional = false python-versions = "*" files = [ @@ -2872,7 +2852,6 @@ test = ["hypothesis (==5.19.0)", "pytest (>=6.2.5,<7)", "tox (>=2.9.1,<3)"] name = "semver" version = "2.13.0" description = "Python helper for Semantic Versioning (http://semver.org/)" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2882,25 +2861,24 @@ files = [ [[package]] name = "setuptools" -version = "70.2.0" +version = "71.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-70.2.0-py3-none-any.whl", hash = "sha256:b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05"}, - {file = "setuptools-70.2.0.tar.gz", hash = "sha256:bd63e505105011b25c3c11f753f7e3b8465ea739efddaccef8f0efac2137bac1"}, + {file = "setuptools-71.1.0-py3-none-any.whl", hash = "sha256:33874fdc59b3188304b2e7c80d9029097ea31627180896fb549c578ceb8a0855"}, + {file = "setuptools-71.1.0.tar.gz", hash = "sha256:032d42ee9fb536e33087fb66cac5f840eb9391ed05637b3f2a76a7c8fb477936"}, ] [package.extras] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.11.*)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -2912,7 +2890,6 @@ files = [ name = "sniffio" version = "1.3.1" description = "Sniff out which async library your code is running under" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2924,7 +2901,6 @@ files = [ name = "starlette" version = "0.36.3" description = "The little ASGI library that shines." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2943,7 +2919,6 @@ full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7 name = "texttable" version = "1.6.7" description = "module to create simple ASCII tables" -category = "main" optional = false python-versions = "*" files = [ @@ -2955,7 +2930,6 @@ files = [ name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2965,34 +2939,33 @@ files = [ [[package]] name = "tomte" -version = "0.2.15" +version = "0.2.17" description = "A library that wraps many useful tools (linters, analysers, etc) to keep Python code clean, secure, well-documented and optimised." -category = "dev" optional = false -python-versions = ">=3.8,<4" +python-versions = "<4,>=3.8" files = [ - {file = "tomte-0.2.15-py3-none-any.whl", hash = "sha256:c1ec71bdb919290e42671d83098232bf7cf46cddf1a736c5d1c9f12ab1308c34"}, - {file = "tomte-0.2.15.tar.gz", hash = "sha256:662f3cdd616347969c3fea557c47545b555f5f82798b978e78ade3d23d43c92d"}, + {file = "tomte-0.2.17-py3-none-any.whl", hash = "sha256:477e1e903610b5e2a8cf74a78cf229eacc21aa666e25e7bb872385ef2c013cfe"}, + {file = "tomte-0.2.17.tar.gz", hash = "sha256:ad583dd39f2c398272f7f196471b2ecc8430eb89e07295ec1e682f64dd782831"}, ] [package.dependencies] -click = {version = "8.0.2", optional = true, markers = "extra == \"black\" or extra == \"cli\" or extra == \"docs\""} -requests = {version = "2.28.1", optional = true, markers = "extra == \"cli\""} +click = {version = ">=8.1.0,<9", optional = true, markers = "extra == \"black\" or extra == \"cli\" or extra == \"docs\""} +requests = {version = ">=2.28.1,<3", optional = true, markers = "extra == \"cli\""} tox = {version = "3.28.0", optional = true, markers = "extra == \"cli\" or extra == \"tox\""} [package.extras] bandit = ["bandit (==1.7.4)"] -black = ["black (==23.1.0)", "click (==8.0.2)"] -cli = ["click (==8.0.2)", "requests (==2.28.1)", "tox (==3.28.0)"] +black = ["black (==23.1.0)", "click (>=8.1.0,<9)"] +cli = ["click (>=8.1.0,<9)", "requests (>=2.28.1,<3)", "tox (==3.28.0)"] darglint = ["darglint (==1.8.1)"] -docs = ["Markdown (==3.3.7)", "Pygments (>=2.16,<3.0)", "bs4 (==0.0.1)", "click (==8.0.2)", "markdown-include (==0.8.0)", "mkdocs (>=1.5.3,<2.0)", "mkdocs-macros-plugin (==0.7.0)", "mkdocs-material (==9.4.10)", "mkdocs-material-extensions (==1.3)", "mkdocs-redirects (==1.2.0)", "pydoc-markdown (==4.8.2)", "pydocstyle (==6.2.3)", "pymdown-extensions (>=10.2,<11.0)"] +docs = ["Markdown (==3.3.7)", "Pygments (>=2.16,<3.0)", "bs4 (==0.0.1)", "click (>=8.1.0,<9)", "markdown-include (==0.8.0)", "mkdocs (>=1.5.3,<2.0)", "mkdocs-macros-plugin (==0.7.0)", "mkdocs-material (==9.4.10)", "mkdocs-material-extensions (==1.3)", "mkdocs-redirects (==1.2.0)", "pydoc-markdown (==4.8.2)", "pydocstyle (==6.2.3)", "pymdown-extensions (>=10.2,<11.0)"] flake8 = ["flake8 (==3.9.2)", "flake8-bugbear (==23.1.14)", "flake8-docstrings (==1.6.0)", "flake8-eradicate (==1.4.0)", "flake8-isort (==6.0.0)", "pydocstyle (==6.2.3)"] isort = ["isort (==5.11.4)"] liccheck = ["liccheck (==0.8.3)"] mypy = ["mypy (==0.991)"] pylint = ["pylint (==2.13.9)"] safety = ["safety (==2.4.0b1)"] -tests = ["pytest (==7.2.1)", "pytest-asyncio (==0.20.3)", "pytest-cov (==4.0.0)", "pytest-randomly (==3.12.0)", "pytest-rerunfailures (==11.0)"] +tests = ["pytest (==7.2.1)", "pytest-asyncio (>=0.21.0,<0.22.0)", "pytest-cov (==4.0.0)", "pytest-randomly (==3.12.0)", "pytest-rerunfailures (==11.0)"] tox = ["tox (==3.28.0)"] vulture = ["vulture (==2.7)"] @@ -3000,7 +2973,6 @@ vulture = ["vulture (==2.7)"] name = "toolz" version = "0.12.1" description = "List processing tools and functional utilities" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3012,7 +2984,6 @@ files = [ name = "tox" version = "3.28.0" description = "tox is a generic virtualenv management and test command line tool" -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ @@ -3038,7 +3009,6 @@ testing = ["flaky (>=3.4.0)", "freezegun (>=0.3.11)", "pathlib2 (>=2.3.3)", "psu name = "typing-extensions" version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3048,26 +3018,25 @@ files = [ [[package]] name = "urllib3" -version = "1.26.19" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.8" files = [ - {file = "urllib3-1.26.19-py2.py3-none-any.whl", hash = "sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3"}, - {file = "urllib3-1.26.19.tar.gz", hash = "sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] -brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" version = "0.27.0" description = "The lightning-fast ASGI server." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3087,7 +3056,6 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", name = "valory-docker-compose" version = "1.29.3" description = "Multi-container orchestration for Docker" -category = "main" optional = false python-versions = ">=3.4" files = [ @@ -3116,7 +3084,6 @@ tests = ["ddt (>=1.2.2,<2)", "pytest (<6)"] name = "varint" version = "1.0.2" description = "Simple python varint implementation" -category = "main" optional = false python-versions = "*" files = [ @@ -3127,7 +3094,6 @@ files = [ name = "virtualenv" version = "20.26.3" description = "Virtual Python Environment builder" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3148,7 +3114,6 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess name = "watchdog" version = "4.0.1" description = "Filesystem events monitoring" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3193,7 +3158,6 @@ watchmedo = ["PyYAML (>=3.10)"] name = "web3" version = "6.1.0" description = "web3.py" -category = "main" optional = false python-versions = ">=3.7.2" files = [ @@ -3227,7 +3191,6 @@ tester = ["eth-tester[py-evm] (==v0.8.0-b.3)", "py-geth (>=3.11.0)"] name = "websocket-client" version = "0.59.0" description = "WebSocket client for Python with low level API options" -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3242,7 +3205,6 @@ six = "*" name = "websockets" version = "12.0" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3324,7 +3286,6 @@ files = [ name = "werkzeug" version = "2.0.3" description = "The comprehensive WSGI web application library." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3339,7 +3300,6 @@ watchdog = ["watchdog"] name = "yarl" version = "1.9.4" description = "Yet another URL library" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3443,7 +3403,6 @@ multidict = ">=4.0" name = "zipp" version = "3.19.2" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3458,4 +3417,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = "<3.12,>=3.9" -content-hash = "456a1a45f86bdda8fcc8c9e922c0eec5d129707d2354ac29985bec3fc7b94842" +content-hash = "85568473089af1d5ba1b5a8ada225c96b7ff03067a2edabdaacd7ff61e4d0a06" diff --git a/pyproject.toml b/pyproject.toml index a0821d0a9..a7bfc85fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,11 +19,11 @@ operate = "operate.cli:main" [tool.poetry.dependencies] python = "<3.12,>=3.9" -open-autonomy = "==0.14.11.post1" -open-aea-ledger-cosmos = "==1.51.0" -open-aea-ledger-ethereum = "==1.51.0" -open-aea-ledger-ethereum-flashbots = "==1.51.0" -open-aea-cli-ipfs = "==1.51.0" +open-autonomy = "==0.14.14.post2" +open-aea-ledger-cosmos = "==1.53.0" +open-aea-ledger-ethereum = "==1.53.0" +open-aea-ledger-ethereum-flashbots = "==1.53.0" +open-aea-cli-ipfs = "==1.53.0" clea = "==0.1.0rc4" cytoolz = "==0.12.3" docker = "6.1.2" @@ -50,7 +50,7 @@ pyinstaller = "^6.8.0" aiohttp = "3.9.5" [tool.poetry.group.development.dependencies] -tomte = {version = "0.2.15", extras = ["cli"]} +tomte = {version = "0.2.17", extras = ["cli"]} [build-system] requires = ["poetry-core"] From e096a81ffeff2df53114ce4ed392e03f8a520d85 Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Fri, 26 Jul 2024 13:46:49 +0200 Subject: [PATCH 026/134] chore: fix --- operate/services/manage.py | 18 ++++++++++-------- operate/types.py | 11 ----------- 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/operate/services/manage.py b/operate/services/manage.py index e8d452728..21069148d 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -369,6 +369,7 @@ def deploy_service_onchain( # pylint: disable=too-many-statements def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too-many-locals self, hash: str, + update: bool = False, ) -> None: """ Deploy as service on-chain @@ -427,7 +428,6 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too f"address: {wallet.safe}; required olas: {required_olas}; your balance: {balance}" ) - on_chain_hash = self._get_on_chain_hash(service) is_first_mint = self._get_on_chain_state(service) == OnChainState.NON_EXISTENT is_update = (not is_first_mint) and (on_chain_hash is not None) and (on_chain_hash != service.hash) @@ -436,15 +436,17 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too self.logger.info(f"{is_first_mint=}") self.logger.info(f"{is_update=}") - if is_update: - self.terminate_service_on_chain_from_safe(hash=hash) + is_update = update # TODO fix + # if is_update: + # self.terminate_service_on_chain_from_safe(hash=hash) - if is_first_mint or (is_update and self._get_on_chain_state(service) == OnChainState.PRE_REGISTRATION): - if not is_update: - self.logger.info("Minting the on-chain service") - else: - self.logger.info("Updating the on-chain service") + # if is_first_mint or (is_update and self._get_on_chain_state(service) == OnChainState.PRE_REGISTRATION): + # if not is_update: + # self.logger.info("Minting the on-chain service") + # else: + # self.logger.info("Updating the on-chain service") + if is_first_mint: receipt = ( sftxb.new_tx() .add( diff --git a/operate/types.py b/operate/types.py index 1babb5f82..efd3e8cf7 100644 --- a/operate/types.py +++ b/operate/types.py @@ -166,17 +166,6 @@ class LedgerConfig(LocalResource): LedgerConfigs = t.List[LedgerConfig] -class ServiceState(enum.IntEnum): - """Service state""" - - NON_EXISTENT = 0 - PRE_REGISTRATION = 1 - ACTIVE_REGISTRATION = 2 - FINISHED_REGISTRATION = 3 - DEPLOYED = 4 - TERMINATED_BONDED = 5 - - class DeploymentConfig(TypedDict): """Deployments template.""" From 6bcd92ffe1b04d5c88681d96436d9e5b12b04c99 Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Fri, 26 Jul 2024 18:49:45 +0200 Subject: [PATCH 027/134] [no ci] chore: update --- operate/cli.py | 12 ++++-------- operate/services/manage.py | 18 +++++++++--------- operate/services/service.py | 10 ++++++---- operate/types.py | 24 ++++++++++++++++++++---- 4 files changed, 39 insertions(+), 25 deletions(-) diff --git a/operate/cli.py b/operate/cli.py index 80dfa36bf..feaad20ad 100644 --- a/operate/cli.py +++ b/operate/cli.py @@ -515,12 +515,10 @@ async def _create_services(request: Request) -> JSONResponse: old_hash = manager.json[0]["hash"] if old_hash == template["hash"]: logger.info(f'Loading service {template["hash"]}') + chain_configs = [services.manage.ChainConfig.from_json(item) for item in template["chain_configs"]] service = manager.load_or_create( hash=template["hash"], - rpc=template["configuration"]["rpc"], - on_chain_user_params=services.manage.OnChainUserParams.from_json( - template["configuration"] - ), + chain_configs=chain_configs, ) else: logger.info(f"Updating service from {old_hash} to " + template["hash"]) @@ -536,12 +534,10 @@ async def _create_services(request: Request) -> JSONResponse: update = True else: logger.info(f'Creating service {template["hash"]}') + chain_configs = [services.manage.ChainConfig.from_json(item) for item in template["chain_configs"]] service = manager.load_or_create( hash=template["hash"], - rpc=template["configuration"]["rpc"], - on_chain_user_params=services.manage.OnChainUserParams.from_json( - template["configuration"] - ), + chain_configs=chain_configs, ) if template.get("deploy", False): diff --git a/operate/services/manage.py b/operate/services/manage.py index 21069148d..431ec8d87 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -38,6 +38,8 @@ from operate.ledger.profiles import CONTRACTS, OLAS, STAKING from operate.services.protocol import EthSafeTxBuilder, OnChainManager, StakingState from operate.services.service import ( + ChainConfig, + ChainConfigs, DELETE_PREFIX, Deployment, NON_EXISTENT_TOKEN, @@ -142,8 +144,7 @@ def get_eth_safe_tx_builder(self, service: Service) -> EthSafeTxBuilder: def load_or_create( self, hash: str, - rpc: t.Optional[str] = None, - on_chain_user_params: t.Optional[OnChainUserParams] = None, + chain_configs: t.Optional[ChainConfigs] = None, keys: t.Optional[t.List[Key]] = None, ) -> Service: """ @@ -151,7 +152,7 @@ def load_or_create( :param hash: Service hash :param rpc: RPC string - :param on_chain_user_params: On-chain user parameters + :param chain_configs: Chain configurations :param keys: Keys :return: Service instance """ @@ -159,20 +160,19 @@ def load_or_create( if path.exists(): return Service.load(path=path) - if rpc is None: - raise ValueError("RPC cannot be None when creating a new service") + # if rpc is None: + # raise ValueError("RPC cannot be None when creating a new service") - if on_chain_user_params is None: + if chain_configs is None: raise ValueError( - "On-chain user parameters cannot be None when creating a new service" + "Chain configurations cannot be None when creating a new service" ) service = Service.new( hash=hash, keys=keys or [], - rpc=rpc, storage=self.path, - on_chain_user_params=on_chain_user_params, + chain_configs=chain_configs, ) if not service.keys: diff --git a/operate/services/service.py b/operate/services/service.py index 67121bb44..1d0624575 100644 --- a/operate/services/service.py +++ b/operate/services/service.py @@ -67,6 +67,8 @@ from operate.services.utils import tendermint from operate.types import ( ChainType, + ChainConfig, + ChainConfigs, DeployedNodes, DeploymentConfig, DeploymentStatus, @@ -625,8 +627,7 @@ class Service(LocalResource): hash: str keys: Keys - ledger_config: LedgerConfig - chain_data: OnChainData + chain_configs: ChainConfigs path: Path service_path: Path @@ -663,8 +664,7 @@ def deployment(self) -> Deployment: def new( hash: str, keys: Keys, - rpc: str, - on_chain_user_params: OnChainUserParams, + chain_configs: ChainConfigs, storage: Path, ) -> "Service": """Create a new service.""" @@ -680,6 +680,8 @@ def new( config, *_ = yaml_load_all(fp) ledger_config = ServiceHelper(path=service_path).ledger_config() + + ledger_config.chain service = Service( name=config["author"] + "/" + config["name"], hash=hash, diff --git a/operate/types.py b/operate/types.py index efd3e8cf7..8b3887d82 100644 --- a/operate/types.py +++ b/operate/types.py @@ -163,9 +163,6 @@ class LedgerConfig(LocalResource): chain: ChainType -LedgerConfigs = t.List[LedgerConfig] - - class DeploymentConfig(TypedDict): """Deployments template.""" @@ -193,6 +190,9 @@ class ConfigurationTemplate(TypedDict): fund_requirements: FundRequirementsTemplate +ConfigurationTemplates = t.List[ConfigurationTemplate] + + class ServiceTemplate(TypedDict): """Service template.""" @@ -200,7 +200,7 @@ class ServiceTemplate(TypedDict): hash: str image: str description: str - configuration: ConfigurationTemplate + configurations: ConfigurationTemplates @dataclass @@ -248,3 +248,19 @@ class OnChainData(LocalResource): staked: bool on_chain_state: OnChainState user_params: OnChainUserParams + + +@dataclass +class ChainConfig(LocalResource): + """Chain config.""" + + ledger_config: LedgerConfig + chain_data: OnChainData + + @classmethod + def from_json(cls, obj: t.Dict) -> "ChainConfig": + """Load the chain config.""" + return super().from_json(obj) # type: ignore + + +ChainConfigs = t.List[ChainConfig] From 480cfe740bafea8ee47ab9e54b512be56b38ae0c Mon Sep 17 00:00:00 2001 From: Ardian Date: Wed, 31 Jul 2024 18:36:51 +0200 Subject: [PATCH 028/134] release: rc95 --- electron/install.js | 2 +- package.json | 2 +- pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/electron/install.js b/electron/install.js index f85e72e9d..c629576df 100644 --- a/electron/install.js +++ b/electron/install.js @@ -14,7 +14,7 @@ const { paths } = require('./constants'); * - use "" (nothing as a suffix) for latest release candidate, for example "0.1.0rc26" * - use "alpha" for alpha release, for example "0.1.0rc26-alpha" */ -const OlasMiddlewareVersion = '0.1.0rc93'; +const OlasMiddlewareVersion = '0.1.0rc95'; const Env = { ...process.env, diff --git a/package.json b/package.json index 7354222bf..67b1d8c1f 100644 --- a/package.json +++ b/package.json @@ -57,5 +57,5 @@ "test:frontend": "cd frontend && yarn test", "download-binaries": "sh download_binaries.sh" }, - "version": "0.1.0-rc93" + "version": "0.1.0-rc95" } diff --git a/pyproject.toml b/pyproject.toml index 1a4727d41..76d5cf9f7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "olas-operate-middleware" -version = "0.1.0-rc93" +version = "0.1.0-rc95" description = "" authors = ["David Vilela ", "Viraj Patel "] readme = "README.md" From ab41eedeeb2df1cba635e18e0eb2fb932c1261a5 Mon Sep 17 00:00:00 2001 From: Ardian Date: Thu, 1 Aug 2024 19:06:01 +0200 Subject: [PATCH 029/134] feat: add dev build --- .github/workflows/release.yml | 19 +++++++++++++++++++ build.js | 12 +++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0eade5ffb..78dc854d7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -102,4 +102,23 @@ jobs: NODE_ENV: production DEV_RPC: https://rpc-gate.autonolas.tech/gnosis-rpc/ FORK_URL: https://rpc-gate.autonolas.tech/gnosis-rpc/ + run: node build.js + - name: "Build frontend with dev env vars" + run: yarn build:frontend + env: + NODE_ENV: development + DEV_RPC: https://virtual.gnosis.rpc.tenderly.co/78ca845d-2b24-44a6-9ce2-869a979e8b5b + IS_STAGING: ${{ github.ref != 'refs/heads/main' && 'true' || 'false' }} + FORK_URL: https://virtual.gnosis.rpc.tenderly.co/78ca845d-2b24-44a6-9ce2-869a979e8b5b + - name: "Build, notarize, publish dev build" + env: + APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLEIDPASS }} + APPLE_ID: ${{ secrets.APPLEID }} + APPLETEAMID: ${{ secrets.APPLETEAMID }} + CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} + CSC_LINK: ${{ secrets.CSC_LINK }} + GH_TOKEN: ${{ secrets.github_token}} + NODE_ENV: development + DEV_RPC: https://virtual.gnosis.rpc.tenderly.co/78ca845d-2b24-44a6-9ce2-869a979e8b5b + FORK_URL: https://virtual.gnosis.rpc.tenderly.co/78ca845d-2b24-44a6-9ce2-869a979e8b5b run: node build.js \ No newline at end of file diff --git a/build.js b/build.js index a7e15a32b..8570e3bdd 100644 --- a/build.js +++ b/build.js @@ -6,6 +6,16 @@ const build = require('electron-builder').build; const { publishOptions } = require('./electron/constants'); +/** + * Get the artifact name for the build based on the environment. + * @returns {string} + */ +function artifactName() { + const env = process.env.NODE_ENV; + const prefix = env !== 'production' ? 'dev-' : ''; + return prefix + '${productName}-${version}-${platform}-${arch}.${ext}'; +} + const main = async () => { console.log('Building...'); @@ -14,7 +24,7 @@ const main = async () => { publish: 'onTag', config: { appId: 'xyz.valory.olas-operate-app', - artifactName: '${productName}-${version}-${platform}-${arch}.${ext}', + artifactName: artifactName(), productName: 'Pearl', files: ['electron/**/*', 'package.json'], directories: { From 21d38f9b23053284ddda5a2869d6a2874f779986 Mon Sep 17 00:00:00 2001 From: Ardian Date: Thu, 1 Aug 2024 19:35:31 +0200 Subject: [PATCH 030/134] release: rc97 --- electron/install.js | 2 +- package.json | 2 +- pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/electron/install.js b/electron/install.js index c629576df..73f17892c 100644 --- a/electron/install.js +++ b/electron/install.js @@ -14,7 +14,7 @@ const { paths } = require('./constants'); * - use "" (nothing as a suffix) for latest release candidate, for example "0.1.0rc26" * - use "alpha" for alpha release, for example "0.1.0rc26-alpha" */ -const OlasMiddlewareVersion = '0.1.0rc95'; +const OlasMiddlewareVersion = '0.1.0rc97'; const Env = { ...process.env, diff --git a/package.json b/package.json index 67b1d8c1f..66ccdaace 100644 --- a/package.json +++ b/package.json @@ -57,5 +57,5 @@ "test:frontend": "cd frontend && yarn test", "download-binaries": "sh download_binaries.sh" }, - "version": "0.1.0-rc95" + "version": "0.1.0-rc97" } diff --git a/pyproject.toml b/pyproject.toml index 76d5cf9f7..8a4765170 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "olas-operate-middleware" -version = "0.1.0-rc95" +version = "0.1.0-rc97" description = "" authors = ["David Vilela ", "Viraj Patel "] readme = "README.md" From dec9eb82c247cedc6238cc33434c49a695a1e31e Mon Sep 17 00:00:00 2001 From: mohandast52 Date: Fri, 2 Aug 2024 02:25:28 +0530 Subject: [PATCH 031/134] chore: Update AgentButton to open support URL in Discord --- .../components/Main/MainHeader/AgentButton/index.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/frontend/components/Main/MainHeader/AgentButton/index.tsx b/frontend/components/Main/MainHeader/AgentButton/index.tsx index cd6f72c59..642b48a26 100644 --- a/frontend/components/Main/MainHeader/AgentButton/index.tsx +++ b/frontend/components/Main/MainHeader/AgentButton/index.tsx @@ -4,6 +4,7 @@ import { useCallback, useMemo } from 'react'; import { Chain, DeploymentStatus } from '@/client'; import { COLOR } from '@/constants/colors'; +import { SUPPORT_URL } from '@/constants/urls'; import { useBalance } from '@/hooks/useBalance'; import { useElectronApi } from '@/hooks/useElectronApi'; import { useServices } from '@/hooks/useServices'; @@ -259,8 +260,12 @@ export const AgentButton = () => { } return ( - ); }, [ From d63263b60e0134acceeac5279bcf0482c217cc14 Mon Sep 17 00:00:00 2001 From: mohandast52 Date: Fri, 2 Aug 2024 02:30:17 +0530 Subject: [PATCH 032/134] feat: Add external link symbol to 'Seek help in Discord' button --- frontend/components/Main/MainHeader/AgentButton/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/components/Main/MainHeader/AgentButton/index.tsx b/frontend/components/Main/MainHeader/AgentButton/index.tsx index 642b48a26..756471bc2 100644 --- a/frontend/components/Main/MainHeader/AgentButton/index.tsx +++ b/frontend/components/Main/MainHeader/AgentButton/index.tsx @@ -4,6 +4,7 @@ import { useCallback, useMemo } from 'react'; import { Chain, DeploymentStatus } from '@/client'; import { COLOR } from '@/constants/colors'; +import { UNICODE_SYMBOLS } from '@/constants/symbols'; import { SUPPORT_URL } from '@/constants/urls'; import { useBalance } from '@/hooks/useBalance'; import { useElectronApi } from '@/hooks/useElectronApi'; @@ -265,7 +266,7 @@ export const AgentButton = () => { size="large" onClick={() => window.open(SUPPORT_URL, '_blank')} > - Seek help in Discord + Seek help in Discord {UNICODE_SYMBOLS.EXTERNAL_LINK} ); }, [ From 057846b3df83549b8176822aa307b908ff106b2e Mon Sep 17 00:00:00 2001 From: mohandast52 Date: Fri, 2 Aug 2024 19:00:27 +0530 Subject: [PATCH 033/134] chore: Update tray icons for logged-out status --- electron/main.js | 14 +++++++++++--- frontend/types/ElectronApi.ts | 6 +++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/electron/main.js b/electron/main.js index e2c66a668..5a01cae73 100644 --- a/electron/main.js +++ b/electron/main.js @@ -131,17 +131,18 @@ const createTray = () => { tray.setContextMenu(contextMenu); ipcMain.on('tray', (_event, status) => { + const isSupportedOS = isWindows || isMac; switch (status) { case 'low-gas': { const icon = getUpdatedTrayIcon( - isWindows || isMac ? TRAY_ICONS.LOW_GAS : TRAY_ICONS_PATHS.LOW_GAS, + isSupportedOS ? TRAY_ICONS.LOW_GAS : TRAY_ICONS_PATHS.LOW_GAS, ); tray.setImage(icon); break; } case 'running': { const icon = getUpdatedTrayIcon( - isWindows || isMac ? TRAY_ICONS.RUNNING : TRAY_ICONS_PATHS.RUNNING, + isSupportedOS ? TRAY_ICONS.RUNNING : TRAY_ICONS_PATHS.RUNNING, ); tray.setImage(icon); @@ -149,7 +150,14 @@ const createTray = () => { } case 'paused': { const icon = getUpdatedTrayIcon( - isWindows || isMac ? TRAY_ICONS.PAUSED : TRAY_ICONS_PATHS.PAUSED, + isSupportedOS ? TRAY_ICONS.PAUSED : TRAY_ICONS_PATHS.PAUSED, + ); + tray.setImage(icon); + break; + } + case 'logged-out': { + const icon = getUpdatedTrayIcon( + isSupportedOS ? TRAY_ICONS.LOGGED_OUT : TRAY_ICONS_PATHS.LOGGED_OUT, ); tray.setImage(icon); break; diff --git a/frontend/types/ElectronApi.ts b/frontend/types/ElectronApi.ts index df0456a47..61d551e8b 100644 --- a/frontend/types/ElectronApi.ts +++ b/frontend/types/ElectronApi.ts @@ -6,4 +6,8 @@ export type ElectronStore = { agentEvictionAlertShown?: boolean; }; -export type ElectronTrayIconStatus = 'low-gas' | 'running' | 'paused'; +export type ElectronTrayIconStatus = + | 'low-gas' + | 'running' + | 'paused' + | 'logged-out'; From 1c8e6f66df0c83a7d52c53384da3516db755164c Mon Sep 17 00:00:00 2001 From: mohandast52 Date: Fri, 2 Aug 2024 19:00:58 +0530 Subject: [PATCH 034/134] feat: update icon for BUILT deployment status --- frontend/components/Main/MainHeader/index.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/components/Main/MainHeader/index.tsx b/frontend/components/Main/MainHeader/index.tsx index c24b0d430..78ffde06f 100644 --- a/frontend/components/Main/MainHeader/index.tsx +++ b/frontend/components/Main/MainHeader/index.tsx @@ -23,6 +23,8 @@ const useSetupTrayIcon = () => { setTrayIcon?.('running'); } else if (serviceStatus === DeploymentStatus.STOPPED) { setTrayIcon?.('paused'); + } else if (serviceStatus === DeploymentStatus.BUILT) { + setTrayIcon?.('logged-out'); } }, [safeBalance, serviceStatus, setTrayIcon]); From bcd9e6ff8eef87ad37a63430286ea2b4cf6d7588 Mon Sep 17 00:00:00 2001 From: mohandast52 Date: Fri, 2 Aug 2024 19:13:57 +0530 Subject: [PATCH 035/134] chore: move AgentHead to it's own file from index.tsx --- .../Main/MainHeader/{AgentHead/index.tsx => AgentHead.tsx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename frontend/components/Main/MainHeader/{AgentHead/index.tsx => AgentHead.tsx} (100%) diff --git a/frontend/components/Main/MainHeader/AgentHead/index.tsx b/frontend/components/Main/MainHeader/AgentHead.tsx similarity index 100% rename from frontend/components/Main/MainHeader/AgentHead/index.tsx rename to frontend/components/Main/MainHeader/AgentHead.tsx From 38a24769a74e247bf651b6fc2aceddf98a393b95 Mon Sep 17 00:00:00 2001 From: mohandast52 Date: Fri, 2 Aug 2024 19:21:04 +0530 Subject: [PATCH 036/134] chore: add 'CannotStartAgentDueToUnexpectedError' component --- .../Main/MainHeader/AgentButton/index.tsx | 17 +++------- .../Main/MainHeader/CannotStartAgent.tsx | 31 ++++++++++++++++--- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/frontend/components/Main/MainHeader/AgentButton/index.tsx b/frontend/components/Main/MainHeader/AgentButton/index.tsx index 756471bc2..8ec174417 100644 --- a/frontend/components/Main/MainHeader/AgentButton/index.tsx +++ b/frontend/components/Main/MainHeader/AgentButton/index.tsx @@ -4,8 +4,6 @@ import { useCallback, useMemo } from 'react'; import { Chain, DeploymentStatus } from '@/client'; import { COLOR } from '@/constants/colors'; -import { UNICODE_SYMBOLS } from '@/constants/symbols'; -import { SUPPORT_URL } from '@/constants/urls'; import { useBalance } from '@/hooks/useBalance'; import { useElectronApi } from '@/hooks/useElectronApi'; import { useServices } from '@/hooks/useServices'; @@ -17,7 +15,10 @@ import { ServicesService } from '@/service/Services'; import { WalletService } from '@/service/Wallet'; import { getMinimumStakedAmountRequired } from '@/utils/service'; -import { CannotStartAgent } from '../CannotStartAgent'; +import { + CannotStartAgent, + CannotStartAgentDueToUnexpectedError, +} from '../CannotStartAgent'; import { requiredGas, requiredOlas } from '../constants'; const { Text } = Typography; @@ -260,15 +261,7 @@ export const AgentButton = () => { return ; } - return ( - - ); + return ; }, [ hasInitialLoaded, serviceStatus, diff --git a/frontend/components/Main/MainHeader/CannotStartAgent.tsx b/frontend/components/Main/MainHeader/CannotStartAgent.tsx index 9206d6fa0..556512f5d 100644 --- a/frontend/components/Main/MainHeader/CannotStartAgent.tsx +++ b/frontend/components/Main/MainHeader/CannotStartAgent.tsx @@ -15,6 +15,32 @@ const cannotStartAgentText = ( ); +const otherPopoverProps: PopoverProps = { + arrow: false, + placement: 'bottomRight', +}; + +export const CannotStartAgentDueToUnexpectedError = () => ( + + + Try to restart the app. If the issue persists, join the Olas community + Discord server to report or stay up to date on the issue. + + + + Olas community Discord server {UNICODE_SYMBOLS.EXTERNAL_LINK} + + + } + > + {cannotStartAgentText} + +); + const evictedDescription = "You didn't run your agent enough and it missed its targets multiple times. Please wait a few days and try to run your agent again."; const AgentEvictedPopover = () => ( @@ -27,11 +53,6 @@ const AgentEvictedPopover = () => ( ); -const otherPopoverProps: PopoverProps = { - arrow: false, - placement: 'bottomRight', -}; - const JoinOlasCommunity = () => (
From 403aa589ba64b9f6fde66d07a7fd1a133ad77e9a Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Fri, 2 Aug 2024 17:07:05 +0200 Subject: [PATCH 037/134] chore: refactor --- operate/cli.py | 10 ++++- operate/services/manage.py | 90 +++++++++++++++++++++++-------------- operate/services/service.py | 68 +++++++++++++++++----------- operate/types.py | 9 +++- 4 files changed, 114 insertions(+), 63 deletions(-) diff --git a/operate/cli.py b/operate/cli.py index feaad20ad..44fe5b279 100644 --- a/operate/cli.py +++ b/operate/cli.py @@ -515,7 +515,10 @@ async def _create_services(request: Request) -> JSONResponse: old_hash = manager.json[0]["hash"] if old_hash == template["hash"]: logger.info(f'Loading service {template["hash"]}') - chain_configs = [services.manage.ChainConfig.from_json(item) for item in template["chain_configs"]] + chain_configs = [ + services.manage.ChainConfig.from_json(item) + for item in template["chain_configs"] + ] service = manager.load_or_create( hash=template["hash"], chain_configs=chain_configs, @@ -534,7 +537,10 @@ async def _create_services(request: Request) -> JSONResponse: update = True else: logger.info(f'Creating service {template["hash"]}') - chain_configs = [services.manage.ChainConfig.from_json(item) for item in template["chain_configs"]] + chain_configs = [ + services.manage.ChainConfig.from_json(item) + for item in template["chain_configs"] + ] service = manager.load_or_create( hash=template["hash"], chain_configs=chain_configs, diff --git a/operate/services/manage.py b/operate/services/manage.py index 431ec8d87..b036f2a9d 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -48,6 +48,7 @@ OnChainUserParams, Service, ) +from operate.types import ServiceTemplate from operate.wallet.master import MasterWalletManager @@ -144,15 +145,14 @@ def get_eth_safe_tx_builder(self, service: Service) -> EthSafeTxBuilder: def load_or_create( self, hash: str, - chain_configs: t.Optional[ChainConfigs] = None, + service_template: t.Optional[ServiceTemplate] = None, keys: t.Optional[t.List[Key]] = None, ) -> Service: """ Create or load a service :param hash: Service hash - :param rpc: RPC string - :param chain_configs: Chain configurations + :param service_template: Service template :param keys: Keys :return: Service instance """ @@ -160,19 +160,16 @@ def load_or_create( if path.exists(): return Service.load(path=path) - # if rpc is None: - # raise ValueError("RPC cannot be None when creating a new service") - - if chain_configs is None: + if service_template is None: raise ValueError( - "Chain configurations cannot be None when creating a new service" + "'service_template' cannot be None when creating a new service" ) service = Service.new( hash=hash, keys=keys or [], storage=self.path, - chain_configs=chain_configs, + service_template=service_template, ) if not service.keys: @@ -198,7 +195,6 @@ def _get_on_chain_state(self, service: Service) -> OnChainState: service.store() return service_state - def _get_on_chain_hash(self, service: Service) -> t.Optional[str]: if service.chain_data.token == NON_EXISTENT_TOKEN: return None @@ -366,10 +362,25 @@ def deploy_service_onchain( # pylint: disable=too-many-statements ) service.store() + def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too-many-locals self, hash: str, update: bool = False, + ) -> None: + service = self.load_or_create(hash=hash) + for chain_id in service.chain_configs.keys(): + self._deploy_service_onchain_from_safe( + hash=hash, + update=update, + chain_id=chain_id, + ) + + def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too-many-locals + self, + hash: str, + update: bool, + chain_id: int, ) -> None: """ Deploy as service on-chain @@ -380,36 +391,39 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too self.logger.info("Loading service") service = self.load_or_create(hash=hash) - user_params = service.chain_data.user_params + chain_config = service.chain_configs[chain_id] + ledger_config = chain_config.ledger_config + chain_data = chain_config.chain_data + user_params = chain_config.chain_data.user_params keys = service.keys instances = [key.address for key in keys] - wallet = self.wallet_manager.load(service.ledger_config.type) + wallet = self.wallet_manager.load(ledger_config.type) sftxb = self.get_eth_safe_tx_builder(service=service) if user_params.use_staking and not sftxb.staking_slots_available( - staking_contract=STAKING[service.ledger_config.chain] + staking_contract=STAKING[ledger_config.chain] ): raise ValueError("No staking slots available") - if service.chain_data.token > -1: + if chain_data.token > -1: self.logger.info("Syncing service state") - info = sftxb.info(token_id=service.chain_data.token) - service.chain_data.on_chain_state = OnChainState(info["service_state"]) - service.chain_data.instances = info["instances"] - service.chain_data.multisig = info["multisig"] + info = sftxb.info(token_id=chain_data.token) + chain_data.on_chain_state = OnChainState(info["service_state"]) + chain_data.instances = info["instances"] + chain_data.multisig = info["multisig"] service.store() self.logger.info(f"Service state: {service.chain_data.on_chain_state.name}") if user_params.use_staking: self.logger.info("Checking staking compatibility") - if service.chain_data.on_chain_state in ( + if chain_data.on_chain_state in ( OnChainState.NON_EXISTENT, OnChainState.PRE_REGISTRATION, ): required_olas = ( user_params.olas_cost_of_bond + user_params.olas_required_to_stake ) - elif service.chain_data.on_chain_state == OnChainState.ACTIVE_REGISTRATION: + elif chain_data.on_chain_state == OnChainState.ACTIVE_REGISTRATION: required_olas = user_params.olas_required_to_stake else: required_olas = 0 @@ -417,7 +431,7 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too balance = ( registry_contracts.erc20.get_instance( ledger_api=sftxb.ledger_api, - contract_address=OLAS[service.ledger_config.chain], + contract_address=OLAS[ledger_config.chain], ) .functions.balanceOf(wallet.safe) .call() @@ -430,7 +444,11 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too on_chain_hash = self._get_on_chain_hash(service) is_first_mint = self._get_on_chain_state(service) == OnChainState.NON_EXISTENT - is_update = (not is_first_mint) and (on_chain_hash is not None) and (on_chain_hash != service.hash) + is_update = ( + (not is_first_mint) + and (on_chain_hash is not None) + and (on_chain_hash != service.hash) + ) self.logger.info(f"{on_chain_hash=}") self.logger.info(f"{is_first_mint=}") @@ -446,7 +464,7 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too # else: # self.logger.info("Updating the on-chain service") - if is_first_mint: + if self._get_on_chain_state(service) == OnChainState.NON_EXISTENT: receipt = ( sftxb.new_tx() .add( @@ -461,9 +479,9 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too ), threshold=user_params.threshold, nft=IPFSHash(user_params.nft), - update_token=service.chain_data.token if is_update else None, + update_token=chain_data.token if update else None, token=( - OLAS[service.ledger_config.chain] + OLAS[ledger_config.chain] if user_params.use_staking else None ), @@ -480,10 +498,12 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too receipt=receipt, ).get("events"), ) - service.chain_data.token = event_data["args"]["serviceId"] - service.chain_data.on_chain_state = OnChainState.PRE_REGISTRATION + chain_data.token = event_data["args"]["serviceId"] + chain_data.on_chain_state = OnChainState.PRE_REGISTRATION service.store() + + print("!!!!!!!!!!!!!!!!!!!!!") if self._get_on_chain_state(service) == OnChainState.PRE_REGISTRATION: cost_of_bond = user_params.cost_of_bond if user_params.use_staking: @@ -597,7 +617,6 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too service.chain_data.on_chain_state = OnChainState.DEPLOYED service.store() - # Update local Service info = sftxb.info(token_id=service.chain_data.token) service.chain_data = OnChainData( @@ -649,12 +668,19 @@ def terminate_service_on_chain_from_safe(self, hash: str) -> None: info = sftxb.info(token_id=service.chain_data.token) service.chain_data.on_chain_state = OnChainState(info["service_state"]) - if service.chain_data.user_params.use_staking and not self._can_unstake_service(hash=hash): + if ( + service.chain_data.user_params.use_staking + and not self._can_unstake_service(hash=hash) + ): return self.unstake_service_on_chain(hash=hash) - if self._get_on_chain_state(service) in (OnChainState.ACTIVE_REGISTRATION, OnChainState.FINISHED_REGISTRATION, OnChainState.DEPLOYED): + if self._get_on_chain_state(service) in ( + OnChainState.ACTIVE_REGISTRATION, + OnChainState.FINISHED_REGISTRATION, + OnChainState.DEPLOYED, + ): self.logger.info("Terminating service") sftxb.new_tx().add( sftxb.get_terminate_data( @@ -670,8 +696,7 @@ def terminate_service_on_chain_from_safe(self, hash: str) -> None: ) ).settle() - - if [[ "$current_safe_owners" == "['$agent_address']" ]]: + if [["$current_safe_owners" == "['$agent_address']"]]: sftx = self.get_eth_safe_tx_builder(service=old_service) # noqa: E800 sftx.swap( # noqa: E800 service_id=old_service.chain_data.token, # noqa: E800 @@ -681,7 +706,6 @@ def terminate_service_on_chain_from_safe(self, hash: str) -> None: ), # noqa: E800 ) # noqa: E800 - def unbond_service_on_chain(self, hash: str) -> None: """ Unbond service on-chain diff --git a/operate/services/service.py b/operate/services/service.py index 1d0624575..3c36e4050 100644 --- a/operate/services/service.py +++ b/operate/services/service.py @@ -66,17 +66,21 @@ from operate.services.deployment_runner import run_host_deployment, stop_host_deployment from operate.services.utils import tendermint from operate.types import ( - ChainType, ChainConfig, ChainConfigs, + ChainType, + ConfigurationTemplate, + ConfigurationTemplates, DeployedNodes, DeploymentConfig, DeploymentStatus, LedgerConfig, + LedgerConfigs, LedgerType, OnChainData, OnChainState, OnChainUserParams, + ServiceTemplate, ) @@ -236,21 +240,23 @@ def __init__(self, path: Path) -> None: self.path = path self.config = load_service_config(service_path=path) - def ledger_config(self) -> "LedgerConfig": - """Get ledger config.""" - # TODO: Multiledger/Multiagent support + def ledger_configs(self) -> "LedgerConfigs": + """Get ledger configs.""" + ledger_configs = {} for override in self.config.overrides: if ( override["type"] == "connection" and "valory/ledger" in override["public_id"] ): (_, config), *_ = override["config"]["ledger_apis"].items() - return LedgerConfig( + # TODO chain name is inferred from the chain_id. The actual id provided on service.yaml is ignored. + chain = ChainType.from_id(cid=config["chain_id"]) + ledger_configs[config["chain_id"]] = LedgerConfig( rpc=config["address"], - chain=ChainType.from_id(cid=config["chain_id"]), + chain=chain, type=LedgerType.ETHEREUM, ) - raise ValueError("No ledger config found.") + return ledger_configs def deployment_config(self) -> DeploymentConfig: """Returns deployment config.""" @@ -411,10 +417,12 @@ def _build_docker( ) builder.deplopyment_type = DockerComposeGenerator.deployment_type builder.try_update_abci_connection_params() + + home_chain_data = service.chain_configs[service.home_chain_id] builder.try_update_runtime_params( - multisig_address=service.chain_data.multisig, - agent_instances=service.chain_data.instances, - service_id=service.chain_data.token, + multisig_address=home_chain_data.multisig, + agent_instances=home_chain_data.instances, + service_id=home_chain_data.token, consensus_threshold=None, ) # TODO: Support for multiledger @@ -627,6 +635,7 @@ class Service(LocalResource): hash: str keys: Keys + home_chain_id: int chain_configs: ChainConfigs path: Path @@ -664,7 +673,7 @@ def deployment(self) -> Deployment: def new( hash: str, keys: Keys, - chain_configs: ChainConfigs, + service_template: ServiceTemplate, storage: Path, ) -> "Service": """Create a new service.""" @@ -677,28 +686,35 @@ def new( ) ) with (service_path / "service.yaml").open("r", encoding="utf-8") as fp: - config, *_ = yaml_load_all(fp) + service_yaml, *_ = yaml_load_all(fp) - ledger_config = ServiceHelper(path=service_path).ledger_config() + ledger_configs = ServiceHelper(path=service_path).ledger_configs() - ledger_config.chain - service = Service( - name=config["author"] + "/" + config["name"], - hash=hash, - keys=keys, - ledger_config=LedgerConfig( - rpc=rpc, - type=ledger_config.type, - chain=ledger_config.chain, - ), - chain_data=OnChainData( + chain_configs = {} + for chain, config in service_template["configurations"].items(): + ledger_config = ledger_configs[chain] + ledger_config.rpc = config["rpc"] + + chain_data = OnChainData( instances=[], token=NON_EXISTENT_TOKEN, multisig=DUMMY_MULTISIG, staked=False, on_chain_state=OnChainState.NON_EXISTENT, - user_params=on_chain_user_params, - ), + user_params=OnChainUserParams.from_json(config), + ) + + chain_configs[chain] = ChainConfig( + ledger_config=ledger_config, + chain_data=chain_data, + ) + + service = Service( + name=service_yaml["author"] + "/" + service_yaml["name"], + hash=service_template["hash"], + keys=keys, + home_chain_id=service_template["home_chain_id"], + chain_configs=chain_configs, path=service_path.parent, service_path=service_path, ) diff --git a/operate/types.py b/operate/types.py index 8b3887d82..a622d57c0 100644 --- a/operate/types.py +++ b/operate/types.py @@ -163,6 +163,9 @@ class LedgerConfig(LocalResource): chain: ChainType +LedgerConfigs = t.Dict[str, LedgerConfig] + + class DeploymentConfig(TypedDict): """Deployments template.""" @@ -190,7 +193,7 @@ class ConfigurationTemplate(TypedDict): fund_requirements: FundRequirementsTemplate -ConfigurationTemplates = t.List[ConfigurationTemplate] +ConfigurationTemplates = t.Dict[int, ConfigurationTemplate] class ServiceTemplate(TypedDict): @@ -200,6 +203,8 @@ class ServiceTemplate(TypedDict): hash: str image: str description: str + service_version: str + home_chain_id: int configurations: ConfigurationTemplates @@ -263,4 +268,4 @@ def from_json(cls, obj: t.Dict) -> "ChainConfig": return super().from_json(obj) # type: ignore -ChainConfigs = t.List[ChainConfig] +ChainConfigs = t.Dict[int, ChainConfig] From ccac0721271a5d693c82af513c4e1d938278f5da Mon Sep 17 00:00:00 2001 From: Mohan Date: Mon, 5 Aug 2024 19:14:35 +0530 Subject: [PATCH 038/134] Update build.js --- build.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.js b/build.js index 8570e3bdd..ed96764e0 100644 --- a/build.js +++ b/build.js @@ -12,7 +12,7 @@ const { publishOptions } = require('./electron/constants'); */ function artifactName() { const env = process.env.NODE_ENV; - const prefix = env !== 'production' ? 'dev-' : ''; + const prefix = env === 'production' ? '' : 'dev-'; return prefix + '${productName}-${version}-${platform}-${arch}.${ext}'; } From deddd89555b15c829a7f893514d56ef61612df2e Mon Sep 17 00:00:00 2001 From: Ardian <30511811+0xArdi@users.noreply.github.com> Date: Fri, 9 Aug 2024 13:04:55 +0200 Subject: [PATCH 039/134] fix/ env vars electron (#266) * chore: add .env to `build` * release: rc101 * chore: load env vars * release: rc 102 * release: rc 103 * release: rc 104 * release: rc 105 --- .github/workflows/release.yml | 7 +++++-- build.js | 4 ++++ electron/install.js | 12 +++++++++++- package.json | 2 +- pyproject.toml | 2 +- 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 78dc854d7..7187504d4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -85,7 +85,7 @@ jobs: - run: yarn install-deps - name: "Build frontend with env vars" run: yarn build:frontend - env: + env: NODE_ENV: production DEV_RPC: https://rpc-gate.autonolas.tech/gnosis-rpc/ IS_STAGING: ${{ github.ref != 'refs/heads/main' && 'true' || 'false' }} @@ -121,4 +121,7 @@ jobs: NODE_ENV: development DEV_RPC: https://virtual.gnosis.rpc.tenderly.co/78ca845d-2b24-44a6-9ce2-869a979e8b5b FORK_URL: https://virtual.gnosis.rpc.tenderly.co/78ca845d-2b24-44a6-9ce2-869a979e8b5b - run: node build.js \ No newline at end of file + run: | + echo "DEV_RPC=https://virtual.gnosis.rpc.tenderly.co/78ca845d-2b24-44a6-9ce2-869a979e8b5b" >> .env + echo -e "FORK_URL=https://virtual.gnosis.rpc.tenderly.co/78ca845d-2b24-44a6-9ce2-869a979e8b5b" >> .env + node build.js \ No newline at end of file diff --git a/build.js b/build.js index ed96764e0..fa1e1b0db 100644 --- a/build.js +++ b/build.js @@ -36,6 +36,10 @@ const main = async () => { to: 'bins', filter: ['**/*'], }, + { + from: '.env', + to: '.env' + }, ], cscKeyPassword: process.env.CSC_KEY_PASSWORD, cscLink: process.env.CSC_LINK, diff --git a/electron/install.js b/electron/install.js index 73f17892c..372c7b368 100644 --- a/electron/install.js +++ b/electron/install.js @@ -14,7 +14,17 @@ const { paths } = require('./constants'); * - use "" (nothing as a suffix) for latest release candidate, for example "0.1.0rc26" * - use "alpha" for alpha release, for example "0.1.0rc26-alpha" */ -const OlasMiddlewareVersion = '0.1.0rc97'; +const OlasMiddlewareVersion = '0.1.0rc105'; + +const path = require('path'); +const { app } = require('electron'); + +// load env vars +require('dotenv').config({ + path: app.isPackaged + ? path.join(process.resourcesPath, '.env') + : path.resolve(process.cwd(), '.env'), +}); const Env = { ...process.env, diff --git a/package.json b/package.json index 66ccdaace..3dd422bfe 100644 --- a/package.json +++ b/package.json @@ -57,5 +57,5 @@ "test:frontend": "cd frontend && yarn test", "download-binaries": "sh download_binaries.sh" }, - "version": "0.1.0-rc97" + "version": "0.1.0-rc105" } diff --git a/pyproject.toml b/pyproject.toml index 8a4765170..8ed25abe0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "olas-operate-middleware" -version = "0.1.0-rc97" +version = "0.1.0-rc105" description = "" authors = ["David Vilela ", "Viraj Patel "] readme = "README.md" From 4c1e58e93b06f21d15ae521f5c704487e5f718d7 Mon Sep 17 00:00:00 2001 From: Atatakai Date: Mon, 12 Aug 2024 12:56:44 +0400 Subject: [PATCH 040/134] chore: update agent needs funds alert --- frontend/components/Main/MainNeedsFunds.tsx | 55 ++++++++++++--------- frontend/styles/globals.scss | 6 ++- 2 files changed, 36 insertions(+), 25 deletions(-) diff --git a/frontend/components/Main/MainNeedsFunds.tsx b/frontend/components/Main/MainNeedsFunds.tsx index f275136bf..71464a615 100644 --- a/frontend/components/Main/MainNeedsFunds.tsx +++ b/frontend/components/Main/MainNeedsFunds.tsx @@ -1,6 +1,7 @@ import { Flex, Typography } from 'antd'; import { formatUnits } from 'ethers/lib/utils'; import { ReactNode, useEffect, useMemo } from 'react'; +import styled from 'styled-components'; import { UNICODE_SYMBOLS } from '@/constants/symbols'; import { useBalance } from '@/hooks/useBalance'; @@ -12,9 +13,16 @@ import { getMinimumStakedAmountRequired } from '@/utils/service'; import { Alert } from '../Alert'; import { CardSection } from '../styled/CardSection'; -const { Text, Paragraph } = Typography; +const { Text } = Typography; const COVER_PREV_BLOCK_BORDER_STYLE = { marginTop: '-1px' }; +const FundingValue = styled.div` + font-size: 24px; + font-weight: 700; + line-height: 32px; + letter-spacing: -0.72px; +`; + const useNeedsFunds = () => { const { getServiceTemplates } = useServiceTemplates(); @@ -94,29 +102,28 @@ export const MainNeedsFunds = () => { const message: ReactNode = useMemo( () => ( - - Your agent needs funds - - USE THE ACCOUNT CREDENTIALS PROVIDED IN THE “ADD FUNDS” INSTRUCTIONS - BELOW. - - - To run your agent, you must add these amounts to your account: - - {!hasEnoughOlasForInitialFunding && ( - - {`${UNICODE_SYMBOLS.OLAS}${serviceFundRequirements.olas} OLAS `} - - for staking. - - )} - {!hasEnoughEthForInitialFunding && ( - - - {`${serviceFundRequirements.eth} XDAI `} - - - for trading balance. - - )} + + Your agent needs funds + + {!hasEnoughOlasForInitialFunding && ( +
+ {`${UNICODE_SYMBOLS.OLAS}${serviceFundRequirements.olas} OLAS `} + for staking +
+ )} + {!hasEnoughEthForInitialFunding && ( +
+ + {`$${serviceFundRequirements.eth} XDAI `} + + for trading +
+ )} +
+
    +
  • Do not add more than these amounts.
  • +
  • Use the address in the “Add Funds” section below.
  • +
), [ diff --git a/frontend/styles/globals.scss b/frontend/styles/globals.scss index 13afcf16c..6999610fb 100644 --- a/frontend/styles/globals.scss +++ b/frontend/styles/globals.scss @@ -66,7 +66,7 @@ button, input, select, textarea, .ant-input-suffix { &--primary { border-color: #ECD7FE; background-color: #F8F0FF; - color: #36075F; + color: #7E22CE; .ant-alert-icon { color: #7E22CE; @@ -136,6 +136,10 @@ button, input, select, textarea, .ant-input-suffix { margin-top: 12px !important; } +.p-0 { + padding: 0 !important; +} + .mx-auto { margin-left: auto !important; margin-right: auto !important; From 3f354d06127c35c967daf80318ddf143c5e98abf Mon Sep 17 00:00:00 2001 From: SarthakDev12 Date: Mon, 12 Aug 2024 15:11:20 +0530 Subject: [PATCH 041/134] Script for building middleware binary locally (#250) * add script for building middleware binaries locally * add valory header --- build_pearl.sh | 47 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 4 +++- 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100755 build_pearl.sh diff --git a/build_pearl.sh b/build_pearl.sh new file mode 100755 index 000000000..65e5d4ac9 --- /dev/null +++ b/build_pearl.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# ------------------------------------------------------------------------------ +# +# Copyright 2023-2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + +cd "$(dirname "$0")" + +BIN_DIR="electron/bins/" +mkdir -p $BIN_DIR + +poetry install + +poetry run pyinstaller operate/services/utils/tendermint.py --onefile --distpath $BIN_DIR + +poetry run pyinstaller \ + --collect-data eth_account \ + --collect-all aea \ + --collect-all autonomy \ + --collect-all operate \ + --collect-all aea_ledger_ethereum \ + --collect-all aea_ledger_cosmos \ + --collect-all aea_ledger_ethereum_flashbots \ + --hidden-import aea_ledger_ethereum \ + --hidden-import aea_ledger_cosmos \ + --hidden-import aea_ledger_ethereum_flashbots \ + operate/pearl.py \ + --add-binary ${BIN_DIR}/aea_bin_x64:. \ + --add-binary ${BIN_DIR}/aea_bin_arm64:. \ + --onefile \ + --distpath $BIN_DIR \ + --name pearl_$(uname -m) + diff --git a/package.json b/package.json index 3dd422bfe..4fb27af76 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,9 @@ "dev": "dotenv -e .env -- yarn start", "start:frontend": "cd frontend && yarn start", "test:frontend": "cd frontend && yarn test", - "download-binaries": "sh download_binaries.sh" + "download-binaries": "sh download_binaries.sh", + "build:pearl": "sh build_pearl.sh" + }, "version": "0.1.0-rc105" } From 7fea6a9352aad9a11d1a5ad5d6c0b93975b7b3e6 Mon Sep 17 00:00:00 2001 From: Ardian <30511811+0xArdi@users.noreply.github.com> Date: Mon, 12 Aug 2024 15:45:15 +0200 Subject: [PATCH 042/134] Fix/intel build (#270) * fix: intel build * release: rc107 --- .github/workflows/release.yml | 22 +++++++++++++++------- electron/install.js | 2 +- package.json | 2 +- pyproject.toml | 2 +- templates/trader.yaml | 2 +- 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7187504d4..044325707 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,10 +11,10 @@ on: jobs: build-macos-pyinstaller: - runs-on: macos-latest + runs-on: ${{ matrix.os }} strategy: matrix: - arch: [ x64, arm64 ] + os: [ macos-14, macos-14-large ] steps: - uses: actions/checkout@v3 @@ -34,22 +34,30 @@ jobs: - name: Install dependencies run: poetry install + - name: Set arch environment variable for macos-latest-large + if: contains(matrix.os, 'large') + run: echo "OS_ARCH=x64" >> $GITHUB_ENV + + - name: Set arch environment variable for other macOS versions + if: ${{ !contains(matrix.os, 'large') }} + run: echo "OS_ARCH=arm64" >> $GITHUB_ENV + - name: Get trader bin run: | - trader_version=$(poetry run python -c "import yaml; config = yaml.safe_load(open('templates/trader.yaml')); print(config['configuration']['trader_version'])") + trader_version=$(poetry run python -c "import yaml; config = yaml.safe_load(open('templates/trader.yaml')); print(config['trader_version'])") echo $trader_version - mkdir dist && curl -L -o dist/aea_bin "https://github.com/valory-xyz/trader/releases/download/${trader_version}/trader_bin_${{ matrix.arch }}" + mkdir dist && curl -L -o dist/aea_bin "https://github.com/valory-xyz/trader/releases/download/${trader_version}/trader_bin_${{ env.OS_ARCH }}" - name: Build with PyInstaller run: | poetry run pyinstaller operate/services/utils/tendermint.py --onefile - poetry run pyinstaller --collect-data eth_account --collect-all aea --collect-all autonomy --collect-all operate --collect-all aea_ledger_ethereum --collect-all aea_ledger_cosmos --collect-all aea_ledger_ethereum_flashbots --hidden-import aea_ledger_ethereum --hidden-import aea_ledger_cosmos --hidden-import aea_ledger_ethereum_flashbots operate/pearl.py --add-binary dist/aea_bin:. --add-binary dist/tendermint:. --onefile --name pearl_${{ matrix.arch }} + poetry run pyinstaller --collect-data eth_account --collect-all aea --collect-all autonomy --collect-all operate --collect-all aea_ledger_ethereum --collect-all aea_ledger_cosmos --collect-all aea_ledger_ethereum_flashbots --hidden-import aea_ledger_ethereum --hidden-import aea_ledger_cosmos --hidden-import aea_ledger_ethereum_flashbots operate/pearl.py --add-binary dist/aea_bin:. --add-binary dist/tendermint:. --onefile --name pearl_${{ env.OS_ARCH }} - name: Upload Release Assets uses: actions/upload-artifact@v2 with: - name: pearl_${{ matrix.arch }} - path: dist/pearl_${{ matrix.arch }} + name: pearl_${{ env.OS_ARCH }} + path: dist/pearl_${{ env.OS_ARCH }} release-operate: runs-on: macos-latest diff --git a/electron/install.js b/electron/install.js index 372c7b368..f2dcd865f 100644 --- a/electron/install.js +++ b/electron/install.js @@ -14,7 +14,7 @@ const { paths } = require('./constants'); * - use "" (nothing as a suffix) for latest release candidate, for example "0.1.0rc26" * - use "alpha" for alpha release, for example "0.1.0rc26-alpha" */ -const OlasMiddlewareVersion = '0.1.0rc105'; +const OlasMiddlewareVersion = '0.1.0rc107'; const path = require('path'); const { app } = require('electron'); diff --git a/package.json b/package.json index 4fb27af76..b921e49cc 100644 --- a/package.json +++ b/package.json @@ -59,5 +59,5 @@ "build:pearl": "sh build_pearl.sh" }, - "version": "0.1.0-rc105" + "version": "0.1.0-rc107" } diff --git a/pyproject.toml b/pyproject.toml index 8ed25abe0..478a65f63 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "olas-operate-middleware" -version = "0.1.0-rc105" +version = "0.1.0-rc107" description = "" authors = ["David Vilela ", "Viraj Patel "] readme = "README.md" diff --git a/templates/trader.yaml b/templates/trader.yaml index f59a98e11..63a87f47c 100644 --- a/templates/trader.yaml +++ b/templates/trader.yaml @@ -2,8 +2,8 @@ name: "Trader Agent" description: "A single-agent service (sovereign agent) placing bets on Omen" hash: bafybeidgjgjj5ul6xkubicbemppufgsbx5sr5rwhtrwttk2oivp5bkdnce image: https://operate.olas.network/_next/image?url=%2Fimages%2Fprediction-agent.png&w=3840&q=75 +trader_version: v0.18.1 configuration: - trader_version: v0.16.4 nft: bafybeig64atqaladigoc3ds4arltdu63wkdrk3gesjfvnfdmz35amv7faq rpc: http://localhost:8545 # User provided agent_id: 14 From 50b07e1370b4bc9d116dc6aae3118577a895a5ce Mon Sep 17 00:00:00 2001 From: Atatakai Date: Mon, 12 Aug 2024 19:50:23 +0400 Subject: [PATCH 043/134] chore: hide low gas alert if is not initial funded --- frontend/components/Main/MainGasBalance.tsx | 4 ++++ frontend/components/Main/MainOlasBalance.tsx | 2 ++ 2 files changed, 6 insertions(+) diff --git a/frontend/components/Main/MainGasBalance.tsx b/frontend/components/Main/MainGasBalance.tsx index f9eb5de6a..0d1f83f26 100644 --- a/frontend/components/Main/MainGasBalance.tsx +++ b/frontend/components/Main/MainGasBalance.tsx @@ -7,6 +7,7 @@ import { COLOR } from '@/constants/colors'; import { LOW_BALANCE } from '@/constants/thresholds'; import { useBalance } from '@/hooks/useBalance'; import { useElectronApi } from '@/hooks/useElectronApi'; +import { useStore } from '@/hooks/useStore'; import { useWallet } from '@/hooks/useWallet'; import { CardSection } from '../styled/CardSection'; @@ -34,6 +35,7 @@ const FineDot = styled(Dot)` const BalanceStatus = () => { const { isBalanceLoaded, safeBalance } = useBalance(); + const { storeState } = useStore(); const { showNotification } = useElectronApi(); const [isLowBalanceNotificationShown, setIsLowBalanceNotificationShown] = @@ -44,6 +46,7 @@ const BalanceStatus = () => { if (!isBalanceLoaded) return; if (!safeBalance) return; if (!showNotification) return; + if (!storeState?.isInitialFunded) return; if (safeBalance.ETH < LOW_BALANCE && !isLowBalanceNotificationShown) { showNotification('Trading balance is too low.'); @@ -60,6 +63,7 @@ const BalanceStatus = () => { isLowBalanceNotificationShown, safeBalance, showNotification, + storeState?.isInitialFunded, ]); const status = useMemo(() => { diff --git a/frontend/components/Main/MainOlasBalance.tsx b/frontend/components/Main/MainOlasBalance.tsx index 28e0170a4..fa6d87b9b 100644 --- a/frontend/components/Main/MainOlasBalance.tsx +++ b/frontend/components/Main/MainOlasBalance.tsx @@ -123,9 +123,11 @@ const MainOlasBalanceAlert = styled.div` const LowTradingBalanceAlert = () => { const { isBalanceLoaded, safeBalance } = useBalance(); + const { storeState } = useStore(); if (!isBalanceLoaded) return null; if (!safeBalance) return null; + if (!storeState?.isInitialFunded) return; if (safeBalance.ETH >= LOW_BALANCE) return null; return ( From ca92d60b2190e39800094b37a8c6e30829fc2170 Mon Sep 17 00:00:00 2001 From: truemiller Date: Mon, 12 Aug 2024 21:46:51 +0100 Subject: [PATCH 044/134] feat: Add IncentiveProgramStatus enum and update PageState enum --- frontend/components/Alert/AlertTitle.tsx | 5 + .../IncentiveProgramBadge.tsx | 18 +++ .../IncentiveProgramSection/index.tsx | 131 ++++++++++++++++++ .../Incentives/WhatAreIncentivePrograms.tsx | 15 ++ frontend/components/Incentives/index.tsx | 62 +++++++++ frontend/components/Main/MainNeedsFunds.tsx | 3 +- .../components/Main/NewIncentiveAlert.tsx | 35 +++++ frontend/enums/IcentiveProgram.ts | 5 + frontend/enums/PageState.ts | 1 + frontend/types/IncentiveProgram.ts | 11 ++ 10 files changed, 285 insertions(+), 1 deletion(-) create mode 100644 frontend/components/Alert/AlertTitle.tsx create mode 100644 frontend/components/Incentives/IncentiveProgramSection/IncentiveProgramBadge.tsx create mode 100644 frontend/components/Incentives/IncentiveProgramSection/index.tsx create mode 100644 frontend/components/Incentives/WhatAreIncentivePrograms.tsx create mode 100644 frontend/components/Incentives/index.tsx create mode 100644 frontend/components/Main/NewIncentiveAlert.tsx create mode 100644 frontend/enums/IcentiveProgram.ts create mode 100644 frontend/types/IncentiveProgram.ts diff --git a/frontend/components/Alert/AlertTitle.tsx b/frontend/components/Alert/AlertTitle.tsx new file mode 100644 index 000000000..5afecb32f --- /dev/null +++ b/frontend/components/Alert/AlertTitle.tsx @@ -0,0 +1,5 @@ +import { Typography } from 'antd'; + +export const AlertTitle = ({ children }: { children: React.ReactNode }) => ( + {children} +); diff --git a/frontend/components/Incentives/IncentiveProgramSection/IncentiveProgramBadge.tsx b/frontend/components/Incentives/IncentiveProgramSection/IncentiveProgramBadge.tsx new file mode 100644 index 000000000..c30882a18 --- /dev/null +++ b/frontend/components/Incentives/IncentiveProgramSection/IncentiveProgramBadge.tsx @@ -0,0 +1,18 @@ +import { Tag } from 'antd'; + +import { IncentiveProgramStatus } from '@/enums/IcentiveProgram'; + +export const IncentiveProgramTag = ({ + programStatus, +}: { + programStatus: IncentiveProgramStatus; +}) => { + if (programStatus === IncentiveProgramStatus.New) { + return New; + } else if (programStatus === IncentiveProgramStatus.Selected) { + return Selected; + } else if (programStatus === IncentiveProgramStatus.Deprecated) { + return Deprecated; + } + return null; +}; diff --git a/frontend/components/Incentives/IncentiveProgramSection/index.tsx b/frontend/components/Incentives/IncentiveProgramSection/index.tsx new file mode 100644 index 000000000..c11fcd452 --- /dev/null +++ b/frontend/components/Incentives/IncentiveProgramSection/index.tsx @@ -0,0 +1,131 @@ +import { Button, Flex, Typography } from 'antd'; + +import { Alert } from '@/components/Alert'; +import { AlertTitle } from '@/components/Alert/AlertTitle'; +import { CardSection } from '@/components/styled/CardSection'; +import { UNICODE_SYMBOLS } from '@/constants/symbols'; +import { IncentiveProgramStatus } from '@/enums/IcentiveProgram'; +import { useBalance } from '@/hooks/useBalance'; +import { Address } from '@/types/Address'; +import { IncentiveProgram } from '@/types/IncentiveProgram'; + +import { IncentiveProgramTag } from './IncentiveProgramBadge'; + +const ProgramTitle = ({ + name, + status, +}: { + name: string; + status: IncentiveProgramStatus; +}) => ( + + {name} + + +); + +const ProgramDetailsLink = ({ address }: { address: Address }) => { + const blockExplorerLink = `https://blockExplorer.com/poa/xdai/address/${address}`; + return ( + + Contract details {UNICODE_SYMBOLS.EXTERNAL_LINK} + + ); +}; + +const HorizontalGreyLine = () => ( + +); + +export const IncentiveProgramSection = ({ + program, +}: { + program: IncentiveProgram; +}) => { + const { totalOlasBalance, totalEthBalance } = useBalance(); + return ( + + {/* Title */} + + + + + {/* Rewards per work period */} + + Rewards per work period + + {`0.25 OLAS`} + + {/* Required Olas */} + + Required OLAS for staking + + {`0.25 OLAS`} + + {/* Funding alert */} + + Insufficient amount of funds to switch + + Add funds to your account to meet the program requirements. + + + Your current OLAS balance: {totalOlasBalance} OLAS + + + Your current trading balance: {totalEthBalance} XDAI + +
+ } + /> + {/* No jobs available alert */} + + + No jobs currently available – try again later. + + + } + /> + {/* App update required */} + + App update required + + This incentive program is available for users who have the app + version rc105 or higher. + + Current app version: rc97 + {/* TODO: trigger update through IPC */} + + Update Pearl to the latest version {UNICODE_SYMBOLS.EXTERNAL_LINK} + + + } + /> + {/* Switch to program button */} + + + ); +}; diff --git a/frontend/components/Incentives/WhatAreIncentivePrograms.tsx b/frontend/components/Incentives/WhatAreIncentivePrograms.tsx new file mode 100644 index 000000000..3fd179058 --- /dev/null +++ b/frontend/components/Incentives/WhatAreIncentivePrograms.tsx @@ -0,0 +1,15 @@ +import { RightOutlined } from '@ant-design/icons'; +import { Flex, Typography } from 'antd'; + +import { CardSection } from '../styled/CardSection'; + +export const WhatAreIncentiveProgramsSection = () => { + return ( + + + + What are incentive programs? + + + ); +}; diff --git a/frontend/components/Incentives/index.tsx b/frontend/components/Incentives/index.tsx new file mode 100644 index 000000000..11d998bcf --- /dev/null +++ b/frontend/components/Incentives/index.tsx @@ -0,0 +1,62 @@ +import { CloseOutlined, SettingOutlined } from '@ant-design/icons'; +import { Button, Card, Flex } from 'antd'; + +import { PageState } from '@/enums/PageState'; +import { usePageState } from '@/hooks/usePageState'; +import { IncentiveProgram } from '@/types/IncentiveProgram'; + +import { CardTitle } from '../Card/CardTitle'; +import { IncentiveProgramSection } from './IncentiveProgramSection'; +import { WhatAreIncentiveProgramsSection } from './WhatAreIncentivePrograms'; + +const IncentivesTitle = () => { + return ( + + + Settings + + } + /> + ); +}; + +const mockIncentivePrograms: IncentiveProgram[] = [ + { + name: 'Incentive Program 1', + rewardsPerWorkPeriod: 100, + requiredOlasForStaking: 1000, + contractAddress: '0x1234567890', + }, + { + name: 'Incentive Program 2', + rewardsPerWorkPeriod: 200, + requiredOlasForStaking: 2000, + contractAddress: '0x0987654321', + }, +]; + +export const Incentives = () => { + const { goto } = usePageState(); + return ( + } + extra={ + + + } + /> + + ); +}; diff --git a/frontend/enums/IcentiveProgram.ts b/frontend/enums/IcentiveProgram.ts new file mode 100644 index 000000000..f0351765a --- /dev/null +++ b/frontend/enums/IcentiveProgram.ts @@ -0,0 +1,5 @@ +export enum IncentiveProgramStatus { + New = 'new', + Selected = 'current', + Deprecated = 'deprecated', +} diff --git a/frontend/enums/PageState.ts b/frontend/enums/PageState.ts index 7a670f683..5a35793f0 100644 --- a/frontend/enums/PageState.ts +++ b/frontend/enums/PageState.ts @@ -5,4 +5,5 @@ export enum PageState { HelpAndSupport, Receive, Send, + MainIncentiveProgram, } diff --git a/frontend/types/IncentiveProgram.ts b/frontend/types/IncentiveProgram.ts new file mode 100644 index 000000000..4c04a97fe --- /dev/null +++ b/frontend/types/IncentiveProgram.ts @@ -0,0 +1,11 @@ +import { IncentiveProgramStatus } from '@/enums/IcentiveProgram'; + +import { Address } from './Address'; + +export type IncentiveProgram = { + name: string; + rewardsPerWorkPeriod: number; + requiredOlasForStaking: number; + status: IncentiveProgramStatus; + contractAddress: Address; +}; From c4884ab2e578b5e92933fbca058a1c98b6d769c7 Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Tue, 13 Aug 2024 10:14:59 +0200 Subject: [PATCH 045/134] chore: update --- .../data/contracts/staking_token/__init__.py | 20 ++ .../data/contracts/staking_token/contract.py | 192 ++++++++++++++++++ .../contracts/staking_token/contract.yaml | 23 +++ operate/ledger/profiles.py | 17 +- operate/services/manage.py | 142 ++++++++----- operate/services/protocol.py | 60 +++++- operate/services/service.py | 2 +- operate/types.py | 4 +- 8 files changed, 396 insertions(+), 64 deletions(-) create mode 100644 operate/data/contracts/staking_token/__init__.py create mode 100644 operate/data/contracts/staking_token/contract.py create mode 100644 operate/data/contracts/staking_token/contract.yaml diff --git a/operate/data/contracts/staking_token/__init__.py b/operate/data/contracts/staking_token/__init__.py new file mode 100644 index 000000000..4682f8155 --- /dev/null +++ b/operate/data/contracts/staking_token/__init__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + +"""This module contains the support resources for the staking contract.""" diff --git a/operate/data/contracts/staking_token/contract.py b/operate/data/contracts/staking_token/contract.py new file mode 100644 index 000000000..384beea7a --- /dev/null +++ b/operate/data/contracts/staking_token/contract.py @@ -0,0 +1,192 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2023-2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + +"""This module contains the class to connect to the `ServiceStakingTokenMechUsage` contract.""" + +from enum import Enum + +from aea.common import JSONLike +from aea.configurations.base import PublicId +from aea.contracts.base import Contract +from aea.crypto.base import LedgerApi + + +class StakingTokenContract(Contract): + """The Service Staking contract.""" + + contract_id = PublicId.from_str("valory/staking_token:0.1.0") + + @classmethod + def get_service_staking_state( + cls, + ledger_api: LedgerApi, + contract_address: str, + service_id: int, + ) -> JSONLike: + """Check whether the service is staked.""" + contract_instance = cls.get_instance(ledger_api, contract_address) + res = contract_instance.functions.getStakingState(service_id).call() + return dict(data=res) + + @classmethod + def build_stake_tx( + cls, + ledger_api: LedgerApi, + contract_address: str, + service_id: int, + ) -> JSONLike: + """Build stake tx.""" + contract_instance = cls.get_instance(ledger_api, contract_address) + data = contract_instance.encodeABI("stake", args=[service_id]) + return dict(data=bytes.fromhex(data[2:])) + + @classmethod + def build_checkpoint_tx( + cls, + ledger_api: LedgerApi, + contract_address: str, + ) -> JSONLike: + """Build checkpoint tx.""" + contract_instance = cls.get_instance(ledger_api, contract_address) + data = contract_instance.encodeABI("checkpoint") + return dict(data=bytes.fromhex(data[2:])) + + @classmethod + def build_unstake_tx( + cls, + ledger_api: LedgerApi, + contract_address: str, + service_id: int, + ) -> JSONLike: + """Build unstake tx.""" + contract_instance = cls.get_instance(ledger_api, contract_address) + data = contract_instance.encodeABI("unstake", args=[service_id]) + return dict(data=bytes.fromhex(data[2:])) + + @classmethod + def available_rewards( + cls, + ledger_api: LedgerApi, + contract_address: str, + ) -> JSONLike: + """Get the available rewards.""" + contract_instance = cls.get_instance(ledger_api, contract_address) + res = contract_instance.functions.availableRewards().call() + return dict(data=res) + + @classmethod + def get_staking_rewards( + cls, + ledger_api: LedgerApi, + contract_address: str, + service_id: int, + ) -> JSONLike: + """Get the service's staking rewards.""" + contract = cls.get_instance(ledger_api, contract_address) + reward = contract.functions.calculateStakingReward(service_id).call() + return dict(data=reward) + + @classmethod + def get_next_checkpoint_ts( + cls, + ledger_api: LedgerApi, + contract_address: str, + ) -> JSONLike: + """Get the next checkpoint's timestamp.""" + contract = cls.get_instance(ledger_api, contract_address) + ts = contract.functions.getNextRewardCheckpointTimestamp().call() + return dict(data=ts) + + @classmethod + def ts_checkpoint( + cls, + ledger_api: LedgerApi, + contract_address: str, + ) -> JSONLike: + """Retrieve the checkpoint's timestamp.""" + contract = cls.get_instance(ledger_api, contract_address) + ts_checkpoint = contract.functions.tsCheckpoint().call() + return dict(data=ts_checkpoint) + + @classmethod + def liveness_ratio( + cls, + ledger_api: LedgerApi, + contract_address: str, + ) -> JSONLike: + """Retrieve the liveness ratio.""" + contract = cls.get_instance(ledger_api, contract_address) + liveness_ratio = contract.functions.livenessRatio().call() + return dict(data=liveness_ratio) + + @classmethod + def get_liveness_period( + cls, + ledger_api: LedgerApi, + contract_address: str, + ) -> JSONLike: + """Retrieve the liveness period.""" + contract = cls.get_instance(ledger_api, contract_address) + liveness_period = contract.functions.livenessPeriod().call() + return dict(data=liveness_period) + + @classmethod + def get_service_info( + cls, + ledger_api: LedgerApi, + contract_address: str, + service_id: int, + ) -> JSONLike: + """Retrieve the service info for a service.""" + contract = cls.get_instance(ledger_api, contract_address) + info = contract.functions.getServiceInfo(service_id).call() + return dict(data=info) + + @classmethod + def max_num_services( + cls, + ledger_api: LedgerApi, + contract_address: str, + ) -> JSONLike: + """Retrieve the max number of services.""" + contract = cls.get_instance(ledger_api, contract_address) + max_num_services = contract.functions.maxNumServices().call() + return dict(data=max_num_services) + + @classmethod + def get_service_ids( + cls, + ledger_api: LedgerApi, + contract_address: str, + ) -> JSONLike: + """Retrieve the service IDs.""" + contract = cls.get_instance(ledger_api, contract_address) + service_ids = contract.functions.getServiceIds().call() + return dict(data=service_ids) + + @classmethod + def get_min_staking_duration( + cls, + ledger_api: LedgerApi, + contract_address: str, + ) -> JSONLike: + """Retrieve the service IDs.""" + contract = cls.get_instance(ledger_api, contract_address) + duration = contract.functions.minStakingDuration().call() + return dict(data=duration) diff --git a/operate/data/contracts/staking_token/contract.yaml b/operate/data/contracts/staking_token/contract.yaml new file mode 100644 index 000000000..2fce9ed86 --- /dev/null +++ b/operate/data/contracts/staking_token/contract.yaml @@ -0,0 +1,23 @@ +name: staking_token +author: valory +version: 0.1.0 +type: contract +description: Service staking token contract +license: Apache-2.0 +aea_version: '>=1.0.0, <2.0.0' +fingerprint: + __init__.py: bafybeicmgkagyhgwn2ktcdjbprijalbdyj26cvza4d3b7uvmehvy4mmr3i + build/StakingToken.json: bafybeid5vwardpaeeggfbp4o2ea7wdhywaeamhvyolxmhv6v2ynil4st6q + contract.py: bafybeigzb6oxpyi7eiohftxuha5t3tcvj2bekihc77ts3dwzqpfl34ev6y +fingerprint_ignore_patterns: [] +contracts: [] +class_name: StakingTokenContract +contract_interface_paths: + ethereum: build/StakingToken.json +dependencies: + open-aea-ledger-ethereum: + version: ==1.52.0 + open-aea-test-autonomy: + version: ==0.14.12 + web3: + version: <7,>=6.0.0 diff --git a/operate/ledger/profiles.py b/operate/ledger/profiles.py index 94a15512f..0c668a445 100644 --- a/operate/ledger/profiles.py +++ b/operate/ledger/profiles.py @@ -36,7 +36,22 @@ } STAKING = { - ChainType.GNOSIS: "0xEE9F19b5DF06c7E8Bfc7B28745dcf944C504198A", + ChainType.GNOSIS: { + "pearl_alpha": "0xEE9F19b5DF06c7E8Bfc7B28745dcf944C504198A", + "pearl_beta": "0xef44fb0842ddef59d37f85d61a1ef492bba6135d" + } + + # ChainType.GNOSIS: { + # "pearl_alpha": { + # "stakingTokenAddress": "0x9Ec97Be9FF55ff11606ce7c589956f7Bf3D0b241", + # "stakingTokenInstanceAddress": "0xEE9F19b5DF06c7E8Bfc7B28745dcf944C504198A" + # }, + # "pearl_beta": { + # "stakingTokenAddress": "0xEa00be6690a871827fAfD705440D20dd75e67AB1", + # "stakingTokenInstanceAddress": "0xef44fb0842ddef59d37f85d61a1ef492bba6135d" + # } + # } + } OLAS = { diff --git a/operate/services/manage.py b/operate/services/manage.py index 92aeec51b..d93e86687 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -21,6 +21,7 @@ import asyncio import logging +import os import shutil import traceback import typing as t @@ -48,7 +49,10 @@ OnChainUserParams, Service, ) -from operate.types import ServiceTemplate +from operate.types import ( + ServiceTemplate, + LedgerConfig +) from operate.wallet.master import MasterWalletManager @@ -121,12 +125,12 @@ def get_on_chain_manager(self, service: Service) -> OnChainManager: contracts=CONTRACTS[service.ledger_config.chain], ) - def get_eth_safe_tx_builder(self, service: Service) -> EthSafeTxBuilder: + def get_eth_safe_tx_builder(self, ledger_config: LedgerConfig) -> EthSafeTxBuilder: """Get EthSafeTxBuilder instance.""" return EthSafeTxBuilder( - rpc=service.ledger_config.rpc, - wallet=self.wallet_manager.load(service.ledger_config.type), - contracts=CONTRACTS[service.ledger_config.chain], + rpc=ledger_config.rpc, + wallet=self.wallet_manager.load(ledger_config.type), + contracts=CONTRACTS[ledger_config.chain], ) def load_or_create( @@ -168,26 +172,32 @@ def load_or_create( return service - def _get_on_chain_state(self, service: Service) -> OnChainState: - if service.chain_data.token == NON_EXISTENT_TOKEN: + def _get_on_chain_state(self, chain_config: ChainConfig) -> OnChainState: + chain_data = chain_config.chain_data + ledger_config = chain_config.ledger_config + if chain_data.token == NON_EXISTENT_TOKEN: service_state = OnChainState.NON_EXISTENT - service.chain_data.on_chain_state = service_state - service.store() + chain_data.on_chain_state = service_state + # TODO save service state + # service.store() return service_state - sftxb = self.get_eth_safe_tx_builder(service=service) - info = sftxb.info(token_id=service.chain_data.token) + sftxb = self.get_eth_safe_tx_builder(ledger_config=ledger_config) + info = sftxb.info(token_id=chain_data.token) service_state = OnChainState(info["service_state"]) - service.chain_data.on_chain_state = service_state - service.store() + chain_data.on_chain_state = service_state + # TODO save service state + # service.store() return service_state - def _get_on_chain_hash(self, service: Service) -> t.Optional[str]: - if service.chain_data.token == NON_EXISTENT_TOKEN: + def _get_on_chain_hash(self, chain_config: ChainConfig) -> t.Optional[str]: + chain_data = chain_config.chain_data + ledger_config = chain_config.ledger_config + if chain_data.token == NON_EXISTENT_TOKEN: return None - sftxb = self.get_eth_safe_tx_builder(service=service) - info = sftxb.info(token_id=service.chain_data.token) + sftxb = self.get_eth_safe_tx_builder(ledger_config=ledger_config) + info = sftxb.info(token_id=chain_data.token) config_hash = info["config_hash"] res = requests.get(f"{IPFS_GATEWAY}f01701220{config_hash}", timeout=30) if res.status_code == 200: @@ -385,7 +395,10 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to keys = service.keys instances = [key.address for key in keys] wallet = self.wallet_manager.load(ledger_config.type) - sftxb = self.get_eth_safe_tx_builder(service=service) + sftxb = self.get_eth_safe_tx_builder(ledger_config=ledger_config) + + # TODO fixme + os.environ["CUSTOM_CHAIN_RPC"] = ledger_config.rpc if user_params.use_staking and not sftxb.staking_slots_available( staking_contract=STAKING[ledger_config.chain] @@ -399,7 +412,7 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to chain_data.instances = info["instances"] chain_data.multisig = info["multisig"] service.store() - self.logger.info(f"Service state: {service.chain_data.on_chain_state.name}") + self.logger.info(f"Service state: {chain_data.on_chain_state.name}") if user_params.use_staking: self.logger.info("Checking staking compatibility") @@ -429,8 +442,8 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to f"address: {wallet.safe}; required olas: {required_olas}; your balance: {balance}" ) - on_chain_hash = self._get_on_chain_hash(service) - is_first_mint = self._get_on_chain_state(service) == OnChainState.NON_EXISTENT + on_chain_hash = self._get_on_chain_hash(chain_config=chain_config) + is_first_mint = self._get_on_chain_state(chain_config=chain_config) == OnChainState.NON_EXISTENT is_update = ( (not is_first_mint) and (on_chain_hash is not None) @@ -451,7 +464,13 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to # else: # self.logger.info("Updating the on-chain service") - if self._get_on_chain_state(service) == OnChainState.NON_EXISTENT: + if is_update: + self.terminate_service_on_chain_from_safe( + hash=hash, + chain_id=chain_id + ) + + if self._get_on_chain_state(chain_config=chain_config) == OnChainState.NON_EXISTENT: receipt = ( sftxb.new_tx() .add( @@ -489,9 +508,7 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to chain_data.on_chain_state = OnChainState.PRE_REGISTRATION service.store() - - print("!!!!!!!!!!!!!!!!!!!!!") - if self._get_on_chain_state(service) == OnChainState.PRE_REGISTRATION: + if self._get_on_chain_state(chain_config=chain_config) == OnChainState.PRE_REGISTRATION: cost_of_bond = user_params.cost_of_bond if user_params.use_staking: token_utility = "0xa45E64d13A30a51b91ae0eb182e88a40e9b18eD8" # nosec @@ -503,7 +520,7 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to registry_contracts.service_registry_token_utility.get_agent_bond( ledger_api=sftxb.ledger_api, contract_address=token_utility, - service_id=service.chain_data.token, + service_id=chain_data.token, agent_id=user_params.agent_id, ).get("bond") ) @@ -533,14 +550,14 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to self.logger.info("Activating service") sftxb.new_tx().add( sftxb.get_activate_data( - service_id=service.chain_data.token, + service_id=chain_data.token, cost_of_bond=cost_of_bond, ) ).settle() - service.chain_data.on_chain_state = OnChainState.ACTIVE_REGISTRATION + chain_data.on_chain_state = OnChainState.ACTIVE_REGISTRATION service.store() - if self._get_on_chain_state(service) == OnChainState.ACTIVE_REGISTRATION: + if self._get_on_chain_state(chain_config=chain_config) == OnChainState.ACTIVE_REGISTRATION: cost_of_bond = user_params.cost_of_bond if user_params.use_staking: token_utility = "0xa45E64d13A30a51b91ae0eb182e88a40e9b18eD8" # nosec @@ -580,40 +597,36 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to cost_of_bond = 1 self.logger.info( - f"Registering service: {service.chain_data.token} -> {instances}" + f"Registering service: {chain_data.token} -> {instances}" ) sftxb.new_tx().add( sftxb.get_register_instances_data( - service_id=service.chain_data.token, + service_id=chain_data.token, instances=instances, agents=[user_params.agent_id for _ in instances], cost_of_bond=cost_of_bond, ) ).settle() - service.chain_data.on_chain_state = OnChainState.FINISHED_REGISTRATION + chain_data.on_chain_state = OnChainState.FINISHED_REGISTRATION service.store() - if self._get_on_chain_state(service) == OnChainState.FINISHED_REGISTRATION: + if self._get_on_chain_state(chain_config=chain_config) == OnChainState.FINISHED_REGISTRATION: self.logger.info("Deploying service") sftxb.new_tx().add( sftxb.get_deploy_data( - service_id=service.chain_data.token, + service_id=chain_data.token, reuse_multisig=is_update, ) ).settle() - service.chain_data.on_chain_state = OnChainState.DEPLOYED + chain_data.on_chain_state = OnChainState.DEPLOYED service.store() # Update local Service - info = sftxb.info(token_id=service.chain_data.token) - service.chain_data = OnChainData( - token=service.chain_data.token, - instances=info["instances"], - multisig=info["multisig"], - staked=False, - on_chain_state=OnChainState(info["service_state"]), - user_params=service.chain_data.user_params, - ) + info = sftxb.info(token_id=chain_data.token) + chain_data.instances = info["instances"] + chain_data.multisig = info["multisig"] + chain_data.staked = False + chain_data.on_chain_state = OnChainState(info["service_state"]) service.store() def terminate_service_on_chain(self, hash: str) -> None: @@ -643,21 +656,48 @@ def terminate_service_on_chain(self, hash: str) -> None: service.chain_data.on_chain_state = OnChainState.TERMINATED_BONDED service.store() - def terminate_service_on_chain_from_safe(self, hash: str) -> None: + def terminate_service_on_chain_from_safe(self, hash: str, chain_id: int) -> None: """ Terminate service on-chain :param hash: Service hash """ - + self.logger.info("terminate_service_on_chain_from_safe") service = self.load_or_create(hash=hash) - sftxb = self.get_eth_safe_tx_builder(service=service) - info = sftxb.info(token_id=service.chain_data.token) - service.chain_data.on_chain_state = OnChainState(info["service_state"]) + chain_config = service.chain_configs[chain_id] + ledger_config = chain_config.ledger_config + chain_data = chain_config.chain_data + user_params = chain_config.chain_data.user_params + keys = service.keys + instances = [key.address for key in keys] + wallet = self.wallet_manager.load(ledger_config.type) + + # TODO fixme + os.environ["CUSTOM_CHAIN_RPC"] = ledger_config.rpc + + sftxb = self.get_eth_safe_tx_builder(ledger_config=ledger_config) + info = sftxb.info(token_id=chain_data.token) + chain_data.on_chain_state = OnChainState(info["service_state"]) + + + from icecream import ic + ic(info) + + + for staking_program in STAKING[ledger_config.chain]: + state = sftxb.staking_status( + service_id=chain_data.token, + staking_contract=STAKING[ledger_config.chain][staking_program], + ) + + print(state) + + import sys + sys.exit(1) if ( - service.chain_data.user_params.use_staking - and not self._can_unstake_service(hash=hash) + chain_data.user_params.use_staking + and not self._can_unstake_service_from_safe(hash=hash) ): return diff --git a/operate/services/protocol.py b/operate/services/protocol.py index b79522533..ea7bcda35 100644 --- a/operate/services/protocol.py +++ b/operate/services/protocol.py @@ -63,6 +63,9 @@ from operate.data.contracts.service_staking_token.contract import ( ServiceStakingTokenContract, ) +from operate.data.contracts.staking_token.contract import ( + StakingTokenContract, +) from operate.types import ContractAddresses from operate.utils.gnosis import ( MultiSendOperation, @@ -200,17 +203,48 @@ def __init__( directory=str(DATA_DIR / "contracts" / "service_staking_token") ), ) + self.staking_token_ctr = t.cast( + StakingTokenContract, + StakingTokenContract.from_dir( + directory=str(DATA_DIR / "contracts" / "staking_token") + ), + ) def status(self, service_id: int, staking_contract: str) -> StakingState: """Is the service staked?""" - return StakingState( - self.staking_ctr.get_instance( - ledger_api=self.ledger_api, - contract_address=staking_contract, + staking_state = None + + print(staking_contract) + try: + print("a") + staking_state = StakingState( + self.staking_ctr.get_instance( + ledger_api=self.ledger_api, + contract_address=staking_contract, + ) + .functions.getStakingState(service_id) + .call() ) - .functions.getStakingState(service_id) - .call() - ) + print("b") + return staking_state + except Exception: + print("c") + + try: + staking_state = StakingState( + self.staking_token_ctr.get_instance( + ledger_api=self.ledger_api, + contract_address=staking_contract, + ) + .functions.getStakingState(service_id) + .call() + ) + return staking_state + except Exception: + print("EXCEPTION") + print("d") + + return staking_state def slots_available(self, staking_contract: str) -> bool: """Check if there are available slots on the staking contract""" @@ -484,6 +518,14 @@ def ledger_api(self) -> LedgerApi: ) return ledger_api + def owner_of(self, token_id: int) -> str: + """Get owner of a service.""" + self._patch() + ledger_api, _ = OnChainHelper.get_ledger_and_crypto_objects( + chain_type=self.chain_type + ) + + def info(self, token_id: int) -> t.Dict: """Get service info.""" self._patch() @@ -498,7 +540,7 @@ def info(self, token_id: int) -> t.Dict: max_agents, number_of_agent_instances, service_state, - cannonical_agents, + canonical_agents, ) = get_service_info( ledger_api=ledger_api, chain_type=self.chain_type, @@ -517,7 +559,7 @@ def info(self, token_id: int) -> t.Dict: max_agents=max_agents, number_of_agent_instances=number_of_agent_instances, service_state=service_state, - cannonical_agents=cannonical_agents, + canonical_agents=canonical_agents, instances=instances, ) diff --git a/operate/services/service.py b/operate/services/service.py index 3c36e4050..e2d00dbdb 100644 --- a/operate/services/service.py +++ b/operate/services/service.py @@ -251,7 +251,7 @@ def ledger_configs(self) -> "LedgerConfigs": (_, config), *_ = override["config"]["ledger_apis"].items() # TODO chain name is inferred from the chain_id. The actual id provided on service.yaml is ignored. chain = ChainType.from_id(cid=config["chain_id"]) - ledger_configs[config["chain_id"]] = LedgerConfig( + ledger_configs[str(config["chain_id"])] = LedgerConfig( rpc=config["address"], chain=chain, type=LedgerType.ETHEREUM, diff --git a/operate/types.py b/operate/types.py index a622d57c0..0455cedc0 100644 --- a/operate/types.py +++ b/operate/types.py @@ -193,7 +193,7 @@ class ConfigurationTemplate(TypedDict): fund_requirements: FundRequirementsTemplate -ConfigurationTemplates = t.Dict[int, ConfigurationTemplate] +ConfigurationTemplates = t.Dict[str, ConfigurationTemplate] class ServiceTemplate(TypedDict): @@ -204,7 +204,7 @@ class ServiceTemplate(TypedDict): image: str description: str service_version: str - home_chain_id: int + home_chain_id: str configurations: ConfigurationTemplates From f78a34358001cb7d40841f588a34d65617bb12ea Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Tue, 13 Aug 2024 13:19:49 +0200 Subject: [PATCH 046/134] chore: update --- .../data/contracts/staking_token/__init__.py | 20 -- .../data/contracts/staking_token/contract.py | 192 ------------------ .../contracts/staking_token/contract.yaml | 23 --- operate/services/manage.py | 14 +- operate/services/protocol.py | 54 ++--- 5 files changed, 26 insertions(+), 277 deletions(-) delete mode 100644 operate/data/contracts/staking_token/__init__.py delete mode 100644 operate/data/contracts/staking_token/contract.py delete mode 100644 operate/data/contracts/staking_token/contract.yaml diff --git a/operate/data/contracts/staking_token/__init__.py b/operate/data/contracts/staking_token/__init__.py deleted file mode 100644 index 4682f8155..000000000 --- a/operate/data/contracts/staking_token/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# ------------------------------------------------------------------------------ -# -# Copyright 2024 Valory AG -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# ------------------------------------------------------------------------------ - -"""This module contains the support resources for the staking contract.""" diff --git a/operate/data/contracts/staking_token/contract.py b/operate/data/contracts/staking_token/contract.py deleted file mode 100644 index 384beea7a..000000000 --- a/operate/data/contracts/staking_token/contract.py +++ /dev/null @@ -1,192 +0,0 @@ -# -*- coding: utf-8 -*- -# ------------------------------------------------------------------------------ -# -# Copyright 2023-2024 Valory AG -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# ------------------------------------------------------------------------------ - -"""This module contains the class to connect to the `ServiceStakingTokenMechUsage` contract.""" - -from enum import Enum - -from aea.common import JSONLike -from aea.configurations.base import PublicId -from aea.contracts.base import Contract -from aea.crypto.base import LedgerApi - - -class StakingTokenContract(Contract): - """The Service Staking contract.""" - - contract_id = PublicId.from_str("valory/staking_token:0.1.0") - - @classmethod - def get_service_staking_state( - cls, - ledger_api: LedgerApi, - contract_address: str, - service_id: int, - ) -> JSONLike: - """Check whether the service is staked.""" - contract_instance = cls.get_instance(ledger_api, contract_address) - res = contract_instance.functions.getStakingState(service_id).call() - return dict(data=res) - - @classmethod - def build_stake_tx( - cls, - ledger_api: LedgerApi, - contract_address: str, - service_id: int, - ) -> JSONLike: - """Build stake tx.""" - contract_instance = cls.get_instance(ledger_api, contract_address) - data = contract_instance.encodeABI("stake", args=[service_id]) - return dict(data=bytes.fromhex(data[2:])) - - @classmethod - def build_checkpoint_tx( - cls, - ledger_api: LedgerApi, - contract_address: str, - ) -> JSONLike: - """Build checkpoint tx.""" - contract_instance = cls.get_instance(ledger_api, contract_address) - data = contract_instance.encodeABI("checkpoint") - return dict(data=bytes.fromhex(data[2:])) - - @classmethod - def build_unstake_tx( - cls, - ledger_api: LedgerApi, - contract_address: str, - service_id: int, - ) -> JSONLike: - """Build unstake tx.""" - contract_instance = cls.get_instance(ledger_api, contract_address) - data = contract_instance.encodeABI("unstake", args=[service_id]) - return dict(data=bytes.fromhex(data[2:])) - - @classmethod - def available_rewards( - cls, - ledger_api: LedgerApi, - contract_address: str, - ) -> JSONLike: - """Get the available rewards.""" - contract_instance = cls.get_instance(ledger_api, contract_address) - res = contract_instance.functions.availableRewards().call() - return dict(data=res) - - @classmethod - def get_staking_rewards( - cls, - ledger_api: LedgerApi, - contract_address: str, - service_id: int, - ) -> JSONLike: - """Get the service's staking rewards.""" - contract = cls.get_instance(ledger_api, contract_address) - reward = contract.functions.calculateStakingReward(service_id).call() - return dict(data=reward) - - @classmethod - def get_next_checkpoint_ts( - cls, - ledger_api: LedgerApi, - contract_address: str, - ) -> JSONLike: - """Get the next checkpoint's timestamp.""" - contract = cls.get_instance(ledger_api, contract_address) - ts = contract.functions.getNextRewardCheckpointTimestamp().call() - return dict(data=ts) - - @classmethod - def ts_checkpoint( - cls, - ledger_api: LedgerApi, - contract_address: str, - ) -> JSONLike: - """Retrieve the checkpoint's timestamp.""" - contract = cls.get_instance(ledger_api, contract_address) - ts_checkpoint = contract.functions.tsCheckpoint().call() - return dict(data=ts_checkpoint) - - @classmethod - def liveness_ratio( - cls, - ledger_api: LedgerApi, - contract_address: str, - ) -> JSONLike: - """Retrieve the liveness ratio.""" - contract = cls.get_instance(ledger_api, contract_address) - liveness_ratio = contract.functions.livenessRatio().call() - return dict(data=liveness_ratio) - - @classmethod - def get_liveness_period( - cls, - ledger_api: LedgerApi, - contract_address: str, - ) -> JSONLike: - """Retrieve the liveness period.""" - contract = cls.get_instance(ledger_api, contract_address) - liveness_period = contract.functions.livenessPeriod().call() - return dict(data=liveness_period) - - @classmethod - def get_service_info( - cls, - ledger_api: LedgerApi, - contract_address: str, - service_id: int, - ) -> JSONLike: - """Retrieve the service info for a service.""" - contract = cls.get_instance(ledger_api, contract_address) - info = contract.functions.getServiceInfo(service_id).call() - return dict(data=info) - - @classmethod - def max_num_services( - cls, - ledger_api: LedgerApi, - contract_address: str, - ) -> JSONLike: - """Retrieve the max number of services.""" - contract = cls.get_instance(ledger_api, contract_address) - max_num_services = contract.functions.maxNumServices().call() - return dict(data=max_num_services) - - @classmethod - def get_service_ids( - cls, - ledger_api: LedgerApi, - contract_address: str, - ) -> JSONLike: - """Retrieve the service IDs.""" - contract = cls.get_instance(ledger_api, contract_address) - service_ids = contract.functions.getServiceIds().call() - return dict(data=service_ids) - - @classmethod - def get_min_staking_duration( - cls, - ledger_api: LedgerApi, - contract_address: str, - ) -> JSONLike: - """Retrieve the service IDs.""" - contract = cls.get_instance(ledger_api, contract_address) - duration = contract.functions.minStakingDuration().call() - return dict(data=duration) diff --git a/operate/data/contracts/staking_token/contract.yaml b/operate/data/contracts/staking_token/contract.yaml deleted file mode 100644 index 2fce9ed86..000000000 --- a/operate/data/contracts/staking_token/contract.yaml +++ /dev/null @@ -1,23 +0,0 @@ -name: staking_token -author: valory -version: 0.1.0 -type: contract -description: Service staking token contract -license: Apache-2.0 -aea_version: '>=1.0.0, <2.0.0' -fingerprint: - __init__.py: bafybeicmgkagyhgwn2ktcdjbprijalbdyj26cvza4d3b7uvmehvy4mmr3i - build/StakingToken.json: bafybeid5vwardpaeeggfbp4o2ea7wdhywaeamhvyolxmhv6v2ynil4st6q - contract.py: bafybeigzb6oxpyi7eiohftxuha5t3tcvj2bekihc77ts3dwzqpfl34ev6y -fingerprint_ignore_patterns: [] -contracts: [] -class_name: StakingTokenContract -contract_interface_paths: - ethereum: build/StakingToken.json -dependencies: - open-aea-ledger-ethereum: - version: ==1.52.0 - open-aea-test-autonomy: - version: ==0.14.12 - web3: - version: <7,>=6.0.0 diff --git a/operate/services/manage.py b/operate/services/manage.py index d93e86687..abe7893b7 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -684,17 +684,29 @@ def terminate_service_on_chain_from_safe(self, hash: str, chain_id: int) -> None ic(info) + # Determine if the service is staked in a known staking program + current_staking_program = None for staking_program in STAKING[ledger_config.chain]: state = sftxb.staking_status( service_id=chain_data.token, staking_contract=STAKING[ledger_config.chain][staking_program], ) + if state in (StakingState.STAKED, StakingState.EVICTED): + current_staking_program = staking_program - print(state) + is_staked = current_staking_program is not None + # if is_staked: + # can_unstake = and not self._can_unstake_service_from_safe(hash=hash) + print(current_staking_program) + print(is_staked) import sys sys.exit(1) + + + + if ( chain_data.user_params.use_staking and not self._can_unstake_service_from_safe(hash=hash) diff --git a/operate/services/protocol.py b/operate/services/protocol.py index ea7bcda35..78e1d4e4e 100644 --- a/operate/services/protocol.py +++ b/operate/services/protocol.py @@ -63,9 +63,6 @@ from operate.data.contracts.service_staking_token.contract import ( ServiceStakingTokenContract, ) -from operate.data.contracts.staking_token.contract import ( - StakingTokenContract, -) from operate.types import ContractAddresses from operate.utils.gnosis import ( MultiSendOperation, @@ -203,48 +200,23 @@ def __init__( directory=str(DATA_DIR / "contracts" / "service_staking_token") ), ) - self.staking_token_ctr = t.cast( - StakingTokenContract, - StakingTokenContract.from_dir( - directory=str(DATA_DIR / "contracts" / "staking_token") - ), - ) + # self.staking_token_ctr = t.cast( + # StakingTokenContract, + # StakingTokenContract.from_dir( + # directory=str(DATA_DIR / "contracts" / "staking_token") + # ), + # ) def status(self, service_id: int, staking_contract: str) -> StakingState: """Is the service staked?""" - staking_state = None - - print(staking_contract) - try: - print("a") - staking_state = StakingState( - self.staking_ctr.get_instance( - ledger_api=self.ledger_api, - contract_address=staking_contract, - ) - .functions.getStakingState(service_id) - .call() + return StakingState( + self.staking_ctr.get_instance( + ledger_api=self.ledger_api, + contract_address=staking_contract, ) - print("b") - return staking_state - except Exception: - print("c") - - try: - staking_state = StakingState( - self.staking_token_ctr.get_instance( - ledger_api=self.ledger_api, - contract_address=staking_contract, - ) - .functions.getStakingState(service_id) - .call() - ) - return staking_state - except Exception: - print("EXCEPTION") - print("d") - - return staking_state + .functions.getStakingState(service_id) + .call() + ) def slots_available(self, staking_contract: str) -> bool: """Check if there are available slots on the staking contract""" From 11b8dacf284c24db56c0f43beab0eb3584da8fd7 Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Tue, 13 Aug 2024 13:41:44 +0200 Subject: [PATCH 047/134] chore: can unstake method --- operate/services/protocol.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/operate/services/protocol.py b/operate/services/protocol.py index 78e1d4e4e..7c6c6cba0 100644 --- a/operate/services/protocol.py +++ b/operate/services/protocol.py @@ -1174,6 +1174,21 @@ def staking_status(self, service_id: int, staking_contract: str) -> StakingState staking_contract=staking_contract, ) + def can_unstake(self, service_id: int, staking_contract: str) -> bool: + """Can unstake the service?""" + try: + StakingManager( + key=self.wallet.key_path, + password=self.wallet.password, + chain_type=self.chain_type, + ).check_if_unstaking_possible( + service_id=service_id, + staking_contract=staking_contract, + ) + return True + except ValueError: + return False + def get_swap_data(self, service_id: int, multisig: str, owner_key: str) -> t.Dict: """Swap safe owner.""" # TODO: Discuss implementation From 410bea2bd02ff54da69387fe8f3b58793e09f7b0 Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Wed, 14 Aug 2024 00:33:36 +0200 Subject: [PATCH 048/134] chore: updates --- operate/services/manage.py | 221 ++++++++++++++++++++++------------- operate/services/protocol.py | 151 +++++++++++++++++++++--- operate/types.py | 10 +- 3 files changed, 274 insertions(+), 108 deletions(-) diff --git a/operate/services/manage.py b/operate/services/manage.py index abe7893b7..a8531a45b 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -25,6 +25,7 @@ import shutil import traceback import typing as t +from collections import Counter from concurrent.futures import ThreadPoolExecutor from pathlib import Path @@ -69,6 +70,8 @@ DOCKER_COMPOSE_YAML = "docker-compose.yaml" SERVICE_YAML = "service.yaml" HTTP_OK = 200 +URI_HASH_POSITION = 7 +IPFS_GATEWAY = "https://gateway.autonolas.tech/ipfs/" class ServiceManager: @@ -363,30 +366,26 @@ def deploy_service_onchain( # pylint: disable=too-many-statements def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too-many-locals self, hash: str, - update: bool = False, ) -> None: service = self.load_or_create(hash=hash) for chain_id in service.chain_configs.keys(): self._deploy_service_onchain_from_safe( hash=hash, - update=update, chain_id=chain_id, ) def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too-many-locals self, hash: str, - update: bool, - chain_id: int, + chain_id: str, ) -> None: """ Deploy as service on-chain :param hash: Service hash """ - self.logger.info("DEPLOY SERVICE ONCHAIN FROM SAFE ====================") - self.logger.info("Loading service") + self.logger.info(f"_deploy_service_onchain_from_safe {chain_id=}") service = self.load_or_create(hash=hash) chain_config = service.chain_configs[chain_id] ledger_config = chain_config.ledger_config @@ -397,13 +396,9 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to wallet = self.wallet_manager.load(ledger_config.type) sftxb = self.get_eth_safe_tx_builder(ledger_config=ledger_config) - # TODO fixme + # TODO fix this os.environ["CUSTOM_CHAIN_RPC"] = ledger_config.rpc - - if user_params.use_staking and not sftxb.staking_slots_available( - staking_contract=STAKING[ledger_config.chain] - ): - raise ValueError("No staking slots available") + os.environ["OPEN_AUTONOMY_SUBGRAPH_URL"] = "https://subgraph.autonolas.tech/subgraphs/name/autonolas-staging" if chain_data.token > -1: self.logger.info("Syncing service state") @@ -411,9 +406,24 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to chain_data.on_chain_state = OnChainState(info["service_state"]) chain_data.instances = info["instances"] chain_data.multisig = info["multisig"] + current_agent_id = info["canonical_agents"][0] # TODO Allow multiple agents service.store() self.logger.info(f"Service state: {chain_data.on_chain_state.name}") + if user_params.use_staking: + staking_params = sftxb.get_staking_params( + staking_contract=STAKING[ledger_config.chain][user_params.staking_program_id], + ) + else: # TODO fix this - using pearl beta params + staking_params = dict( + agent_ids=[25], + service_registry="0x9338b5153AE39BB89f50468E608eD9d764B755fD", # nosec + staking_token="0xcE11e14225575945b8E6Dc0D4F2dD4C570f79d9f", # nosec + service_registry_token_utility="0xa45E64d13A30a51b91ae0eb182e88a40e9b18eD8", # nosec + min_staking_deposit=20000000000000000000, + activity_checker="0x155547857680A6D51bebC5603397488988DEb1c8" # nosec + ) + if user_params.use_staking: self.logger.info("Checking staking compatibility") if chain_data.on_chain_state in ( @@ -421,10 +431,10 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to OnChainState.PRE_REGISTRATION, ): required_olas = ( - user_params.olas_cost_of_bond + user_params.olas_required_to_stake + staking_params["min_staking_deposit"] + staking_params["min_staking_deposit"] # bond = staking ) elif chain_data.on_chain_state == OnChainState.ACTIVE_REGISTRATION: - required_olas = user_params.olas_required_to_stake + required_olas = staking_params["min_staking_deposit"] else: required_olas = 0 @@ -447,47 +457,85 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to is_update = ( (not is_first_mint) and (on_chain_hash is not None) - and (on_chain_hash != service.hash) + and (on_chain_hash != service.hash or current_agent_id != staking_params["agent_ids"][0]) ) self.logger.info(f"{on_chain_hash=}") + self.logger.info(f"{service.hash=}") self.logger.info(f"{is_first_mint=}") self.logger.info(f"{is_update=}") - is_update = update # TODO fix - # if is_update: - # self.terminate_service_on_chain_from_safe(hash=hash) - - # if is_first_mint or (is_update and self._get_on_chain_state(service) == OnChainState.PRE_REGISTRATION): - # if not is_update: - # self.logger.info("Minting the on-chain service") - # else: - # self.logger.info("Updating the on-chain service") - if is_update: - self.terminate_service_on_chain_from_safe( + self._terminate_service_on_chain_from_safe( hash=hash, chain_id=chain_id ) + # Update service + if self._get_on_chain_state(chain_config=chain_config) == OnChainState.PRE_REGISTRATION: + self.logger.info("Updating service") + receipt = ( + sftxb.new_tx() + .add( + sftxb.get_mint_tx_data( + package_path=service.service_path, + agent_id=staking_params["agent_ids"][0], + number_of_slots=service.helper.config.number_of_agents, + cost_of_bond=( + staking_params["min_staking_deposit"] + if user_params.use_staking + else user_params.cost_of_bond + ), + threshold=user_params.threshold, + nft=IPFSHash(user_params.nft), + update_token=chain_data.token, + token=( + staking_params["staking_token"] + if user_params.use_staking + else None + ), + ) + ) + .settle() + ) + event_data, *_ = t.cast( + t.Tuple, + registry_contracts.service_registry.process_receipt( + ledger_api=sftxb.ledger_api, + contract_address=staking_params["service_registry"], + event="UpdateService", + receipt=receipt, + ).get("events"), + ) + chain_data.on_chain_state = OnChainState.PRE_REGISTRATION + service.store() + + # Mint service if self._get_on_chain_state(chain_config=chain_config) == OnChainState.NON_EXISTENT: + + if user_params.use_staking and not sftxb.staking_slots_available( + staking_contract=STAKING[ledger_config.chain][user_params.staking_program_id] + ): + raise ValueError("No staking slots available") + + self.logger.info("Minting service") receipt = ( sftxb.new_tx() .add( sftxb.get_mint_tx_data( package_path=service.service_path, - agent_id=user_params.agent_id, + agent_id=staking_params["agent_ids"][0], number_of_slots=service.helper.config.number_of_agents, cost_of_bond=( - user_params.olas_cost_of_bond + staking_params["min_staking_deposit"] if user_params.use_staking else user_params.cost_of_bond ), threshold=user_params.threshold, nft=IPFSHash(user_params.nft), - update_token=chain_data.token if update else None, + update_token=None, token=( - OLAS[ledger_config.chain] + staking_params["staking_token"] if user_params.use_staking else None ), @@ -499,7 +547,7 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to t.Tuple, registry_contracts.service_registry.process_receipt( ledger_api=sftxb.ledger_api, - contract_address="0x9338b5153AE39BB89f50468E608eD9d764B755fD", + contract_address=staking_params["service_registry"], event="CreateService", receipt=receipt, ).get("events"), @@ -509,10 +557,11 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to service.store() if self._get_on_chain_state(chain_config=chain_config) == OnChainState.PRE_REGISTRATION: - cost_of_bond = user_params.cost_of_bond + cost_of_bond = staking_params["min_staking_deposit"] if user_params.use_staking: - token_utility = "0xa45E64d13A30a51b91ae0eb182e88a40e9b18eD8" # nosec - olas_token = "0xcE11e14225575945b8E6Dc0D4F2dD4C570f79d9f" # nosec + token_utility = staking_params["service_registry_token_utility"] + olas_token = staking_params["staking_token"] + agent_id = staking_params["agent_ids"][0] self.logger.info( f"Approving OLAS as bonding token from {wallet.safe} to {token_utility}" ) @@ -521,7 +570,7 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to ledger_api=sftxb.ledger_api, contract_address=token_utility, service_id=chain_data.token, - agent_id=user_params.agent_id, + agent_id=agent_id, ).get("bond") ) sftxb.new_tx().add( @@ -560,8 +609,9 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to if self._get_on_chain_state(chain_config=chain_config) == OnChainState.ACTIVE_REGISTRATION: cost_of_bond = user_params.cost_of_bond if user_params.use_staking: - token_utility = "0xa45E64d13A30a51b91ae0eb182e88a40e9b18eD8" # nosec - olas_token = "0xcE11e14225575945b8E6Dc0D4F2dD4C570f79d9f" # nosec + token_utility = staking_params["service_registry_token_utility"] + olas_token = staking_params["staking_token"] + agent_id = staking_params["agent_ids"][0] self.logger.info( f"Approving OLAS as bonding token from {wallet.safe} to {token_utility}" ) @@ -569,8 +619,8 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to registry_contracts.service_registry_token_utility.get_agent_bond( ledger_api=sftxb.ledger_api, contract_address=token_utility, - service_id=service.chain_data.token, - agent_id=user_params.agent_id, + service_id=chain_data.token, + agent_id=agent_id, ).get("bond") ) sftxb.new_tx().add( @@ -603,7 +653,7 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to sftxb.get_register_instances_data( service_id=chain_data.token, instances=instances, - agents=[user_params.agent_id for _ in instances], + agents=[agent_id for _ in instances], cost_of_bond=cost_of_bond, ) ).settle() @@ -612,6 +662,9 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to if self._get_on_chain_state(chain_config=chain_config) == OnChainState.FINISHED_REGISTRATION: self.logger.info("Deploying service") + + current_safe_owners = sftxb.get_service_safe_owners(service_id=chain_data.token) + print(f"{current_safe_owners=}") sftxb.new_tx().add( sftxb.get_deploy_data( service_id=chain_data.token, @@ -656,7 +709,7 @@ def terminate_service_on_chain(self, hash: str) -> None: service.chain_data.on_chain_state = OnChainState.TERMINATED_BONDED service.store() - def terminate_service_on_chain_from_safe(self, hash: str, chain_id: int) -> None: + def _terminate_service_on_chain_from_safe(self, hash: str, chain_id: str) -> None: """ Terminate service on-chain @@ -679,11 +732,6 @@ def terminate_service_on_chain_from_safe(self, hash: str, chain_id: int) -> None info = sftxb.info(token_id=chain_data.token) chain_data.on_chain_state = OnChainState(info["service_state"]) - - from icecream import ic - ic(info) - - # Determine if the service is staked in a known staking program current_staking_program = None for staking_program in STAKING[ledger_config.chain]: @@ -696,26 +744,23 @@ def terminate_service_on_chain_from_safe(self, hash: str, chain_id: int) -> None is_staked = current_staking_program is not None - # if is_staked: - # can_unstake = and not self._can_unstake_service_from_safe(hash=hash) - - print(current_staking_program) - print(is_staked) - import sys - sys.exit(1) - - - + can_unstake = False + if current_staking_program is not None: + can_unstake = sftxb.can_unstake( + service_id=chain_data.token, + staking_contract=STAKING[ledger_config.chain][current_staking_program], + ) - if ( - chain_data.user_params.use_staking - and not self._can_unstake_service_from_safe(hash=hash) - ): + # Cannot unstake, terminate flow. + if is_staked and not can_unstake: + self.logger.info("Service cannot be terminated on-chain: cannot unstake.") return - self.unstake_service_on_chain(hash=hash) + # Unstake the service if applies + if is_staked and can_unstake: + self.unstake_service_on_chain_from_safe(hash=hash, chain_id=chain_id, staking_program_id=current_staking_program) - if self._get_on_chain_state(service) in ( + if self._get_on_chain_state(chain_config) in ( OnChainState.ACTIVE_REGISTRATION, OnChainState.FINISHED_REGISTRATION, OnChainState.DEPLOYED, @@ -723,26 +768,32 @@ def terminate_service_on_chain_from_safe(self, hash: str, chain_id: int) -> None self.logger.info("Terminating service") sftxb.new_tx().add( sftxb.get_terminate_data( - service_id=service.chain_data.token, + service_id=chain_data.token, ) ).settle() - if self._get_on_chain_state(service) == OnChainState.TERMINATED_BONDED: + if self._get_on_chain_state(chain_config) == OnChainState.TERMINATED_BONDED: self.logger.info("Unbonding service") sftxb.new_tx().add( sftxb.get_unbond_data( - service_id=service.chain_data.token, + service_id=chain_data.token, ) ).settle() - if [["$current_safe_owners" == "['$agent_address']"]]: - sftx = self.get_eth_safe_tx_builder(service=old_service) # noqa: E800 - sftx.swap( # noqa: E800 - service_id=old_service.chain_data.token, # noqa: E800 - multisig=old_service.chain_data.multisig, # noqa: E800 + # Swap service safe + current_safe_owners = sftxb.get_service_safe_owners(service_id=chain_data.token) + counter_current_safe_owners = Counter(s.lower() for s in current_safe_owners) + counter_instances = Counter(s.lower() for s in instances) + + if counter_current_safe_owners == counter_instances: + self.logger.info("Swapping Safe owners") + sftxb.swap( # noqa: E800 + service_id=chain_data.token, # noqa: E800 + multisig=chain_data.multisig, # TODO this can be read from the registry owner_key=str( - self.keys_manager.get(key=owner).private_key + self.keys_manager.get(key=current_safe_owners[0]).private_key # TODO allow multiple owners ), # noqa: E800 + new_owner_address=wallet.safe if wallet.safe else wallet.crypto.address # TODO it should always be safe address ) # noqa: E800 def unbond_service_on_chain(self, hash: str) -> None: @@ -907,39 +958,45 @@ def unstake_service_on_chain(self, hash: str) -> None: service.chain_data.staked = False service.store() - def unstake_service_on_chain_from_safe(self, hash: str) -> None: + def unstake_service_on_chain_from_safe(self, hash: str, chain_id: str, staking_program_id: str) -> None: """ Unbond service on-chain :param hash: Service hash """ + + self.logger.info("unstake_service_on_chain_from_safe") service = self.load_or_create(hash=hash) - if not service.chain_data.user_params.use_staking: + chain_config = service.chain_configs[chain_id] + ledger_config = chain_config.ledger_config + chain_data = chain_config.chain_data + + if not chain_data.user_params.use_staking: self.logger.info("Cannot unstake service, `use_staking` is set to false") return - sftxb = self.get_eth_safe_tx_builder(service=service) + sftxb = self.get_eth_safe_tx_builder(ledger_config=ledger_config) state = sftxb.staking_status( - service_id=service.chain_data.token, - staking_contract=STAKING[service.ledger_config.chain], + service_id=chain_data.token, + staking_contract=STAKING[ledger_config.chain][staking_program_id], ) self.logger.info( - f"Staking status for service {service.chain_data.token}: {state}" + f"Staking status for service {chain_data.token}: {state}" ) if state not in {StakingState.STAKED, StakingState.EVICTED}: self.logger.info("Cannot unstake service, it's not staked") - service.chain_data.staked = False + chain_data.staked = False service.store() return - self.logger.info(f"Unstaking service: {service.chain_data.token}") + self.logger.info(f"Unstaking service: {chain_data.token}") sftxb.new_tx().add( sftxb.get_unstaking_data( - service_id=service.chain_data.token, - staking_contract=STAKING[service.ledger_config.chain], + service_id=chain_data.token, + staking_contract=STAKING[ledger_config.chain][staking_program_id], ) ).settle() - service.chain_data.staked = False + chain_data.staked = False service.store() def fund_service( # pylint: disable=too-many-arguments diff --git a/operate/services/protocol.py b/operate/services/protocol.py index 7c6c6cba0..92d3f6ad2 100644 --- a/operate/services/protocol.py +++ b/operate/services/protocol.py @@ -67,6 +67,7 @@ from operate.utils.gnosis import ( MultiSendOperation, SafeOperation, + get_owners, hash_payload_to_hex, skill_input_hex_to_payload, ) @@ -200,12 +201,6 @@ def __init__( directory=str(DATA_DIR / "contracts" / "service_staking_token") ), ) - # self.staking_token_ctr = t.cast( - # StakingTokenContract, - # StakingTokenContract.from_dir( - # directory=str(DATA_DIR / "contracts" / "staking_token") - # ), - # ) def status(self, service_id: int, staking_contract: str) -> StakingState: """Is the service staked?""" @@ -245,6 +240,48 @@ def service_info(self, staking_contract: str, service_id: int) -> dict: staking_contract, service_id, ).get("data") + + def agent_ids(self, staking_contract: str) -> t.List[int]: + instance = self.staking_ctr.get_instance( + ledger_api=self.ledger_api, + contract_address=staking_contract, + ) + return instance.functions.getAgentIds().call() + + def service_registry(self, staking_contract: str) -> str: + instance = self.staking_ctr.get_instance( + ledger_api=self.ledger_api, + contract_address=staking_contract, + ) + return instance.functions.serviceRegistry().call() + + def staking_token(self, staking_contract: str) -> str: + instance = self.staking_ctr.get_instance( + ledger_api=self.ledger_api, + contract_address=staking_contract, + ) + return instance.functions.stakingToken().call() + + def service_registry_token_utility(self, staking_contract: str) -> str: + instance = self.staking_ctr.get_instance( + ledger_api=self.ledger_api, + contract_address=staking_contract, + ) + return instance.functions.serviceRegistryTokenUtility().call() + + def min_staking_deposit(self, staking_contract: str) -> str: + instance = self.staking_ctr.get_instance( + ledger_api=self.ledger_api, + contract_address=staking_contract, + ) + return instance.functions.minStakingDeposit().call() + + def activity_checker(self, staking_contract: str) -> str: + instance = self.staking_ctr.get_instance( + ledger_api=self.ledger_api, + contract_address=staking_contract, + ) + return instance.functions.activityChecker().call() def check_staking_compatibility( self, @@ -535,11 +572,38 @@ def info(self, token_id: int) -> t.Dict: instances=instances, ) + + def get_service_safe_owners(self, service_id: int) -> t.List[str]: + """Get list of owners.""" + ledger_api, _ = OnChainHelper.get_ledger_and_crypto_objects( + chain_type=self.chain_type + ) + ( + _, + multisig_address, + _, + _, + _, + _, + _, + _, + ) = get_service_info( + ledger_api=ledger_api, + chain_type=self.chain_type, + token_id=service_id, + ) + return registry_contracts.gnosis_safe.get_owners( + ledger_api=ledger_api, + contract_address=multisig_address, + ).get("owners", []) + + def swap( # pylint: disable=too-many-arguments,too-many-locals self, service_id: int, multisig: str, owner_key: str, + new_owner_address: str ) -> None: """Swap safe owner.""" logging.info(f"Swapping safe for service {service_id} [{multisig}]...") @@ -569,7 +633,7 @@ def swap( # pylint: disable=too-many-arguments,too-many-locals contract_address=multisig, old_owner=manager.ledger_api.api.to_checksum_address(owner_to_swap), new_owner=manager.ledger_api.api.to_checksum_address( - manager.crypto.address + new_owner_address ), ).get("data") multisend_txs.append( @@ -909,7 +973,7 @@ def get_mint_tx_data( # pylint: disable=too-many-arguments ) .load_metadata() .verify_nft(nft=nft) - .verify_service_dependencies(agent_id=agent_id) + #.verify_service_dependencies(agent_id=agent_id) # TODO add this check once subgraph production indexes agent 25 .publish_metadata() ) instance = registry_contracts.service_manager.get_instance( @@ -917,17 +981,30 @@ def get_mint_tx_data( # pylint: disable=too-many-arguments contract_address=self.contracts["service_manager"], ) - txd = instance.encodeABI( - fn_name="create" if update_token is None else "update", - args=[ - self.wallet.safe, - token or ETHEREUM_ERC20, - manager.metadata_hash, - [agent_id], - [[number_of_slots, cost_of_bond]], - threshold, - ], - ) + if update_token is None: + txd = instance.encodeABI( + fn_name="create", + args=[ + self.wallet.safe, + token or ETHEREUM_ERC20, + manager.metadata_hash, + [agent_id], + [[number_of_slots, cost_of_bond]], + threshold, + ], + ) + else: + txd = instance.encodeABI( + fn_name="update", + args=[ + token or ETHEREUM_ERC20, + manager.metadata_hash, + [agent_id], + [[number_of_slots, cost_of_bond]], + threshold, + update_token + ], + ) return { "to": self.contracts["service_manager"], @@ -1174,6 +1251,42 @@ def staking_status(self, service_id: int, staking_contract: str) -> StakingState staking_contract=staking_contract, ) + def get_staking_params(self, staking_contract: str) -> t.Dict: + """Get agent IDs for the staking contract""" + self._patch() + staking_manager = StakingManager( + key=self.wallet.key_path, + password=self.wallet.password, + chain_type=self.chain_type, + ) + agent_ids = staking_manager.agent_ids( + staking_contract=staking_contract, + ) + service_registry = staking_manager.service_registry( + staking_contract=staking_contract, + ) + staking_token = staking_manager.staking_token( + staking_contract=staking_contract, + ) + service_registry_token_utility = staking_manager.service_registry_token_utility( + staking_contract=staking_contract, + ) + min_staking_deposit = staking_manager.min_staking_deposit( + staking_contract=staking_contract, + ) + activity_checker = staking_manager.activity_checker( + staking_contract=staking_contract, + ) + + return dict( + agent_ids=agent_ids, + service_registry=service_registry, + staking_token=staking_token, + service_registry_token_utility=service_registry_token_utility, + min_staking_deposit=min_staking_deposit, + activity_checker=activity_checker + ) + def can_unstake(self, service_id: int, staking_contract: str) -> bool: """Can unstake the service?""" try: diff --git a/operate/types.py b/operate/types.py index 0455cedc0..7360db461 100644 --- a/operate/types.py +++ b/operate/types.py @@ -182,14 +182,12 @@ class FundRequirementsTemplate(TypedDict): class ConfigurationTemplate(TypedDict): """Configuration template.""" + staking_program_id: str nft: str rpc: str - agent_id: int threshold: int use_staking: bool cost_of_bond: int - olas_cost_of_bond: int - olas_required_to_stake: int fund_requirements: FundRequirementsTemplate @@ -228,13 +226,11 @@ class OnChainFundRequirements(LocalResource): class OnChainUserParams(LocalResource): """On-chain user params.""" + staking_program_id: str nft: str - agent_id: int threshold: int use_staking: bool cost_of_bond: int - olas_cost_of_bond: int - olas_required_to_stake: int fund_requirements: OnChainFundRequirements @classmethod @@ -268,4 +264,4 @@ def from_json(cls, obj: t.Dict) -> "ChainConfig": return super().from_json(obj) # type: ignore -ChainConfigs = t.Dict[int, ChainConfig] +ChainConfigs = t.Dict[str, ChainConfig] From 489df50d6e451764d34f49b7a582a87a120e67a3 Mon Sep 17 00:00:00 2001 From: Atatakai Date: Wed, 14 Aug 2024 12:00:44 +0400 Subject: [PATCH 049/134] chore: update low gas alert logic --- frontend/components/Main/MainGasBalance.tsx | 14 ++++++------- .../Main/MainHeader/AgentButton/index.tsx | 6 +++--- frontend/components/Main/MainHeader/index.tsx | 7 +++---- frontend/components/Main/MainOlasBalance.tsx | 5 ++--- frontend/constants/thresholds.ts | 1 + frontend/context/BalanceProvider.tsx | 20 +++++++++++++++++++ 6 files changed, 35 insertions(+), 18 deletions(-) diff --git a/frontend/components/Main/MainGasBalance.tsx b/frontend/components/Main/MainGasBalance.tsx index 0d1f83f26..f3b14438d 100644 --- a/frontend/components/Main/MainGasBalance.tsx +++ b/frontend/components/Main/MainGasBalance.tsx @@ -4,7 +4,6 @@ import { useEffect, useMemo, useState } from 'react'; import styled from 'styled-components'; import { COLOR } from '@/constants/colors'; -import { LOW_BALANCE } from '@/constants/thresholds'; import { useBalance } from '@/hooks/useBalance'; import { useElectronApi } from '@/hooks/useElectronApi'; import { useStore } from '@/hooks/useStore'; @@ -34,7 +33,7 @@ const FineDot = styled(Dot)` `; const BalanceStatus = () => { - const { isBalanceLoaded, safeBalance } = useBalance(); + const { isBalanceLoaded, isLowBalance } = useBalance(); const { storeState } = useStore(); const { showNotification } = useElectronApi(); @@ -44,35 +43,34 @@ const BalanceStatus = () => { // show notification if balance is too low useEffect(() => { if (!isBalanceLoaded) return; - if (!safeBalance) return; if (!showNotification) return; if (!storeState?.isInitialFunded) return; - if (safeBalance.ETH < LOW_BALANCE && !isLowBalanceNotificationShown) { + if (isLowBalance && !isLowBalanceNotificationShown) { showNotification('Trading balance is too low.'); setIsLowBalanceNotificationShown(true); } // If it has already been shown and the balance has increased, // should show the notification again if it goes below the threshold. - if (safeBalance.ETH >= LOW_BALANCE && isLowBalanceNotificationShown) { + if (!isLowBalance && isLowBalanceNotificationShown) { setIsLowBalanceNotificationShown(false); } }, [ isBalanceLoaded, isLowBalanceNotificationShown, - safeBalance, + isLowBalance, showNotification, storeState?.isInitialFunded, ]); const status = useMemo(() => { - if (!safeBalance || safeBalance.ETH < LOW_BALANCE) { + if (isLowBalance) { return { statusName: 'Too low', StatusComponent: EmptyDot }; } return { statusName: 'Fine', StatusComponent: FineDot }; - }, [safeBalance]); + }, [isLowBalance]); const { statusName, StatusComponent } = status; return ( diff --git a/frontend/components/Main/MainHeader/AgentButton/index.tsx b/frontend/components/Main/MainHeader/AgentButton/index.tsx index 356a45c12..42c060200 100644 --- a/frontend/components/Main/MainHeader/AgentButton/index.tsx +++ b/frontend/components/Main/MainHeader/AgentButton/index.tsx @@ -4,7 +4,6 @@ import { useCallback, useMemo } from 'react'; import { Chain, DeploymentStatus } from '@/client'; import { COLOR } from '@/constants/colors'; -import { LOW_BALANCE } from '@/constants/thresholds'; import { useBalance } from '@/hooks/useBalance'; import { useElectronApi } from '@/hooks/useElectronApi'; import { useServices } from '@/hooks/useServices'; @@ -101,6 +100,7 @@ const AgentNotRunningButton = () => { const { setIsPaused: setIsBalancePollingPaused, safeBalance, + isLowBalance, totalOlasStakedBalance, totalEthBalance, } = useBalance(); @@ -194,7 +194,7 @@ const AgentNotRunningButton = () => { const isServiceInactive = serviceStatus === DeploymentStatus.BUILT || serviceStatus === DeploymentStatus.STOPPED; - if (isServiceInactive && safeBalance && safeBalance.ETH < LOW_BALANCE) { + if (isServiceInactive && isLowBalance) { return false; } @@ -224,7 +224,7 @@ const AgentNotRunningButton = () => { serviceStatus, storeState?.isInitialFunded, totalEthBalance, - safeBalance, + isLowBalance, ]); const buttonProps: ButtonProps = { diff --git a/frontend/components/Main/MainHeader/index.tsx b/frontend/components/Main/MainHeader/index.tsx index 78ffde06f..7dbd5560d 100644 --- a/frontend/components/Main/MainHeader/index.tsx +++ b/frontend/components/Main/MainHeader/index.tsx @@ -2,7 +2,6 @@ import { Flex } from 'antd'; import { useCallback, useEffect, useState } from 'react'; import { DeploymentStatus } from '@/client'; -import { LOW_BALANCE } from '@/constants/thresholds'; import { useBalance } from '@/hooks/useBalance'; import { useElectronApi } from '@/hooks/useElectronApi'; import { useServices } from '@/hooks/useServices'; @@ -12,12 +11,12 @@ import { AgentHead } from './AgentHead'; import { FirstRunModal } from './FirstRunModal'; const useSetupTrayIcon = () => { - const { safeBalance } = useBalance(); + const { isLowBalance } = useBalance(); const { serviceStatus } = useServices(); const { setTrayIcon } = useElectronApi(); useEffect(() => { - if (safeBalance && safeBalance.ETH < LOW_BALANCE) { + if (isLowBalance) { setTrayIcon?.('low-gas'); } else if (serviceStatus === DeploymentStatus.DEPLOYED) { setTrayIcon?.('running'); @@ -26,7 +25,7 @@ const useSetupTrayIcon = () => { } else if (serviceStatus === DeploymentStatus.BUILT) { setTrayIcon?.('logged-out'); } - }, [safeBalance, serviceStatus, setTrayIcon]); + }, [isLowBalance, serviceStatus, setTrayIcon]); return null; }; diff --git a/frontend/components/Main/MainOlasBalance.tsx b/frontend/components/Main/MainOlasBalance.tsx index fa6d87b9b..9b11ebec7 100644 --- a/frontend/components/Main/MainOlasBalance.tsx +++ b/frontend/components/Main/MainOlasBalance.tsx @@ -122,13 +122,12 @@ const MainOlasBalanceAlert = styled.div` `; const LowTradingBalanceAlert = () => { - const { isBalanceLoaded, safeBalance } = useBalance(); + const { isBalanceLoaded, isLowBalance } = useBalance(); const { storeState } = useStore(); if (!isBalanceLoaded) return null; - if (!safeBalance) return null; if (!storeState?.isInitialFunded) return; - if (safeBalance.ETH >= LOW_BALANCE) return null; + if (!isLowBalance) return null; return ( diff --git a/frontend/constants/thresholds.ts b/frontend/constants/thresholds.ts index fb5ab3515..59d9dde02 100644 --- a/frontend/constants/thresholds.ts +++ b/frontend/constants/thresholds.ts @@ -7,4 +7,5 @@ export const MIN_ETH_BALANCE_THRESHOLDS = { }, }; +export const LOW_AGENT_BALANCE = 0.5; export const LOW_BALANCE = 2; diff --git a/frontend/context/BalanceProvider.tsx b/frontend/context/BalanceProvider.tsx index 12c5400ec..9e8cef062 100644 --- a/frontend/context/BalanceProvider.tsx +++ b/frontend/context/BalanceProvider.tsx @@ -16,6 +16,7 @@ import { useInterval } from 'usehooks-ts'; import { Wallet } from '@/client'; import { FIVE_SECONDS_INTERVAL } from '@/constants/intervals'; +import { LOW_AGENT_BALANCE, LOW_BALANCE } from '@/constants/thresholds'; import { TOKENS } from '@/constants/tokens'; import { ServiceRegistryL2ServiceState } from '@/enums/ServiceRegistryL2ServiceState'; import { Token } from '@/enums/Token'; @@ -43,6 +44,7 @@ export const BalanceContext = createContext<{ safeBalance?: ValueOf; totalEthBalance?: number; totalOlasBalance?: number; + isLowBalance: boolean; wallets?: Wallet[]; walletBalances: WalletAddressNumberRecord; updateBalances: () => Promise; @@ -58,6 +60,7 @@ export const BalanceContext = createContext<{ safeBalance: undefined, totalEthBalance: undefined, totalOlasBalance: undefined, + isLowBalance: false, wallets: undefined, walletBalances: {}, updateBalances: async () => {}, @@ -195,6 +198,22 @@ export const BalanceProvider = ({ children }: PropsWithChildren) => { () => masterSafeAddress && walletBalances[masterSafeAddress], [masterSafeAddress, walletBalances], ); + const agentSafeBalance = useMemo( + () => + services?.[0]?.chain_data?.multisig && + walletBalances[services[0].chain_data.multisig], + [services, walletBalances], + ); + const isLowBalance = useMemo(() => { + if (!safeBalance || !agentSafeBalance) return false; + if ( + safeBalance.ETH < LOW_BALANCE && + // Need to check agentSafe balance as well, because it's auto-funded from safeBalance + agentSafeBalance.ETH < LOW_AGENT_BALANCE + ) + return true; + return false; + }, [safeBalance, agentSafeBalance]); useInterval( () => { @@ -215,6 +234,7 @@ export const BalanceProvider = ({ children }: PropsWithChildren) => { safeBalance, totalEthBalance, totalOlasBalance, + isLowBalance, wallets, walletBalances, updateBalances, From b4d90a1f94feaeb1aa0c5189d2e83a73cd37e23b Mon Sep 17 00:00:00 2001 From: truemiller Date: Wed, 14 Aug 2024 10:13:31 +0100 Subject: [PATCH 050/134] feat: Update enum names in PageState.ts and usePageState.ts --- frontend/components/Alert/index.tsx | 2 +- .../index.tsx | 4 +- .../IncentiveProgramSection/index.tsx | 131 ---------------- .../Incentives/WhatAreIncentivePrograms.tsx | 15 -- .../MainPage/MainHeader/FirstRunModal.tsx | 58 +++++++ .../header/AgentButton.tsx} | 27 +++- .../header}/AgentHead.tsx | 0 .../header/CannotStartAgentPopover.tsx} | 2 +- .../header}/constants.ts | 0 .../MainHeader => MainPage/header}/index.tsx | 2 +- .../components/{Main => MainPage}/index.tsx | 26 +-- .../modals}/FirstRunModal.tsx | 0 .../MainPage/modals/MigrationModal.tsx | 57 +++++++ .../sections/AddFundsSection.tsx} | 8 +- .../sections/GasBalanceSection.tsx} | 4 +- .../sections/KeepAgentRunningSection.tsx} | 8 +- .../sections/NeedsFundsSection.tsx} | 8 +- .../sections/NewIncentiveAlertSection.tsx} | 10 +- .../sections/OlasBalanceSection.tsx} | 8 +- .../sections/RewardsSection.tsx} | 4 +- .../IncentiveProgramBadge.tsx | 0 .../IncentiveProgramSection/alerts.tsx | 84 ++++++++++ .../IncentiveProgramSection/index.tsx | 148 ++++++++++++++++++ .../WhatAreStakingContracts.tsx | 36 +++++ .../index.tsx | 4 +- .../AddBackupWalletPage.tsx} | 2 +- .../DebugInfoSection.tsx} | 2 +- .../SettingsPage/StakingContractSection.tsx | 28 ++++ .../{Settings => SettingsPage}/index.tsx | 24 +-- .../Create/SetupBackupSigner.tsx | 0 .../Create/SetupCreateHeader.tsx | 0 .../Create/SetupCreateSafe.tsx | 4 +- .../Create/SetupEoaFunding.tsx | 6 +- .../Create/SetupPassword.tsx | 0 .../Create/SetupSeedPhrase.tsx | 0 .../{Setup => SetupPage}/SetupRestore.tsx | 0 .../{Setup => SetupPage}/SetupWelcome.tsx | 4 +- .../components/{Setup => SetupPage}/index.tsx | 0 frontend/context/PageStateProvider.tsx | 10 +- frontend/enums/PageState.ts | 4 +- frontend/hooks/useModals.ts | 11 ++ frontend/hooks/usePageState.ts | 4 +- frontend/hooks/useStakingProgram.ts | 36 +++++ frontend/pages/index.tsx | 18 +-- 44 files changed, 567 insertions(+), 232 deletions(-) rename frontend/components/{HelpAndSupport => HelpAndSupportPage}/index.tsx (97%) delete mode 100644 frontend/components/Incentives/IncentiveProgramSection/index.tsx delete mode 100644 frontend/components/Incentives/WhatAreIncentivePrograms.tsx create mode 100644 frontend/components/MainPage/MainHeader/FirstRunModal.tsx rename frontend/components/{Main/MainHeader/AgentButton/index.tsx => MainPage/header/AgentButton.tsx} (92%) rename frontend/components/{Main/MainHeader => MainPage/header}/AgentHead.tsx (100%) rename frontend/components/{Main/MainHeader/CannotStartAgent.tsx => MainPage/header/CannotStartAgentPopover.tsx} (98%) rename frontend/components/{Main/MainHeader => MainPage/header}/constants.ts (100%) rename frontend/components/{Main/MainHeader => MainPage/header}/index.tsx (96%) rename frontend/components/{Main => MainPage}/index.tsx (64%) rename frontend/components/{Main/MainHeader => MainPage/modals}/FirstRunModal.tsx (100%) create mode 100644 frontend/components/MainPage/modals/MigrationModal.tsx rename frontend/components/{Main/MainAddFunds.tsx => MainPage/sections/AddFundsSection.tsx} (96%) rename frontend/components/{Main/MainGasBalance.tsx => MainPage/sections/GasBalanceSection.tsx} (97%) rename frontend/components/{Main/KeepAgentRunning.tsx => MainPage/sections/KeepAgentRunningSection.tsx} (83%) rename frontend/components/{Main/MainNeedsFunds.tsx => MainPage/sections/NeedsFundsSection.tsx} (94%) rename frontend/components/{Main/NewIncentiveAlert.tsx => MainPage/sections/NewIncentiveAlertSection.tsx} (74%) rename frontend/components/{Main/MainOlasBalance.tsx => MainPage/sections/OlasBalanceSection.tsx} (97%) rename frontend/components/{Main/MainRewards.tsx => MainPage/sections/RewardsSection.tsx} (97%) rename frontend/components/{Incentives => ManageStakingPage}/IncentiveProgramSection/IncentiveProgramBadge.tsx (100%) create mode 100644 frontend/components/ManageStakingPage/IncentiveProgramSection/alerts.tsx create mode 100644 frontend/components/ManageStakingPage/IncentiveProgramSection/index.tsx create mode 100644 frontend/components/ManageStakingPage/WhatAreStakingContracts.tsx rename frontend/components/{Incentives => ManageStakingPage}/index.tsx (93%) rename frontend/components/{Settings/SettingsAddBackupWallet.tsx => SettingsPage/AddBackupWalletPage.tsx} (97%) rename frontend/components/{Settings/DebugInfoCard.tsx => SettingsPage/DebugInfoSection.tsx} (99%) create mode 100644 frontend/components/SettingsPage/StakingContractSection.tsx rename frontend/components/{Settings => SettingsPage}/index.tsx (85%) rename frontend/components/{Setup => SetupPage}/Create/SetupBackupSigner.tsx (100%) rename frontend/components/{Setup => SetupPage}/Create/SetupCreateHeader.tsx (100%) rename frontend/components/{Setup => SetupPage}/Create/SetupCreateSafe.tsx (96%) rename frontend/components/{Setup => SetupPage}/Create/SetupEoaFunding.tsx (98%) rename frontend/components/{Setup => SetupPage}/Create/SetupPassword.tsx (100%) rename frontend/components/{Setup => SetupPage}/Create/SetupSeedPhrase.tsx (100%) rename frontend/components/{Setup => SetupPage}/SetupRestore.tsx (100%) rename frontend/components/{Setup => SetupPage}/SetupWelcome.tsx (98%) rename frontend/components/{Setup => SetupPage}/index.tsx (100%) create mode 100644 frontend/hooks/useModals.ts create mode 100644 frontend/hooks/useStakingProgram.ts diff --git a/frontend/components/Alert/index.tsx b/frontend/components/Alert/index.tsx index 3cadd98b7..5a0222108 100644 --- a/frontend/components/Alert/index.tsx +++ b/frontend/components/Alert/index.tsx @@ -14,7 +14,7 @@ const icons = { error: , }; -export const Alert = ({ +export const CustomAlert = ({ type, fullWidth, ...rest diff --git a/frontend/components/HelpAndSupport/index.tsx b/frontend/components/HelpAndSupportPage/index.tsx similarity index 97% rename from frontend/components/HelpAndSupport/index.tsx rename to frontend/components/HelpAndSupportPage/index.tsx index 278246e9e..1aec818ac 100644 --- a/frontend/components/HelpAndSupport/index.tsx +++ b/frontend/components/HelpAndSupportPage/index.tsx @@ -4,7 +4,7 @@ import { useCallback, useEffect, useState } from 'react'; import { UNICODE_SYMBOLS } from '@/constants/symbols'; import { FAQ_URL, SUPPORT_URL } from '@/constants/urls'; -import { PageState } from '@/enums/PageState'; +import { Pages } from '@/enums/PageState'; import { useElectronApi } from '@/hooks/useElectronApi'; import { useLogs } from '@/hooks/useLogs'; import { usePageState } from '@/hooks/usePageState'; @@ -78,7 +78,7 @@ export const HelpAndSupport = () => { - - ); -}; diff --git a/frontend/components/Incentives/WhatAreIncentivePrograms.tsx b/frontend/components/Incentives/WhatAreIncentivePrograms.tsx deleted file mode 100644 index 3fd179058..000000000 --- a/frontend/components/Incentives/WhatAreIncentivePrograms.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { RightOutlined } from '@ant-design/icons'; -import { Flex, Typography } from 'antd'; - -import { CardSection } from '../styled/CardSection'; - -export const WhatAreIncentiveProgramsSection = () => { - return ( - - - - What are incentive programs? - - - ); -}; diff --git a/frontend/components/MainPage/MainHeader/FirstRunModal.tsx b/frontend/components/MainPage/MainHeader/FirstRunModal.tsx new file mode 100644 index 000000000..73f017d70 --- /dev/null +++ b/frontend/components/MainPage/MainHeader/FirstRunModal.tsx @@ -0,0 +1,58 @@ +import { Button, Flex, Modal, Typography } from 'antd'; +import Image from 'next/image'; +import { FC } from 'react'; + +import { useServiceTemplates } from '@/hooks/useServiceTemplates'; +import { getMinimumStakedAmountRequired } from '@/utils/service'; + +type FirstRunModalProps = { open: boolean; onClose: () => void }; + +export const FirstRunModal: FC = ({ open, onClose }) => { + const { getServiceTemplates } = useServiceTemplates(); + + if (!open) return null; + + const minimumStakedAmountRequired = getMinimumStakedAmountRequired( + getServiceTemplates()[0], + ); + + return ( + + Got it + , + ]} + > + + OLAS logo + + + {`Your agent is running and you've staked ${minimumStakedAmountRequired} OLAS!`} + + + Your agent is working towards earning rewards. + + + Pearl is designed to make it easy for you to earn staking rewards every + day. Simply leave the app and agent running in the background for ~1hr a + day. + + + ); +}; diff --git a/frontend/components/Main/MainHeader/AgentButton/index.tsx b/frontend/components/MainPage/header/AgentButton.tsx similarity index 92% rename from frontend/components/Main/MainHeader/AgentButton/index.tsx rename to frontend/components/MainPage/header/AgentButton.tsx index 356a45c12..7f689d92a 100644 --- a/frontend/components/Main/MainHeader/AgentButton/index.tsx +++ b/frontend/components/MainPage/header/AgentButton.tsx @@ -10,6 +10,7 @@ import { useElectronApi } from '@/hooks/useElectronApi'; import { useServices } from '@/hooks/useServices'; import { useServiceTemplates } from '@/hooks/useServiceTemplates'; import { useStakingContractInfo } from '@/hooks/useStakingContractInfo'; +import { useStakingProgram } from '@/hooks/useStakingProgram'; import { useStore } from '@/hooks/useStore'; import { useWallet } from '@/hooks/useWallet'; import { ServicesService } from '@/service/Services'; @@ -17,10 +18,10 @@ import { WalletService } from '@/service/Wallet'; import { getMinimumStakedAmountRequired } from '@/utils/service'; import { - CannotStartAgent, CannotStartAgentDueToUnexpectedError, -} from '../CannotStartAgent'; -import { requiredGas, requiredOlas } from '../constants'; + CannotStartAgentPopover, +} from './CannotStartAgentPopover'; +import { requiredGas, requiredOlas } from './constants'; const { Text } = Typography; @@ -239,7 +240,19 @@ const AgentNotRunningButton = () => { return ; }; +const MigratingButton = () => { + return ( + + + + ); +}; + export const AgentButton = () => { + const { isMigrating } = useStakingProgram(); const { service, serviceStatus, hasInitialLoaded } = useServices(); const { isEligibleForStaking, isAgentEvicted } = useStakingContractInfo(); @@ -248,6 +261,10 @@ export const AgentButton = () => { return , + ]} + > + + {/* Robot head */} + + Pearl agent head + + + You switched staking contract succesfully! + + + Your agent is now staked on {currentStakingProgram.name}. + + {/* TODO: Add relevant block explorer domain */} + + View full contract details {UNICODE_SYMBOLS.EXTERNAL_LINK} + + + + ); +}; diff --git a/frontend/components/Main/MainAddFunds.tsx b/frontend/components/MainPage/sections/AddFundsSection.tsx similarity index 96% rename from frontend/components/Main/MainAddFunds.tsx rename to frontend/components/MainPage/sections/AddFundsSection.tsx index 06fd3d4dc..97bf85641 100644 --- a/frontend/components/Main/MainAddFunds.tsx +++ b/frontend/components/MainPage/sections/AddFundsSection.tsx @@ -22,8 +22,8 @@ import { Address } from '@/types/Address'; import { copyToClipboard } from '@/utils/copyToClipboard'; import { truncateAddress } from '@/utils/truncate'; -import { Alert } from '../Alert'; -import { CardSection } from '../styled/CardSection'; +import { CustomAlert } from '../../Alert'; +import { CardSection } from '../../styled/CardSection'; const { Text } = Typography; @@ -33,7 +33,7 @@ const CustomizedCardSection = styled(CardSection)<{ border?: boolean }>` } `; -export const MainAddFunds = () => { +export const AddFundsSection = () => { const [isAddFundsVisible, setIsAddFundsVisible] = useState(false); const { masterSafeAddress } = useWallet(); @@ -92,7 +92,7 @@ export const MainAddFunds = () => { const AddFundsWarningAlertSection = () => ( - { +export const GasBalanceSection = () => { const { masterSafeAddress } = useWallet(); const { isBalanceLoaded } = useBalance(); diff --git a/frontend/components/Main/KeepAgentRunning.tsx b/frontend/components/MainPage/sections/KeepAgentRunningSection.tsx similarity index 83% rename from frontend/components/Main/KeepAgentRunning.tsx rename to frontend/components/MainPage/sections/KeepAgentRunningSection.tsx index 1cc98b333..90803c2f1 100644 --- a/frontend/components/Main/KeepAgentRunning.tsx +++ b/frontend/components/MainPage/sections/KeepAgentRunningSection.tsx @@ -4,14 +4,14 @@ import { DeploymentStatus } from '@/client'; import { useServices } from '@/hooks/useServices'; import { useStore } from '@/hooks/useStore'; -import { Alert } from '../Alert'; -import { CardSection } from '../styled/CardSection'; +import { CustomAlert } from '../../Alert'; +import { CardSection } from '../../styled/CardSection'; const { Text } = Typography; const COVER_BLOCK_BORDERS_STYLE = { marginBottom: '-1px' }; -export const KeepAgentRunning = () => { +export const KeepAgentRunningSection = () => { const { storeState } = useStore(); const { serviceStatus } = useServices(); @@ -20,7 +20,7 @@ export const KeepAgentRunning = () => { return ( - { return ( - + ); }; diff --git a/frontend/components/Main/NewIncentiveAlert.tsx b/frontend/components/MainPage/sections/NewIncentiveAlertSection.tsx similarity index 74% rename from frontend/components/Main/NewIncentiveAlert.tsx rename to frontend/components/MainPage/sections/NewIncentiveAlertSection.tsx index c38b870dd..b99c4f1a6 100644 --- a/frontend/components/Main/NewIncentiveAlert.tsx +++ b/frontend/components/MainPage/sections/NewIncentiveAlertSection.tsx @@ -1,10 +1,10 @@ import { Button, Flex, Typography } from 'antd'; -import { PageState } from '@/enums/PageState'; +import { Pages } from '@/enums/PageState'; import { usePageState } from '@/hooks/usePageState'; -import { Alert } from '../Alert'; -import { CardSection } from '../styled/CardSection'; +import { CustomAlert } from '../../Alert'; +import { CardSection } from '../../styled/CardSection'; const { Text } = Typography; @@ -13,7 +13,7 @@ export const NewIncentiveAlert = () => { return ( - { diff --git a/frontend/components/Main/MainOlasBalance.tsx b/frontend/components/MainPage/sections/OlasBalanceSection.tsx similarity index 97% rename from frontend/components/Main/MainOlasBalance.tsx rename to frontend/components/MainPage/sections/OlasBalanceSection.tsx index 28e0170a4..a991ec711 100644 --- a/frontend/components/Main/MainOlasBalance.tsx +++ b/frontend/components/MainPage/sections/OlasBalanceSection.tsx @@ -3,7 +3,7 @@ import { Button, Flex, Skeleton, Tooltip, Typography } from 'antd'; import { useMemo } from 'react'; import styled from 'styled-components'; -import { Alert } from '@/components/Alert'; +import { CustomAlert } from '@/components/Alert'; import { COLOR } from '@/constants/colors'; import { UNICODE_SYMBOLS } from '@/constants/symbols'; import { LOW_BALANCE } from '@/constants/thresholds'; @@ -13,7 +13,7 @@ import { useReward } from '@/hooks/useReward'; import { useStore } from '@/hooks/useStore'; import { balanceFormat } from '@/utils/numberFormatters'; -import { CardSection } from '../styled/CardSection'; +import { CardSection } from '../../styled/CardSection'; const { Text, Title } = Typography; const Balance = styled.span` @@ -130,7 +130,7 @@ const LowTradingBalanceAlert = () => { return ( - { return ( - ( + + + Add funds to your account to meet the program requirements. + + + Your current OLAS balance: {totalOlasBalance} OLAS + + + Your current trading balance: {totalEthBalance} XDAI + + + } + /> +); +{ + /* No jobs available alert */ +} + +export const AlertNoSlots = () => ( + + No slots currently available - try again later. + + } + /> +); + +export const AlertUpdateToMigrate = () => ( + + {/* + TODO: Define version requirement in some JSON store? + How do we access this date on a previous version? + */} + + This incentive program is available for users who have the app version + rc105 or higher. + + {/* TODO: make current version accessible via Electron or Env? */} + Current app version: rc97 + {/* TODO: trigger update through IPC */} + + Update Pearl to the latest version {UNICODE_SYMBOLS.EXTERNAL_LINK} + + + } + /> +); + +export const AlertCantMigrateDefault = () => ( + +); diff --git a/frontend/components/ManageStakingPage/IncentiveProgramSection/index.tsx b/frontend/components/ManageStakingPage/IncentiveProgramSection/index.tsx new file mode 100644 index 000000000..4a17a5a4b --- /dev/null +++ b/frontend/components/ManageStakingPage/IncentiveProgramSection/index.tsx @@ -0,0 +1,148 @@ +import { Button, Flex, theme, Typography } from 'antd'; +import { useMemo } from 'react'; + +import { CardSection } from '@/components/styled/CardSection'; +import { UNICODE_SYMBOLS } from '@/constants/symbols'; +import { IncentiveProgramStatus } from '@/enums/IcentiveProgram'; +import { useBalance } from '@/hooks/useBalance'; +import { Address } from '@/types/Address'; +import { IncentiveProgram } from '@/types/IncentiveProgram'; + +import { + AlertInsufficientMigrationFunds, + AlertNoSlots, + AlertUpdateToMigrate, +} from './alerts'; +import { IncentiveProgramTag } from './IncentiveProgramBadge'; + +const { useToken } = theme; + +const ProgramTitle = ({ + name, + status, +}: { + name: string; + status: IncentiveProgramStatus; +}) => ( + + {name} + + +); + +const ProgramDetailsLink = ({ address }: { address: Address }) => { + const blockExplorerLink = `https://blockExplorer.com/poa/xdai/address/${address}`; + return ( + + Contract details {UNICODE_SYMBOLS.EXTERNAL_LINK} + + ); +}; + +const HorizontalGreyLine = () => ( + +); + +export const IncentiveProgramSection = ({ + program, +}: { + program: IncentiveProgram; +}) => { + const { token } = useToken(); + const { totalOlasBalance, totalEthBalance, isBalanceLoaded } = useBalance(); + + const isEnoughSlots = false; //program.slots > 0; + const isEnoughOlas = false; // totalOlasBalance; + const isEnoughEth = false; // totalEthBalance; + const isAppVersionCompatible = false; // program.appVersion === 'rc105'; + + const isMigratable = + program.status !== IncentiveProgramStatus.Deprecated && + program.status !== IncentiveProgramStatus.Selected && + isBalanceLoaded && + isEnoughSlots && + isEnoughOlas && + isEnoughEth && + isAppVersionCompatible; + + const alertCantMigrate = useMemo(() => { + if ( + program.status === IncentiveProgramStatus.Deprecated || + program.status === IncentiveProgramStatus.Selected + ) { + return; + } + + if (!isBalanceLoaded) { + return; + } + + if (isEnoughSlots) { + return ; + } + + if (!isEnoughOlas || !isEnoughEth) { + return ( + + ); + } + + if (!isAppVersionCompatible) { + return ; + } + + if (!isMigratable) { + return; + } + }, [ + isAppVersionCompatible, + isBalanceLoaded, + isEnoughEth, + isEnoughOlas, + isEnoughSlots, + isMigratable, + program.status, + totalEthBalance, + totalOlasBalance, + ]); + + return ( + + {/* Title */} + + + + + {/* Rewards per work period */} + + Rewards per work period + + {`0.25 OLAS`} + + {/* Required Olas */} + + Required OLAS for staking + + {`20 OLAS`} + + {/* "Can't migrate" Alert */} + {alertCantMigrate} + {/* Switch to program button */} + + + ); +}; diff --git a/frontend/components/ManageStakingPage/WhatAreStakingContracts.tsx b/frontend/components/ManageStakingPage/WhatAreStakingContracts.tsx new file mode 100644 index 000000000..21826c604 --- /dev/null +++ b/frontend/components/ManageStakingPage/WhatAreStakingContracts.tsx @@ -0,0 +1,36 @@ +import { Collapse, Flex, Typography } from 'antd'; + +import { CardSection } from '../styled/CardSection'; + +const collapseItems = [ + { + key: 1, + label: 'What are incentive programs?', + children: ( + + + When your agent goes to work, it participates in staking contracts. + + + Staking contracts define what the agent needs to do, how much OLAS + needs to be staked etc. + + + Your agent can only participate in one staking contract at a time. + + + You need to run your agent for max 1 hour a day, regardless of the + staking contract. + + + ), + }, +]; + +export const WhatAreIncentiveProgramsSection = () => { + return ( + + + + ); +}; diff --git a/frontend/components/Incentives/index.tsx b/frontend/components/ManageStakingPage/index.tsx similarity index 93% rename from frontend/components/Incentives/index.tsx rename to frontend/components/ManageStakingPage/index.tsx index 11d998bcf..ef3fe0fbd 100644 --- a/frontend/components/Incentives/index.tsx +++ b/frontend/components/ManageStakingPage/index.tsx @@ -1,7 +1,7 @@ import { CloseOutlined, SettingOutlined } from '@ant-design/icons'; import { Button, Card, Flex } from 'antd'; -import { PageState } from '@/enums/PageState'; +import { Pages } from '@/enums/PageState'; import { usePageState } from '@/hooks/usePageState'; import { IncentiveProgram } from '@/types/IncentiveProgram'; @@ -46,7 +46,7 @@ export const Incentives = () => { + + ); +}; diff --git a/frontend/components/Settings/index.tsx b/frontend/components/SettingsPage/index.tsx similarity index 85% rename from frontend/components/Settings/index.tsx rename to frontend/components/SettingsPage/index.tsx index 81a0a0160..3c657e680 100644 --- a/frontend/components/Settings/index.tsx +++ b/frontend/components/SettingsPage/index.tsx @@ -4,18 +4,19 @@ import Link from 'next/link'; import { useMemo } from 'react'; import { UNICODE_SYMBOLS } from '@/constants/symbols'; -import { PageState } from '@/enums/PageState'; +import { Pages } from '@/enums/PageState'; import { SettingsScreen } from '@/enums/SettingsScreen'; import { useMasterSafe } from '@/hooks/useMasterSafe'; import { usePageState } from '@/hooks/usePageState'; import { useSettings } from '@/hooks/useSettings'; import { truncateAddress } from '@/utils/truncate'; -import { Alert } from '../Alert'; +import { CustomAlert } from '../Alert'; import { CardTitle } from '../Card/CardTitle'; import { CardSection } from '../styled/CardSection'; -import { DebugInfoCard } from './DebugInfoCard'; -import { SettingsAddBackupWallet } from './SettingsAddBackupWallet'; +import { AddBackupWalletPage } from './AddBackupWalletPage'; +import { DebugInfoSection } from './DebugInfoSection'; +import { StakingContractSection } from './StakingContractSection'; const { Text, Paragraph } = Typography; @@ -37,7 +38,7 @@ export const Settings = () => { case SettingsScreen.Main: return ; case SettingsScreen.AddBackupWallet: - return ; + return ; default: return null; } @@ -64,17 +65,18 @@ const SettingsMain = () => { - - ); -}; diff --git a/frontend/components/ManageStakingPage/StakingContract/StakingContractTag.tsx b/frontend/components/ManageStakingPage/StakingContract/StakingContractTag.tsx new file mode 100644 index 000000000..9233845fa --- /dev/null +++ b/frontend/components/ManageStakingPage/StakingContract/StakingContractTag.tsx @@ -0,0 +1,18 @@ +import { Tag } from 'antd'; + +import { IncentiveProgramStatus } from '@/enums/IcentiveProgram'; + +export const StakingContractTag = ({ + status, +}: { + status: IncentiveProgramStatus; +}) => { + if (status === IncentiveProgramStatus.New) { + return New; + } else if (status === IncentiveProgramStatus.Selected) { + return Selected; + } else if (status === IncentiveProgramStatus.Deprecated) { + return Deprecated; + } + return null; +}; diff --git a/frontend/components/ManageStakingPage/StakingContract/alerts.tsx b/frontend/components/ManageStakingPage/StakingContract/alerts.tsx new file mode 100644 index 000000000..f2c1cf6cd --- /dev/null +++ b/frontend/components/ManageStakingPage/StakingContract/alerts.tsx @@ -0,0 +1,62 @@ +import { Flex, Typography } from 'antd'; + +import { CustomAlert } from '@/components/Alert'; +import { UNICODE_SYMBOLS } from '@/constants/symbols'; + +const { Text } = Typography; + +export const AlertInsufficientMigrationFunds = ({ + totalOlasBalance, +}: { + totalOlasBalance: number; +}) => ( + + + Insufficient amount of funds to switch + + + Add funds to your account to meet the program requirements. + + Your current OLAS balance:{' '} + {totalOlasBalance} OLAS + + + } + /> +); + +export const AlertNoSlots = () => ( + No slots currently available - try again later.} + /> +); + +export const AlertUpdateToMigrate = () => ( + + App update required + + {/* + TODO: Define version requirement in some JSON store? + How do we access this date on a previous version? + */} + + Update Pearl to the latest version to switch to the staking contract. + + {/* TODO: trigger update through IPC */} + + Update Pearl to the latest version {UNICODE_SYMBOLS.EXTERNAL_LINK} + + + } + /> +); diff --git a/frontend/components/ManageStakingPage/StakingContract/index.tsx b/frontend/components/ManageStakingPage/StakingContract/index.tsx new file mode 100644 index 000000000..0153d4dba --- /dev/null +++ b/frontend/components/ManageStakingPage/StakingContract/index.tsx @@ -0,0 +1,139 @@ +import { Button, Divider, Flex, theme, Typography } from 'antd'; +import { useMemo } from 'react'; +import styled from 'styled-components'; + +import { CardSection } from '@/components/styled/CardSection'; +import { UNICODE_SYMBOLS } from '@/constants/symbols'; +import { IncentiveProgramStatus } from '@/enums/IcentiveProgram'; +import { useBalance } from '@/hooks/useBalance'; +import { IncentiveProgram } from '@/types/IncentiveProgram'; + +import { + AlertInsufficientMigrationFunds, + AlertNoSlots, + AlertUpdateToMigrate, +} from './alerts'; +import { StakingContractTag } from './StakingContractTag'; + +const { Text } = Typography; + +const { useToken } = theme; + +const CustomDivider = styled(Divider)` + flex: auto; + width: max-content; + min-width: 0; + margin: 0; +`; + +const ContractParameter = ({ + label, + value, +}: { + label: string; + value: string; +}) => ( + + {label} + + {value} + +); + +export const StakingContract = ({ + contract, +}: { + contract: IncentiveProgram; +}) => { + const { token } = useToken(); + const { totalOlasBalance, isBalanceLoaded } = useBalance(); + + const isDeprecated = contract.status === IncentiveProgramStatus.Deprecated; + const isSelected = contract.status === IncentiveProgramStatus.Selected; + + const isEnoughOlas = useMemo(() => { + if (totalOlasBalance === undefined) return false; + return totalOlasBalance > contract.requiredOlasForStaking; + }, [totalOlasBalance, contract.requiredOlasForStaking]); + const isAppVersionCompatible = true; // contract.appVersion === 'rc105'; + + const isMigratable = + !isDeprecated && + !isSelected && + isBalanceLoaded && + contract.isEnoughSlots && + isEnoughOlas && + isAppVersionCompatible; + + const cantMigrateAlert = useMemo(() => { + if (isDeprecated || isSelected || !isBalanceLoaded) { + return null; + } + + if (!contract.isEnoughSlots) { + return ; + } + + if (!isEnoughOlas) { + return ( + + ); + } + + if (!isAppVersionCompatible) { + return ; + } + }, [ + isDeprecated, + isSelected, + isBalanceLoaded, + totalOlasBalance, + contract.isEnoughSlots, + isEnoughOlas, + isAppVersionCompatible, + ]); + + return ( + + {/* Title */} + + {`${contract.name} contract`} + + {isMigratable && ( + + Contract details {UNICODE_SYMBOLS.EXTERNAL_LINK} + + )} + + {/* Contract details */} + + + {/* "Can't migrate" Alert */} + {cantMigrateAlert} + {/* Switch to program button */} + {!isSelected && ( + + )} + + ); +}; diff --git a/frontend/components/ManageStakingPage/WhatAreStakingContracts.tsx b/frontend/components/ManageStakingPage/WhatAreStakingContracts.tsx index 21826c604..f06f2ace5 100644 --- a/frontend/components/ManageStakingPage/WhatAreStakingContracts.tsx +++ b/frontend/components/ManageStakingPage/WhatAreStakingContracts.tsx @@ -2,35 +2,42 @@ import { Collapse, Flex, Typography } from 'antd'; import { CardSection } from '../styled/CardSection'; +const { Text } = Typography; + const collapseItems = [ { key: 1, - label: 'What are incentive programs?', + label: What are staking contracts?, children: ( - - + + When your agent goes to work, it participates in staking contracts. - - + + Staking contracts define what the agent needs to do, how much OLAS needs to be staked etc. - - + + Your agent can only participate in one staking contract at a time. - - + + You need to run your agent for max 1 hour a day, regardless of the staking contract. - + ), }, ]; -export const WhatAreIncentiveProgramsSection = () => { +export const WhatAreStakingContractsSection = () => { return ( - - + + ); }; diff --git a/frontend/components/ManageStakingPage/index.tsx b/frontend/components/ManageStakingPage/index.tsx index ef3fe0fbd..364def9cb 100644 --- a/frontend/components/ManageStakingPage/index.tsx +++ b/frontend/components/ManageStakingPage/index.tsx @@ -1,47 +1,40 @@ -import { CloseOutlined, SettingOutlined } from '@ant-design/icons'; -import { Button, Card, Flex } from 'antd'; +import { CloseOutlined } from '@ant-design/icons'; +import { Button, Card } from 'antd'; +import { IncentiveProgramStatus } from '@/enums/IcentiveProgram'; import { Pages } from '@/enums/PageState'; import { usePageState } from '@/hooks/usePageState'; import { IncentiveProgram } from '@/types/IncentiveProgram'; import { CardTitle } from '../Card/CardTitle'; -import { IncentiveProgramSection } from './IncentiveProgramSection'; -import { WhatAreIncentiveProgramsSection } from './WhatAreIncentivePrograms'; +import { StakingContract } from './StakingContract'; +import { WhatAreStakingContractsSection } from './WhatAreStakingContracts'; -const IncentivesTitle = () => { - return ( - - - Settings - - } - /> - ); -}; - -const mockIncentivePrograms: IncentiveProgram[] = [ +const mockStakingContracts: IncentiveProgram[] = [ { - name: 'Incentive Program 1', - rewardsPerWorkPeriod: 100, - requiredOlasForStaking: 1000, + name: 'Pearl Beta', + rewardsPerWorkPeriod: 0.14, + requiredOlasForStaking: 40, + isEnoughSlots: true, + status: IncentiveProgramStatus.New, contractAddress: '0x1234567890', }, { - name: 'Incentive Program 2', - rewardsPerWorkPeriod: 200, - requiredOlasForStaking: 2000, + name: 'Pearl Alpha', + rewardsPerWorkPeriod: 0.047, + requiredOlasForStaking: 20, + isEnoughSlots: true, + status: IncentiveProgramStatus.Selected, contractAddress: '0x0987654321', }, ]; -export const Incentives = () => { +export const ManageStakingPage = () => { const { goto } = usePageState(); return ( } + title={} + bordered={false} extra={ diff --git a/frontend/pages/index.tsx b/frontend/pages/index.tsx index 1ad8084b4..0977107e7 100644 --- a/frontend/pages/index.tsx +++ b/frontend/pages/index.tsx @@ -7,6 +7,7 @@ import { Setup } from '@/components/SetupPage'; import { Pages } from '@/enums/PageState'; import { useElectronApi } from '@/hooks/useElectronApi'; import { usePageState } from '@/hooks/usePageState'; +import { ManageStakingPage } from '@/components/ManageStakingPage'; const DEFAULT_APP_HEIGHT = 700; @@ -42,6 +43,8 @@ export default function Home() { return ; case Pages.HelpAndSupport: return ; + case Pages.ManageStaking: + return ; default: return
; } diff --git a/frontend/styles/globals.scss b/frontend/styles/globals.scss index 13afcf16c..8e4dda2e4 100644 --- a/frontend/styles/globals.scss +++ b/frontend/styles/globals.scss @@ -124,6 +124,10 @@ button, input, select, textarea, .ant-input-suffix { margin-bottom: 16px !important; } +.ml-auto { + margin-left: auto !important; +} + .mb-auto { margin-bottom: auto !important; } diff --git a/frontend/types/IncentiveProgram.ts b/frontend/types/IncentiveProgram.ts index 4c04a97fe..e3d4a6c7a 100644 --- a/frontend/types/IncentiveProgram.ts +++ b/frontend/types/IncentiveProgram.ts @@ -6,6 +6,7 @@ export type IncentiveProgram = { name: string; rewardsPerWorkPeriod: number; requiredOlasForStaking: number; + isEnoughSlots: boolean; status: IncentiveProgramStatus; contractAddress: Address; }; From bf4d19651fb2bfc776032778667deeb3d5e49091 Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Wed, 14 Aug 2024 18:16:16 +0200 Subject: [PATCH 064/134] fix: fund service --- operate/services/manage.py | 72 +++++++++++-------------------------- operate/services/service.py | 2 +- 2 files changed, 21 insertions(+), 53 deletions(-) diff --git a/operate/services/manage.py b/operate/services/manage.py index 57ed46c02..1deba892b 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -726,7 +726,6 @@ def _terminate_service_on_chain_from_safe(self, hash: str, chain_id: str) -> Non chain_config = service.chain_configs[chain_id] ledger_config = chain_config.ledger_config chain_data = chain_config.chain_data - user_params = chain_config.chain_data.user_params keys = service.keys instances = [key.address for key in keys] wallet = self.wallet_manager.load(ledger_config.type) @@ -927,6 +926,9 @@ def stake_service_on_chain_from_safe(self, hash: str, chain_id: str, target_stak chain_config.chain_data.staked = True service.store() + current_staking_program = self._get_current_staking_program(chain_data, ledger_config, sftxb) + self.logger.info(f"{current_staking_program=}") + def unstake_service_on_chain(self, hash: str) -> None: """ Unbond service on-chain @@ -1013,14 +1015,19 @@ def fund_service( # pylint: disable=too-many-arguments ) -> None: """Fund service if required.""" service = self.load_or_create(hash=hash) - wallet = self.wallet_manager.load(ledger_type=service.ledger_config.type) - ledger_api = wallet.ledger_api(chain_type=service.ledger_config.chain, rpc=rpc) + chain_id = service.home_chain_id + chain_config = service.chain_configs[chain_id] + ledger_config = chain_config.ledger_config + chain_data = chain_config.chain_data + wallet = self.wallet_manager.load(ledger_config.type) + ledger_api = wallet.ledger_api(chain_type=ledger_config.chain, rpc=ledger_config.rpc) agent_fund_threshold = ( agent_fund_threshold - or service.chain_data.user_params.fund_requirements.agent + or chain_data.user_params.fund_requirements.agent ) for key in service.keys: + print(key.address) agent_balance = ledger_api.get_balance(address=key.address) self.logger.info(f"Agent {key.address} balance: {agent_balance}") self.logger.info(f"Required balance: {agent_fund_threshold}") @@ -1028,34 +1035,34 @@ def fund_service( # pylint: disable=too-many-arguments self.logger.info("Funding agents") to_transfer = ( agent_topup - or service.chain_data.user_params.fund_requirements.agent + or chain_data.user_params.fund_requirements.agent ) self.logger.info(f"Transferring {to_transfer} units to {key.address}") wallet.transfer( to=key.address, amount=int(to_transfer), - chain_type=service.ledger_config.chain, + chain_type=ledger_config.chain, from_safe=from_safe, ) - safe_balanace = ledger_api.get_balance(service.chain_data.multisig) + safe_balanace = ledger_api.get_balance(chain_data.multisig) safe_fund_treshold = ( - safe_fund_treshold or service.chain_data.user_params.fund_requirements.safe + safe_fund_treshold or chain_data.user_params.fund_requirements.safe ) - self.logger.info(f"Safe {service.chain_data.multisig} balance: {safe_balanace}") + self.logger.info(f"Safe {chain_data.multisig} balance: {safe_balanace}") self.logger.info(f"Required balance: {safe_fund_treshold}") if safe_balanace < safe_fund_treshold: self.logger.info("Funding safe") to_transfer = ( - safe_topup or service.chain_data.user_params.fund_requirements.safe + safe_topup or chain_data.user_params.fund_requirements.safe ) self.logger.info( - f"Transferring {to_transfer} units to {service.chain_data.multisig}" + f"Transferring {to_transfer} units to {chain_data.multisig}" ) wallet.transfer( - to=t.cast(str, service.chain_data.multisig), + to=t.cast(str, chain_data.multisig), amount=int(to_transfer), - chain_type=service.ledger_config.chain, + chain_type=ledger_config.chain, ) async def funding_job( @@ -1128,45 +1135,6 @@ def update_service( old_service = self.load_or_create( hash=old_hash, ) - # TODO code for updating service commented until safe swap transaction is implemented - # This is a temporary fix that will only work for services that have not started the - # update flow. Services having started the update flow must need to manually change - # the Safe owner to the Operator. - # ( # noqa: E800 - # self.unstake_service_on_chain_from_safe # noqa: E800 - # if from_safe # noqa: E800 - # else self.unstake_service_on_chain # noqa: E800 - # )( # noqa: E800 - # hash=old_hash, # noqa: E800 - # ) # noqa: E800 - # ( # noqa: E800 - # self.terminate_service_on_chain_from_safe # noqa: E800 - # if from_safe # noqa: E800 - # else self.terminate_service_on_chain # noqa: E800 - # )( # noqa: E800 - # hash=old_hash, # noqa: E800 - # ) # noqa: E800 - # ( # noqa: E800 - # self.unbond_service_on_chain_from_safe # noqa: E800 - # if from_safe # noqa: E800 - # else self.unbond_service_on_chain # noqa: E800 - # )( # noqa: E800 - # hash=old_hash, # noqa: E800 - # ) # noqa: E800 - - # owner, *_ = old_service.chain_data.instances # noqa: E800 - # if from_safe: # noqa: E800 - - # else: # noqa: E800 - # ocm = self.get_on_chain_manager(service=old_service) # noqa: E800 - # ocm.swap( # noqa: E800 - # service_id=old_service.chain_data.token, # noqa: E800 - # multisig=old_service.chain_data.multisig, # noqa: E800 - # owner_key=str( - # self.keys_manager.get(key=owner).private_key - # ), # noqa: E800 - # ) # noqa: E800 - new_service = self.load_or_create( hash=new_hash, rpc=rpc or old_service.ledger_config.rpc, diff --git a/operate/services/service.py b/operate/services/service.py index e2a3d8947..df00153fd 100644 --- a/operate/services/service.py +++ b/operate/services/service.py @@ -636,7 +636,7 @@ class Service(LocalResource): version: int hash: str keys: Keys - home_chain_id: int + home_chain_id: str chain_configs: ChainConfigs path: Path From cf1fdd7fb6857789e2b52a63c1d2c3005b56d08c Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Wed, 14 Aug 2024 18:17:31 +0200 Subject: [PATCH 065/134] fix: funding_job --- operate/services/manage.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/operate/services/manage.py b/operate/services/manage.py index 1deba892b..2d1b2ff5a 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -1074,6 +1074,9 @@ async def funding_job( """Start a background funding job.""" loop = loop or asyncio.get_event_loop() service = self.load_or_create(hash=hash) + chain_id = service.home_chain_id + chain_config = service.chain_configs[chain_id] + ledger_config = chain_config.ledger_config with ThreadPoolExecutor() as executor: while True: try: @@ -1081,7 +1084,7 @@ async def funding_job( executor, self.fund_service, hash, # Service hash - PUBLIC_RPCS[service.ledger_config.chain], # RPC + PUBLIC_RPCS[ledger_config.chain], # RPC 100000000000000000, # agent_topup 2000000000000000000, # safe_topup 50000000000000000, # agent_fund_threshold From 352b07d2ddf09a59767b19e15d2bfcc2ceba3d5f Mon Sep 17 00:00:00 2001 From: Atatakai Date: Wed, 14 Aug 2024 20:19:29 +0400 Subject: [PATCH 066/134] feat: update showing contract details ling logic --- .../components/ManageStakingPage/StakingContract/index.tsx | 4 +++- frontend/pages/index.tsx | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/components/ManageStakingPage/StakingContract/index.tsx b/frontend/components/ManageStakingPage/StakingContract/index.tsx index 0153d4dba..639835220 100644 --- a/frontend/components/ManageStakingPage/StakingContract/index.tsx +++ b/frontend/components/ManageStakingPage/StakingContract/index.tsx @@ -107,7 +107,9 @@ export const StakingContract = ({ className="m-0" >{`${contract.name} contract`} - {isMigratable && ( + {!isSelected && ( + // here instead of isSelected we should check that the contract is not the old staking contract + // but the one from staking factory (if we want to open govern) Date: Wed, 14 Aug 2024 18:22:44 +0200 Subject: [PATCH 067/134] [no ci] chore: minor fixes --- operate/services/manage.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/operate/services/manage.py b/operate/services/manage.py index 2d1b2ff5a..8d970ee94 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -41,7 +41,6 @@ from operate.services.protocol import EthSafeTxBuilder, OnChainManager, StakingState from operate.services.service import ( ChainConfig, - ChainConfigs, DELETE_PREFIX, Deployment, NON_EXISTENT_TOKEN, @@ -1020,7 +1019,7 @@ def fund_service( # pylint: disable=too-many-arguments ledger_config = chain_config.ledger_config chain_data = chain_config.chain_data wallet = self.wallet_manager.load(ledger_config.type) - ledger_api = wallet.ledger_api(chain_type=ledger_config.chain, rpc=ledger_config.rpc) + ledger_api = wallet.ledger_api(chain_type=ledger_config.chain, rpc=rpc if rpc else ledger_config.rpc) agent_fund_threshold = ( agent_fund_threshold or chain_data.user_params.fund_requirements.agent From e5c7d489adc27344ed9fbca458dfa57fa53b1cfd Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Wed, 14 Aug 2024 18:49:07 +0200 Subject: [PATCH 068/134] fix: staking flow --- operate/services/manage.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/operate/services/manage.py b/operate/services/manage.py index 8d970ee94..235b0ce0a 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -29,7 +29,6 @@ from concurrent.futures import ThreadPoolExecutor from pathlib import Path -import aiohttp # type: ignore import requests from aea.helpers.base import IPFSHash from aea.helpers.logging import setup_logger @@ -209,7 +208,6 @@ def _get_on_chain_hash(self, chain_config: ChainConfig) -> t.Optional[str]: f"Something went wrong while trying to get the code uri from IPFS: {res}" ) - def deploy_service_onchain( # pylint: disable=too-many-statements self, hash: str, @@ -362,7 +360,6 @@ def deploy_service_onchain( # pylint: disable=too-many-statements ) service.store() - def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too-many-locals self, hash: str, @@ -867,17 +864,19 @@ def stake_service_on_chain_from_safe(self, hash: str, chain_id: str, target_stak if not chain_config.chain_data.user_params.use_staking and can_unstake: self.logger.info("Use staking is set to false, but service is staked and can be unstaked. Unstaking...") self.unstake_service_on_chain_from_safe(hash=hash, chain_id=chain_id, staking_program_id=current_staking_program) - return info = sftxb.info(token_id=chain_config.chain_data.token) chain_config.chain_data.on_chain_state = OnChainState(info["service_state"]) + staking_state = sftxb.staking_status( + service_id=chain_data.token, + staking_contract=current_staking_contract, + ) - if self._get_on_chain_state(chain_config=chain_config) == StakingState.EVICTED and can_unstake: + if staking_state == StakingState.EVICTED and can_unstake: self.logger.info(f"{chain_config.chain_data.token} has been evicted and can be unstaked. Unstaking...") self.unstake_service_on_chain_from_safe(hash=hash, chain_id=chain_id, staking_program_id=current_staking_program) - return - if self._get_on_chain_state(chain_config=chain_config) == StakingState.STAKED and can_unstake and not ocm.staking_rewards_available(current_staking_contract): + if staking_state == StakingState.STAKED and can_unstake and not sftxb.staking_rewards_available(current_staking_contract): self.logger.info( f"There are no rewards available, {chain_config.chain_data.token} " f"is already staked and can be unstaked. " @@ -885,24 +884,24 @@ def stake_service_on_chain_from_safe(self, hash: str, chain_id: str, target_stak ) self.unstake_service_on_chain_from_safe(hash=hash, chain_id=chain_id, staking_program_id=current_staking_program) - if self._get_on_chain_state(chain_config=chain_config) == StakingState.STAKED and current_staking_program != target_staking_contract and can_unstake: + if staking_state == StakingState.STAKED and current_staking_program != target_staking_contract and can_unstake: self.logger.info( f"{chain_config.chain_data.token} is already staked in a different staking program. " f"Unstaking..." ) self.unstake_service_on_chain_from_safe(hash=hash, chain_id=chain_id, staking_program_id=current_staking_program) - state = sftxb.staking_status( + staking_state = sftxb.staking_status( service_id=chain_config.chain_data.token, staking_contract=target_staking_contract, ) if ( chain_config.chain_data.user_params.use_staking - and state == StakingState.UNSTAKED + and staking_state == StakingState.UNSTAKED and sftxb.staking_rewards_available(target_staking_contract) and sftxb.staking_slots_available(target_staking_contract) - and chain_config.chain_data.on_chain_state == OnChainState.DEPLOYED + and self._get_on_chain_state(chain_config=chain_config) == OnChainState.DEPLOYED ): self.logger.info(f"Approving staking: {chain_config.chain_data.token}") sftxb.new_tx().add( @@ -1026,7 +1025,6 @@ def fund_service( # pylint: disable=too-many-arguments ) for key in service.keys: - print(key.address) agent_balance = ledger_api.get_balance(address=key.address) self.logger.info(f"Agent {key.address} balance: {agent_balance}") self.logger.info(f"Required balance: {agent_fund_threshold}") From c46c86f63f54f2e433dbc4ad5f9733ab390a1aff Mon Sep 17 00:00:00 2001 From: Ardian Date: Wed, 14 Aug 2024 18:58:25 +0200 Subject: [PATCH 069/134] feat: add first time deploy --- operate/services/protocol.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/operate/services/protocol.py b/operate/services/protocol.py index 1382924e7..948a1776f 100644 --- a/operate/services/protocol.py +++ b/operate/services/protocol.py @@ -1136,6 +1136,7 @@ def get_deploy_data_from_safe( ledger_api=self.ledger_api, contract_address=self.contracts["service_manager"], ) + approve_hash_message = None if reuse_multisig: _deployment_payload, approve_hash_message, error = get_reuse_multisig_from_safe_payload( ledger_api=self.ledger_api, @@ -1150,7 +1151,10 @@ def get_deploy_data_from_safe( GNOSIS_SAFE_SAME_ADDRESS_MULTISIG_CONTRACT.name ).contracts[self.chain_type] else: - raise NotImplementedError + deployment_payload = get_delployment_payload() + gnosis_safe_multisig = ContractConfigs.get( + GNOSIS_SAFE_PROXY_FACTORY_CONTRACT.name + ).contracts[self.chain_type] deploy_data = registry_instance.encodeABI( fn_name="deploy", @@ -1166,6 +1170,8 @@ def get_deploy_data_from_safe( "operation": MultiSendOperation.CALL, "value": 0, } + if approve_hash_message is None: + return [deploy_message] return [approve_hash_message, deploy_message] def get_terminate_data(self, service_id: int) -> t.Dict: From 5f1bfd943d62070531b6edf025bb6bcc8ab662bb Mon Sep 17 00:00:00 2001 From: Ardian Date: Wed, 14 Aug 2024 19:23:18 +0200 Subject: [PATCH 070/134] fix: allow single message --- operate/services/manage.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/operate/services/manage.py b/operate/services/manage.py index 235b0ce0a..4a92fa30a 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -667,12 +667,16 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to self.logger.info(f"{reuse_multisig=}") - approve_message, deploy_message = sftxb.get_deploy_data_from_safe( + messages = sftxb.get_deploy_data_from_safe( service_id=chain_data.token, reuse_multisig=reuse_multisig, master_safe=sftxb.wallet.safe, ) - sftxb.new_tx().add(approve_message).add(deploy_message).settle() + tx = sftxb.new_tx() + for message in messages: + tx.add(message) + tx.settle() + chain_data.on_chain_state = OnChainState.DEPLOYED service.store() From 4f406730e9122913d57f0d41f7e0ce56932884dc Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Thu, 15 Aug 2024 00:20:17 +0200 Subject: [PATCH 071/134] chore: minor fixes --- operate/services/manage.py | 39 +++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/operate/services/manage.py b/operate/services/manage.py index 4a92fa30a..7848baea7 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -364,6 +364,11 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too self, hash: str, ) -> None: + """ + Deploy as service on-chain + + :param hash: Service hash + """ service = self.load_or_create(hash=hash) for chain_id in service.chain_configs.keys(): self._deploy_service_onchain_from_safe( @@ -456,9 +461,14 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to and (on_chain_hash is not None) and (on_chain_hash != service.hash or current_agent_id != staking_params["agent_ids"][0]) ) + current_staking_program = self._get_current_staking_program(chain_data, ledger_config, sftxb) + self.logger.info(f"{current_staking_program=}") + self.logger.info(f"{user_params.staking_program_id=}") self.logger.info(f"{on_chain_hash=}") self.logger.info(f"{service.hash=}") + self.logger.info(f"{current_agent_id=}") + self.logger.info(f"{staking_params['agent_ids'][0]=}") self.logger.info(f"{is_first_mint=}") self.logger.info(f"{is_update=}") @@ -684,9 +694,9 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to info = sftxb.info(token_id=chain_data.token) chain_data.instances = info["instances"] chain_data.multisig = info["multisig"] - chain_data.staked = False chain_data.on_chain_state = OnChainState(info["service_state"]) service.store() + self.stake_service_on_chain_from_safe(hash=hash, chain_id=chain_id) def terminate_service_on_chain(self, hash: str) -> None: """ @@ -794,6 +804,9 @@ def _terminate_service_on_chain_from_safe(self, hash: str, chain_id: str) -> Non ) # noqa: E800 def _get_current_staking_program(self, chain_data, ledger_config, sftxb) -> t.Optional[str]: + if chain_data.token == NON_EXISTENT_TOKEN: + return None + current_staking_program = None for staking_program in STAKING[ledger_config.chain]: state = sftxb.staking_status( @@ -839,7 +852,7 @@ def stake_service_on_chain(self, hash: str, chain_id: int, staking_program_id: s """ raise NotImplementedError - def stake_service_on_chain_from_safe(self, hash: str, chain_id: str, target_staking_program_id: str) -> None: + def stake_service_on_chain_from_safe(self, hash: str, chain_id: str) -> None: """ Stake service on-chain @@ -850,8 +863,10 @@ def stake_service_on_chain_from_safe(self, hash: str, chain_id: str, target_stak service = self.load_or_create(hash=hash) chain_config = service.chain_configs[chain_id] ledger_config = chain_config.ledger_config - target_staking_contract = STAKING[ledger_config.chain][target_staking_program_id] chain_data = chain_config.chain_data + user_params = chain_data.user_params + target_staking_program_id = user_params.staking_program_id + target_staking_contract = STAKING[ledger_config.chain][target_staking_program_id] sftxb = self.get_eth_safe_tx_builder(ledger_config=ledger_config) # TODO fixme @@ -866,7 +881,7 @@ def stake_service_on_chain_from_safe(self, hash: str, chain_id: str, target_stak if is_staked: can_unstake = sftxb.can_unstake(chain_config.chain_data.token, current_staking_contract) if not chain_config.chain_data.user_params.use_staking and can_unstake: - self.logger.info("Use staking is set to false, but service is staked and can be unstaked. Unstaking...") + self.logger.info(f"Use staking is set to false, but service {chain_config.chain_data.token} is staked and can be unstaked. Unstaking...") self.unstake_service_on_chain_from_safe(hash=hash, chain_id=chain_id, staking_program_id=current_staking_program) info = sftxb.info(token_id=chain_config.chain_data.token) @@ -877,21 +892,19 @@ def stake_service_on_chain_from_safe(self, hash: str, chain_id: str, target_stak ) if staking_state == StakingState.EVICTED and can_unstake: - self.logger.info(f"{chain_config.chain_data.token} has been evicted and can be unstaked. Unstaking...") + self.logger.info(f"Service {chain_config.chain_data.token} has been evicted and can be unstaked. Unstaking...") self.unstake_service_on_chain_from_safe(hash=hash, chain_id=chain_id, staking_program_id=current_staking_program) if staking_state == StakingState.STAKED and can_unstake and not sftxb.staking_rewards_available(current_staking_contract): self.logger.info( - f"There are no rewards available, {chain_config.chain_data.token} " - f"is already staked and can be unstaked. " - f"Unstaking..." + f"There are no rewards available, service {chain_config.chain_data.token} " + f"is already staked and can be unstaked. Unstaking..." ) self.unstake_service_on_chain_from_safe(hash=hash, chain_id=chain_id, staking_program_id=current_staking_program) if staking_state == StakingState.STAKED and current_staking_program != target_staking_contract and can_unstake: self.logger.info( - f"{chain_config.chain_data.token} is already staked in a different staking program. " - f"Unstaking..." + f"{chain_config.chain_data.token} is staked in a different staking program. Unstaking..." ) self.unstake_service_on_chain_from_safe(hash=hash, chain_id=chain_id, staking_program_id=current_staking_program) @@ -1046,13 +1059,13 @@ def fund_service( # pylint: disable=too-many-arguments from_safe=from_safe, ) - safe_balanace = ledger_api.get_balance(chain_data.multisig) + safe_balance = ledger_api.get_balance(chain_data.multisig) safe_fund_treshold = ( safe_fund_treshold or chain_data.user_params.fund_requirements.safe ) - self.logger.info(f"Safe {chain_data.multisig} balance: {safe_balanace}") + self.logger.info(f"Safe {chain_data.multisig} balance: {safe_balance}") self.logger.info(f"Required balance: {safe_fund_treshold}") - if safe_balanace < safe_fund_treshold: + if safe_balance < safe_fund_treshold: self.logger.info("Funding safe") to_transfer = ( safe_topup or chain_data.user_params.fund_requirements.safe From 71d3d488394a0760dbb177d8bbecc7f2abf7deed Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Thu, 15 Aug 2024 01:18:57 +0200 Subject: [PATCH 072/134] chore: update --- operate/services/manage.py | 10 +++++++--- operate/services/protocol.py | 1 - operate/services/service.py | 2 -- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/operate/services/manage.py b/operate/services/manage.py index 7848baea7..04a2e942d 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -52,6 +52,7 @@ ServiceTemplate, LedgerConfig ) +from operate.utils.gnosis import NULL_ADDRESS from operate.wallet.master import MasterWalletManager @@ -70,7 +71,6 @@ HTTP_OK = 200 URI_HASH_POSITION = 7 IPFS_GATEWAY = "https://gateway.autonolas.tech/ipfs/" -ZERO_ADDRESS = "0x0000000000000000000000000000000000000000" class ServiceManager: @@ -428,6 +428,10 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to if user_params.use_staking: self.logger.info("Checking staking compatibility") + + # TODO: Missing check when the service is currently staked in a program, but needs to be staked + # in a different target program. The In this case, balance = currently staked balance + safe balance + if chain_data.on_chain_state in ( OnChainState.NON_EXISTENT, OnChainState.PRE_REGISTRATION, @@ -672,7 +676,7 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to reuse_multisig = True info = sftxb.info(token_id=chain_data.token) - if info["multisig"] == "0x0000000000000000000000000000000000000000": + if info["multisig"] == NULL_ADDRESS: reuse_multisig = False self.logger.info(f"{reuse_multisig=}") @@ -1148,7 +1152,7 @@ def update_service( ) -> Service: """Update a service.""" - self.logger.info("-----Entering update service on-chain-----") + self.logger.info("-----Entering update local service-----") old_service = self.load_or_create( hash=old_hash, ) diff --git a/operate/services/protocol.py b/operate/services/protocol.py index 948a1776f..a7b3135fc 100644 --- a/operate/services/protocol.py +++ b/operate/services/protocol.py @@ -68,7 +68,6 @@ from operate.utils.gnosis import ( MultiSendOperation, SafeOperation, - get_owners, hash_payload_to_hex, skill_input_hex_to_payload, NULL_ADDRESS, ) diff --git a/operate/services/service.py b/operate/services/service.py index df00153fd..5ecabf103 100644 --- a/operate/services/service.py +++ b/operate/services/service.py @@ -69,8 +69,6 @@ ChainConfig, ChainConfigs, ChainType, - ConfigurationTemplate, - ConfigurationTemplates, DeployedNodes, DeploymentConfig, DeploymentStatus, From 515b7c2c49ff5e43af4fe6fbdb70349b7fa4c613 Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Thu, 15 Aug 2024 01:50:33 +0200 Subject: [PATCH 073/134] chore: update --- operate/cli.py | 32 +++++++++----------------------- operate/services/manage.py | 20 ++++++++++---------- 2 files changed, 19 insertions(+), 33 deletions(-) diff --git a/operate/cli.py b/operate/cli.py index 66b3d135c..fb4baa05d 100644 --- a/operate/cli.py +++ b/operate/cli.py @@ -510,44 +510,29 @@ async def _create_services(request: Request) -> JSONResponse: old_hash = manager.json[0]["hash"] if old_hash == template["hash"]: logger.info(f'Loading service {template["hash"]}') - chain_configs = [ - services.manage.ChainConfig.from_json(item) - for item in template["chain_configs"] - ] service = manager.load_or_create( hash=template["hash"], - chain_configs=chain_configs, + service_template=template, ) else: logger.info(f"Updating service from {old_hash} to " + template["hash"]) service = manager.update_service( old_hash=old_hash, new_hash=template["hash"], - rpc=template["configuration"]["rpc"], - on_chain_user_params=services.manage.OnChainUserParams.from_json( - template["configuration"] - ), - from_safe=True, + service_template=template, ) - update = True else: logger.info(f'Creating service {template["hash"]}') - chain_configs = [ - services.manage.ChainConfig.from_json(item) - for item in template["chain_configs"] - ] service = manager.load_or_create( hash=template["hash"], - chain_configs=chain_configs, + service_template=template, ) if template.get("deploy", False): def _fn() -> None: - manager.deploy_service_onchain_from_safe( - hash=service.hash, update=update - ) - manager.stake_service_on_chain_from_safe(hash=service.hash) + manager.deploy_service_onchain_from_safe(hash=service.hash) + # manager.stake_service_on_chain_from_safe(hash=service.hash) # Done inside deploy_service_onchain manager.fund_service(hash=service.hash) manager.deploy_service_locally(hash=service.hash) @@ -572,8 +557,8 @@ async def _update_services(request: Request) -> JSONResponse: ) if template.get("deploy", False): manager = operate.service_manager() - manager.deploy_service_onchain_from_safe(hash=service.hash, update=True) - manager.stake_service_on_chain_from_safe(hash=service.hash) + manager.deploy_service_onchain_from_safe(hash=service.hash) + # manager.stake_service_on_chain_from_safe(hash=service.hash) # Done in deploy_service_onchain_from_safe manager.fund_service(hash=service.hash) manager.deploy_service_locally(hash=service.hash) schedule_funding_job(service=service.hash) @@ -597,6 +582,7 @@ async def _get_service(request: Request) -> JSONResponse: ) ) + # TODO this endpoint is possibly not used @app.post("/api/services/{service}/onchain/deploy") @with_retries async def _deploy_service_onchain(request: Request) -> JSONResponse: @@ -689,7 +675,7 @@ async def _start_service_locally(request: Request) -> JSONResponse: def _fn() -> None: manager.deploy_service_onchain(hash=service) - manager.stake_service_on_chain(hash=service) + # manager.stake_service_on_chain(hash=service) manager.fund_service(hash=service) manager.deploy_service_locally(hash=service, force=True) diff --git a/operate/services/manage.py b/operate/services/manage.py index 04a2e942d..f9bf676d9 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -402,6 +402,7 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to os.environ["CUSTOM_CHAIN_RPC"] = ledger_config.rpc os.environ["OPEN_AUTONOMY_SUBGRAPH_URL"] = "https://subgraph.autonolas.tech/subgraphs/name/autonolas-staging" + current_agent_id = None if chain_data.token > -1: self.logger.info("Syncing service state") info = sftxb.info(token_id=chain_data.token) @@ -1146,26 +1147,25 @@ def update_service( self, old_hash: str, new_hash: str, - rpc: t.Optional[str] = None, - on_chain_user_params: t.Optional[OnChainUserParams] = None, - from_safe: bool = True, # pylint: disable=unused-argument + service_template: t.Optional[ServiceTemplate] = None, ) -> Service: """Update a service.""" self.logger.info("-----Entering update local service-----") old_service = self.load_or_create( - hash=old_hash, + hash=old_hash ) new_service = self.load_or_create( hash=new_hash, - rpc=rpc or old_service.ledger_config.rpc, - on_chain_user_params=on_chain_user_params - or old_service.chain_data.user_params, + service_template=service_template ) new_service.keys = old_service.keys - new_service.chain_data = old_service.chain_data - new_service.ledger_config = old_service.ledger_config - new_service.chain_data.on_chain_state = OnChainState.NON_EXISTENT + # new_Service.home_chain_id = old_service.home_chain_id + + # FIXME New service must copy all chain_data from old service, + # but if service_template is not None, it must copy the user_params + # passed in the service_template. + new_service.chain_configs = old_service.chain_configs new_service.store() # The following logging has been added to identify OS issues when From 3b2ea44e73214f2517f65f1ef77ce51432aa533d Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Thu, 15 Aug 2024 02:14:53 +0200 Subject: [PATCH 074/134] chore: update --- operate/cli.py | 1 - operate/services/manage.py | 12 +++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/operate/cli.py b/operate/cli.py index fb4baa05d..86acd8031 100644 --- a/operate/cli.py +++ b/operate/cli.py @@ -505,7 +505,6 @@ async def _create_services(request: Request) -> JSONResponse: return USER_NOT_LOGGED_IN_ERROR template = await request.json() manager = operate.service_manager() - update = False if len(manager.json) > 0: old_hash = manager.json[0]["hash"] if old_hash == template["hash"]: diff --git a/operate/services/manage.py b/operate/services/manage.py index f9bf676d9..aa9081600 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -1162,10 +1162,16 @@ def update_service( new_service.keys = old_service.keys # new_Service.home_chain_id = old_service.home_chain_id - # FIXME New service must copy all chain_data from old service, + # TODO - Ensure this works as expected - New service must copy all chain_data from old service, # but if service_template is not None, it must copy the user_params - # passed in the service_template. - new_service.chain_configs = old_service.chain_configs + # passed in the service_template and copy the remaining attributes from old_service. + + new_service.chain_configs = {} + for chain_id, config in old_service.chain_configs.items(): + new_service.chain_configs[chain_id] = config + if service_template: + new_service.chain_configs[chain_id].chain_data.user_params = OnChainUserParams.from_json(service_template["configurations"][chain_id]) + new_service.store() # The following logging has been added to identify OS issues when From d2948670340b09f301c659c7d9a5ba75d2e61840 Mon Sep 17 00:00:00 2001 From: truemiller Date: Thu, 15 Aug 2024 17:54:07 +0100 Subject: [PATCH 075/134] refactor: remove minimumFunding property from GNOSIS chain constant --- frontend/constants/chains.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/constants/chains.ts b/frontend/constants/chains.ts index 5c944b011..d77784665 100644 --- a/frontend/constants/chains.ts +++ b/frontend/constants/chains.ts @@ -2,8 +2,7 @@ export const CHAINS: { [chain: string]: { currency: string; chainId: number; - minimumFunding: number; }; } = { - gnosis: { currency: 'XDAI', chainId: 100, minimumFunding: 1 }, + GNOSIS: { currency: 'XDAI', chainId: 100 }, }; From 02cd87f0a96a8346b7242d229b9cd96dcce2b3b5 Mon Sep 17 00:00:00 2001 From: truemiller Date: Thu, 15 Aug 2024 17:55:15 +0100 Subject: [PATCH 076/134] update types --- frontend/client/types.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/client/types.ts b/frontend/client/types.ts index a3613aa7d..ac244afd3 100644 --- a/frontend/client/types.ts +++ b/frontend/client/types.ts @@ -48,7 +48,8 @@ export type ConfigurationTemplate = { agent_id: number; threshold: number; use_staking: boolean; - cost_of_bond: number; + cost_of_bond: number; // TODO: REQUEST RESET TO NAMING CONVENTION, OLAS_COST_OF_BOND + olas_required_to_stake: number; // TODO: CLARIFY WHY THIS WAS REMOVED monthly_gas_estimate: number; fund_requirements: FundRequirementsTemplate; }; From 52e6346271dcf445204d8db9458cac4c2f59e670 Mon Sep 17 00:00:00 2001 From: truemiller Date: Thu, 15 Aug 2024 17:56:05 +0100 Subject: [PATCH 077/134] refactor: gnosis chain id and variable rename --- frontend/components/MainPage/header/constants.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/frontend/components/MainPage/header/constants.ts b/frontend/components/MainPage/header/constants.ts index 87083563d..a9e9a098a 100644 --- a/frontend/components/MainPage/header/constants.ts +++ b/frontend/components/MainPage/header/constants.ts @@ -1,20 +1,27 @@ import { formatUnits } from 'ethers/lib/utils'; +import { CHAINS } from '@/constants/chains'; import { SERVICE_TEMPLATES } from '@/constants/serviceTemplates'; // TODO: Move this to more appropriate location (root /constants) - const olasCostOfBond = Number( - formatUnits(`${SERVICE_TEMPLATES[0].configuration.olas_cost_of_bond}`, 18), + formatUnits( + `${SERVICE_TEMPLATES[0].configurations[CHAINS.GNOSIS.chainId].cost_of_bond}`, + 18, + ), ); + const olasRequiredToStake = Number( formatUnits( - `${SERVICE_TEMPLATES[0].configuration.olas_required_to_stake}`, + `${SERVICE_TEMPLATES[0].configurations[CHAINS.GNOSIS.chainId].olas_required_to_stake}`, 18, ), ); export const requiredOlas = olasCostOfBond + olasRequiredToStake; export const requiredGas = Number( - formatUnits(`${SERVICE_TEMPLATES[0].configuration.monthly_gas_estimate}`, 18), + formatUnits( + `${SERVICE_TEMPLATES[0].configurations[CHAINS.GNOSIS.chainId].monthly_gas_estimate}`, + 18, + ), ); From 9a26d8de22e78a9d1a45cfec71f506a38b217c69 Mon Sep 17 00:00:00 2001 From: truemiller Date: Thu, 15 Aug 2024 17:56:14 +0100 Subject: [PATCH 078/134] feat: update olas_required_to_stake in service templates --- frontend/constants/serviceTemplates.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/constants/serviceTemplates.ts b/frontend/constants/serviceTemplates.ts index 75219bcb9..32fb9b435 100644 --- a/frontend/constants/serviceTemplates.ts +++ b/frontend/constants/serviceTemplates.ts @@ -16,12 +16,13 @@ export const SERVICE_TEMPLATES: ServiceTemplate[] = [ threshold: 1, use_staking: true, cost_of_bond: 10000000000000000, + olas_required_to_stake: 10000000000000000000, monthly_gas_estimate: 10000000000000000000, fund_requirements: { agent: 100000000000000000, safe: 5000000000000000000, }, - } + }, }, }, ]; From 2428802fb5be649abcc34bb5e335ba9fb5e1aff1 Mon Sep 17 00:00:00 2001 From: truemiller Date: Thu, 15 Aug 2024 18:00:43 +0100 Subject: [PATCH 079/134] refactor: service template reference refactors --- .../MainPage/sections/NeedsFundsSection.tsx | 6 +++++- frontend/hooks/useServices.ts | 7 +++++-- frontend/utils/service.ts | 11 +++++++++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/frontend/components/MainPage/sections/NeedsFundsSection.tsx b/frontend/components/MainPage/sections/NeedsFundsSection.tsx index 480b533c9..0bfba6e60 100644 --- a/frontend/components/MainPage/sections/NeedsFundsSection.tsx +++ b/frontend/components/MainPage/sections/NeedsFundsSection.tsx @@ -2,6 +2,7 @@ import { Flex, Typography } from 'antd'; import { formatUnits } from 'ethers/lib/utils'; import { ReactNode, useEffect, useMemo } from 'react'; +import { CHAINS } from '@/constants/chains'; import { UNICODE_SYMBOLS } from '@/constants/symbols'; import { useBalance } from '@/hooks/useBalance'; import { useElectronApi } from '@/hooks/useElectronApi'; @@ -31,7 +32,10 @@ const useNeedsFunds = () => { const serviceFundRequirements = useMemo(() => { const monthlyGasEstimate = Number( - formatUnits(`${serviceTemplate.configuration.monthly_gas_estimate}`, 18), + formatUnits( + `${serviceTemplate.configurations[CHAINS.GNOSIS.chainId].monthly_gas_estimate}`, + 18, + ), ); const minimumStakedAmountRequired = diff --git a/frontend/hooks/useServices.ts b/frontend/hooks/useServices.ts index 2de306fcb..595dca84c 100644 --- a/frontend/hooks/useServices.ts +++ b/frontend/hooks/useServices.ts @@ -1,6 +1,7 @@ import { useContext } from 'react'; import { Service, ServiceHash, ServiceTemplate } from '@/client'; +import { CHAINS } from '@/constants/chains'; import { ServicesContext } from '@/context/ServicesProvider'; import MulticallService from '@/service/Multicall'; import { ServicesService } from '@/service/Services'; @@ -28,9 +29,11 @@ const checkServiceIsFunded = async ( Object.assign(acc, { [address]: instances.includes(address) ? balances[address] > - serviceTemplate.configuration.fund_requirements.agent + serviceTemplate.configurations[CHAINS.GNOSIS.chainId] + .fund_requirements.agent : balances[address] > - serviceTemplate.configuration.fund_requirements.safe, + serviceTemplate.configurations[CHAINS.GNOSIS.chainId] + .fund_requirements.safe, }), {}, ); diff --git a/frontend/utils/service.ts b/frontend/utils/service.ts index 160a9fee5..b03820ff2 100644 --- a/frontend/utils/service.ts +++ b/frontend/utils/service.ts @@ -1,15 +1,22 @@ import { formatUnits } from 'ethers/lib/utils'; import { ServiceTemplate } from '@/client'; +import { CHAINS } from '@/constants/chains'; export const getMinimumStakedAmountRequired = ( serviceTemplate: ServiceTemplate, ) => { const olasCostOfBond = Number( - formatUnits(`${serviceTemplate.configuration.olas_cost_of_bond}`, 18), + formatUnits( + `${serviceTemplate.configurations[CHAINS.GNOSIS.chainId].cost_of_bond}`, + 18, + ), ); const olasRequiredToStake = Number( - formatUnits(`${serviceTemplate.configuration.olas_required_to_stake}`, 18), + formatUnits( + `${serviceTemplate.configurations[CHAINS.GNOSIS.chainId].olas_required_to_stake}`, + 18, + ), ); return olasCostOfBond + olasRequiredToStake; From 316269ad192579cbecd94d801c41677b65e4b1b5 Mon Sep 17 00:00:00 2001 From: truemiller Date: Thu, 15 Aug 2024 19:18:43 +0100 Subject: [PATCH 080/134] refactor: staking program alert notification section --- frontend/components/MainPage/index.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/components/MainPage/index.tsx b/frontend/components/MainPage/index.tsx index 2c833cf7d..54fc9c57d 100644 --- a/frontend/components/MainPage/index.tsx +++ b/frontend/components/MainPage/index.tsx @@ -12,6 +12,7 @@ import { AddFundsSection } from './sections/AddFundsSection'; import { GasBalanceSection } from './sections/GasBalanceSection'; import { KeepAgentRunningSection } from './sections/KeepAgentRunningSection'; import { MainNeedsFunds } from './sections/NeedsFundsSection'; +import { NewStakingProgramAlertSection } from './sections/NewStakingProgramAlertSection'; import { MainOlasBalance } from './sections/OlasBalanceSection'; import { MainRewards } from './sections/RewardsSection'; @@ -49,6 +50,7 @@ export const Main = () => { style={{ borderTopColor: 'transparent' }} > + From 9df9871b8c65f8a8858a90d5fa421c0e018dfe6e Mon Sep 17 00:00:00 2001 From: truemiller Date: Thu, 15 Aug 2024 19:18:57 +0100 Subject: [PATCH 081/134] chore: delete unused --- .../sections/NewIncentiveAlertSection.tsx | 35 ------------------- 1 file changed, 35 deletions(-) delete mode 100644 frontend/components/MainPage/sections/NewIncentiveAlertSection.tsx diff --git a/frontend/components/MainPage/sections/NewIncentiveAlertSection.tsx b/frontend/components/MainPage/sections/NewIncentiveAlertSection.tsx deleted file mode 100644 index b99c4f1a6..000000000 --- a/frontend/components/MainPage/sections/NewIncentiveAlertSection.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { Button, Flex, Typography } from 'antd'; - -import { Pages } from '@/enums/PageState'; -import { usePageState } from '@/hooks/usePageState'; - -import { CustomAlert } from '../../Alert'; -import { CardSection } from '../../styled/CardSection'; - -const { Text } = Typography; - -export const NewIncentiveAlert = () => { - const { goto } = usePageState(); - - return ( - - - A new incentive program is available for your agent! - - - } - /> - - ); -}; From feda9749702c3703ec1669cffdbc3e0ed7136f6e Mon Sep 17 00:00:00 2001 From: truemiller Date: Thu, 15 Aug 2024 19:19:08 +0100 Subject: [PATCH 082/134] feat: new staking program alert section --- .../NewStakingProgramAlertSection.tsx | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 frontend/components/MainPage/sections/NewStakingProgramAlertSection.tsx diff --git a/frontend/components/MainPage/sections/NewStakingProgramAlertSection.tsx b/frontend/components/MainPage/sections/NewStakingProgramAlertSection.tsx new file mode 100644 index 000000000..bce9d0983 --- /dev/null +++ b/frontend/components/MainPage/sections/NewStakingProgramAlertSection.tsx @@ -0,0 +1,36 @@ +import { Button, Flex, Typography } from 'antd'; + +import { Pages } from '@/enums/PageState'; +import { usePageState } from '@/hooks/usePageState'; + +import { CustomAlert } from '../../Alert'; +import { CardSection } from '../../styled/CardSection'; + +const { Text } = Typography; + +export const NewStakingProgramAlertSection = () => { + const { goto } = usePageState(); + + return ( + + + A new staking contract is available for your agent! + + + } + /> + + ); +}; From 8e1a9c44624e35ad78159ef0d40f1fc3300b404f Mon Sep 17 00:00:00 2001 From: truemiller Date: Thu, 15 Aug 2024 19:19:25 +0100 Subject: [PATCH 083/134] feat: add staking programs enums and records --- frontend/constants/contractAddresses.ts | 8 ++++++-- frontend/enums/StakingPrograms.ts | 4 ++++ 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 frontend/enums/StakingPrograms.ts diff --git a/frontend/constants/contractAddresses.ts b/frontend/constants/contractAddresses.ts index 823e9710b..95d33c6fa 100644 --- a/frontend/constants/contractAddresses.ts +++ b/frontend/constants/contractAddresses.ts @@ -1,4 +1,5 @@ import { Chain } from '@/client'; +import { StakingProgram } from '@/enums/StakingPrograms'; import { Address } from '@/types/Address'; export const MULTICALL_CONTRACT_ADDRESS: Address = @@ -17,9 +18,12 @@ export const SERVICE_REGISTRY_TOKEN_UTILITY_CONTRACT_ADDRESS: Record< export const SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESS: Record< number, - Address + Record > = { - [Chain.GNOSIS]: '0xEE9F19b5DF06c7E8Bfc7B28745dcf944C504198A', + [Chain.GNOSIS]: { + [StakingProgram.Alpha]: '0xEE9F19b5DF06c7E8Bfc7B28745dcf944C504198A', + [StakingProgram.Beta]: '0xeF44Fb0842DDeF59D37f85D61A1eF492bbA6135d', + }, }; export const AGENT_MECH_CONTRACT_ADDRESS: Record = { diff --git a/frontend/enums/StakingPrograms.ts b/frontend/enums/StakingPrograms.ts new file mode 100644 index 000000000..c3d98cd42 --- /dev/null +++ b/frontend/enums/StakingPrograms.ts @@ -0,0 +1,4 @@ +export enum StakingProgram { + Alpha = 'pearl_alpha', + Beta = 'pearl_beta', +} From 305526dbe9fa39ba45b558f92d1d8a87ba0bd633 Mon Sep 17 00:00:00 2001 From: truemiller Date: Thu, 15 Aug 2024 19:26:58 +0100 Subject: [PATCH 084/134] refactor: remove and rename irrelevant mocking --- .../StakingContract/StakingContractTag.tsx | 10 ++++------ .../ManageStakingPage/StakingContract/index.tsx | 17 +++++------------ frontend/components/ManageStakingPage/index.tsx | 10 +++++----- frontend/constants/contractAddresses.ts | 2 +- frontend/enums/IcentiveProgram.ts | 5 ----- .../{StakingPrograms.ts => StakingProgram.ts} | 0 frontend/enums/StakingProgramStatus.ts | 4 ++++ frontend/hooks/useStakingProgram.ts | 8 ++++---- frontend/types/IncentiveProgram.ts | 12 ------------ frontend/types/StakingProgram.ts | 12 ++++++++++++ 10 files changed, 35 insertions(+), 45 deletions(-) delete mode 100644 frontend/enums/IcentiveProgram.ts rename frontend/enums/{StakingPrograms.ts => StakingProgram.ts} (100%) create mode 100644 frontend/enums/StakingProgramStatus.ts delete mode 100644 frontend/types/IncentiveProgram.ts create mode 100644 frontend/types/StakingProgram.ts diff --git a/frontend/components/ManageStakingPage/StakingContract/StakingContractTag.tsx b/frontend/components/ManageStakingPage/StakingContract/StakingContractTag.tsx index 9233845fa..857dd4f56 100644 --- a/frontend/components/ManageStakingPage/StakingContract/StakingContractTag.tsx +++ b/frontend/components/ManageStakingPage/StakingContract/StakingContractTag.tsx @@ -1,18 +1,16 @@ import { Tag } from 'antd'; -import { IncentiveProgramStatus } from '@/enums/IcentiveProgram'; +import { StakingProgramStatus } from '@/enums/StakingProgramStatus'; export const StakingContractTag = ({ status, }: { - status: IncentiveProgramStatus; + status: StakingProgramStatus; }) => { - if (status === IncentiveProgramStatus.New) { + if (status === StakingProgramStatus.New) { return New; - } else if (status === IncentiveProgramStatus.Selected) { + } else if (status === StakingProgramStatus.Selected) { return Selected; - } else if (status === IncentiveProgramStatus.Deprecated) { - return Deprecated; } return null; }; diff --git a/frontend/components/ManageStakingPage/StakingContract/index.tsx b/frontend/components/ManageStakingPage/StakingContract/index.tsx index 639835220..d7c2762d8 100644 --- a/frontend/components/ManageStakingPage/StakingContract/index.tsx +++ b/frontend/components/ManageStakingPage/StakingContract/index.tsx @@ -4,9 +4,9 @@ import styled from 'styled-components'; import { CardSection } from '@/components/styled/CardSection'; import { UNICODE_SYMBOLS } from '@/constants/symbols'; -import { IncentiveProgramStatus } from '@/enums/IcentiveProgram'; +import { StakingProgramStatus } from '@/enums/StakingProgramStatus'; import { useBalance } from '@/hooks/useBalance'; -import { IncentiveProgram } from '@/types/IncentiveProgram'; +import { StakingProgram } from '@/types/StakingProgram'; import { AlertInsufficientMigrationFunds, @@ -40,16 +40,11 @@ const ContractParameter = ({ ); -export const StakingContract = ({ - contract, -}: { - contract: IncentiveProgram; -}) => { +export const StakingContract = ({ contract }: { contract: StakingProgram }) => { const { token } = useToken(); const { totalOlasBalance, isBalanceLoaded } = useBalance(); - const isDeprecated = contract.status === IncentiveProgramStatus.Deprecated; - const isSelected = contract.status === IncentiveProgramStatus.Selected; + const isSelected = contract.status === StakingProgramStatus.Selected; const isEnoughOlas = useMemo(() => { if (totalOlasBalance === undefined) return false; @@ -58,7 +53,6 @@ export const StakingContract = ({ const isAppVersionCompatible = true; // contract.appVersion === 'rc105'; const isMigratable = - !isDeprecated && !isSelected && isBalanceLoaded && contract.isEnoughSlots && @@ -66,7 +60,7 @@ export const StakingContract = ({ isAppVersionCompatible; const cantMigrateAlert = useMemo(() => { - if (isDeprecated || isSelected || !isBalanceLoaded) { + if (isSelected || !isBalanceLoaded) { return null; } @@ -84,7 +78,6 @@ export const StakingContract = ({ return ; } }, [ - isDeprecated, isSelected, isBalanceLoaded, totalOlasBalance, diff --git a/frontend/components/ManageStakingPage/index.tsx b/frontend/components/ManageStakingPage/index.tsx index 364def9cb..9650564de 100644 --- a/frontend/components/ManageStakingPage/index.tsx +++ b/frontend/components/ManageStakingPage/index.tsx @@ -1,22 +1,22 @@ import { CloseOutlined } from '@ant-design/icons'; import { Button, Card } from 'antd'; -import { IncentiveProgramStatus } from '@/enums/IcentiveProgram'; import { Pages } from '@/enums/PageState'; +import { StakingProgramStatus } from '@/enums/StakingProgramStatus'; import { usePageState } from '@/hooks/usePageState'; -import { IncentiveProgram } from '@/types/IncentiveProgram'; +import { StakingProgram } from '@/types/StakingProgram'; import { CardTitle } from '../Card/CardTitle'; import { StakingContract } from './StakingContract'; import { WhatAreStakingContractsSection } from './WhatAreStakingContracts'; -const mockStakingContracts: IncentiveProgram[] = [ +const mockStakingContracts: StakingProgram[] = [ { name: 'Pearl Beta', rewardsPerWorkPeriod: 0.14, requiredOlasForStaking: 40, isEnoughSlots: true, - status: IncentiveProgramStatus.New, + status: StakingProgramStatus.New, contractAddress: '0x1234567890', }, { @@ -24,7 +24,7 @@ const mockStakingContracts: IncentiveProgram[] = [ rewardsPerWorkPeriod: 0.047, requiredOlasForStaking: 20, isEnoughSlots: true, - status: IncentiveProgramStatus.Selected, + status: StakingProgramStatus.Selected, contractAddress: '0x0987654321', }, ]; diff --git a/frontend/constants/contractAddresses.ts b/frontend/constants/contractAddresses.ts index 95d33c6fa..4969f5715 100644 --- a/frontend/constants/contractAddresses.ts +++ b/frontend/constants/contractAddresses.ts @@ -1,5 +1,5 @@ import { Chain } from '@/client'; -import { StakingProgram } from '@/enums/StakingPrograms'; +import { StakingProgram } from '@/enums/StakingProgram'; import { Address } from '@/types/Address'; export const MULTICALL_CONTRACT_ADDRESS: Address = diff --git a/frontend/enums/IcentiveProgram.ts b/frontend/enums/IcentiveProgram.ts deleted file mode 100644 index f0351765a..000000000 --- a/frontend/enums/IcentiveProgram.ts +++ /dev/null @@ -1,5 +0,0 @@ -export enum IncentiveProgramStatus { - New = 'new', - Selected = 'current', - Deprecated = 'deprecated', -} diff --git a/frontend/enums/StakingPrograms.ts b/frontend/enums/StakingProgram.ts similarity index 100% rename from frontend/enums/StakingPrograms.ts rename to frontend/enums/StakingProgram.ts diff --git a/frontend/enums/StakingProgramStatus.ts b/frontend/enums/StakingProgramStatus.ts new file mode 100644 index 000000000..d2789f1ef --- /dev/null +++ b/frontend/enums/StakingProgramStatus.ts @@ -0,0 +1,4 @@ +export enum StakingProgramStatus { + New = 'new', + Selected = 'current', +} diff --git a/frontend/hooks/useStakingProgram.ts b/frontend/hooks/useStakingProgram.ts index fc82e458f..eca089948 100644 --- a/frontend/hooks/useStakingProgram.ts +++ b/frontend/hooks/useStakingProgram.ts @@ -1,7 +1,7 @@ import { useState } from 'react'; -import { IncentiveProgramStatus } from '@/enums/IcentiveProgram'; -import { IncentiveProgram } from '@/types/IncentiveProgram'; +import { StakingProgramStatus } from '@/enums/StakingProgramStatus'; +import { StakingProgram } from '@/types/StakingProgram'; /** * Mock hook for staking program abstraction @@ -12,9 +12,9 @@ export const useStakingProgram = () => { // TODO: Calculate current staking program // from current staking contract address - const currentStakingProgram: IncentiveProgram = { + const currentStakingProgram: StakingProgram = { name: 'Pearl Alpha', - status: IncentiveProgramStatus.Selected, + status: StakingProgramStatus.Selected, contractAddress: '0x', rewardsPerWorkPeriod: 0.25, requiredOlasForStaking: 20, diff --git a/frontend/types/IncentiveProgram.ts b/frontend/types/IncentiveProgram.ts deleted file mode 100644 index e3d4a6c7a..000000000 --- a/frontend/types/IncentiveProgram.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { IncentiveProgramStatus } from '@/enums/IcentiveProgram'; - -import { Address } from './Address'; - -export type IncentiveProgram = { - name: string; - rewardsPerWorkPeriod: number; - requiredOlasForStaking: number; - isEnoughSlots: boolean; - status: IncentiveProgramStatus; - contractAddress: Address; -}; diff --git a/frontend/types/StakingProgram.ts b/frontend/types/StakingProgram.ts new file mode 100644 index 000000000..77d551d18 --- /dev/null +++ b/frontend/types/StakingProgram.ts @@ -0,0 +1,12 @@ +import { StakingProgramStatus } from '@/enums/StakingProgramStatus'; + +import { Address } from './Address'; + +export type StakingProgram = { + name: string; + rewardsPerWorkPeriod: number; + requiredOlasForStaking: number; + isEnoughSlots?: boolean; + status: StakingProgramStatus; + contractAddress: Address; +}; From 8174bc7f4956f56bed6766f601d3990a24e1089f Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 10:11:51 +0100 Subject: [PATCH 085/134] refactor: logging for electron store and IPC stuff --- electron/main.js | 28 ++++++++++++------------ electron/store.js | 54 +++++++++++++++++++++++++++++------------------ 2 files changed, 48 insertions(+), 34 deletions(-) diff --git a/electron/main.js b/electron/main.js index 5a01cae73..e60d56fd1 100644 --- a/electron/main.js +++ b/electron/main.js @@ -195,7 +195,7 @@ const HEIGHT = 700; /** * Creates the main window */ -const createMainWindow = () => { +const createMainWindow = async () => { const width = isDev ? 840 : APP_WIDTH; mainWindow = new BrowserWindow({ title: 'Pearl', @@ -216,12 +216,6 @@ const createMainWindow = () => { mainWindow.setMenuBarVisibility(true); - if (isDev) { - mainWindow.loadURL(`http://localhost:${appConfig.ports.dev.next}`); - } else { - mainWindow.loadURL(`http://localhost:${appConfig.ports.prod.next}`); - } - ipcMain.on('close-app', () => { mainWindow.close(); }); @@ -264,15 +258,23 @@ const createMainWindow = () => { event.preventDefault(); mainWindow.hide(); }); - - const storeInitialValues = { - environmentName: process.env.IS_STAGING ? 'staging' : '', - }; - setupStoreIpc(ipcMain, mainWindow, storeInitialValues); + + try { + logger.electron('Setting up store IPC'); + await setupStoreIpc(ipcMain, mainWindow); + } catch (e) { + logger.electron('Store IPC failed:', JSON.stringify(e)); + } if (isDev) { mainWindow.webContents.openDevTools(); } + + if (isDev) { + mainWindow.loadURL(`http://localhost:${appConfig.ports.dev.next}`); + } else { + mainWindow.loadURL(`http://localhost:${appConfig.ports.prod.next}`); + } }; async function launchDaemon() { @@ -494,7 +496,7 @@ ipcMain.on('check', async function (event, _argument) { } event.sender.send('response', 'Launching App'); - createMainWindow(); + await createMainWindow(); createTray(); splashWindow.destroy(); } catch (e) { diff --git a/electron/store.js b/electron/store.js index afbc7f62d..fc2f09d7e 100644 --- a/electron/store.js +++ b/electron/store.js @@ -1,24 +1,36 @@ +// @ts-check +const { logger } = require('./logger'); + // set schema to validate store data -const defaultSchema = { - environmentName: { type: 'string', default: '' }, - isInitialFunded: { type: 'boolean', default: false }, - firstStakingRewardAchieved: { type: 'boolean', default: false }, - firstRewardNotificationShown: { type: 'boolean', default: false }, - agentEvictionAlertShown: { type: 'boolean', default: false }, +const schema = { + isInitialFunded: { type: 'boolean', default: null }, // TODO: reconsider this default, can be problematic if user has already funded prior to implementation + firstStakingRewardAchieved: { type: 'boolean', default: null }, + firstRewardNotificationShown: { type: 'boolean', default: null }, + agentEvictionAlertShown: { type: 'boolean', default: null }, + + environmentName: { type: 'string', default: null }, + currentStakingProgram: { type: 'string', default: null }, }; -const setupStoreIpc = async (ipcChannel, mainWindow, storeInitialValues) => { - const Store = (await import('electron-store')).default; +/** + * Sets up the IPC communication and initializes the Electron store with default values and schema. + * @param {Electron.IpcMain} ipcMain - The IPC channel for communication. + * @param {Electron.BrowserWindow} mainWindow - The main Electron browser window. + * @returns {Promise} - A promise that resolves once the store is set up. + */ +const setupStoreIpc = async (ipcMain, mainWindow) => { + let Store; + try { + Store = await (import('electron-store').then((mod) => mod.default)); + } catch (error) { + logger.error(`Error importing electron-store: ${error}`); + } - // set default values for store - const schema = Object.assign({}, defaultSchema); - Object.keys(schema).forEach((key) => { - if (storeInitialValues[key] !== undefined) { - schema[key].default = storeInitialValues[key]; - } - }); + if (!Store) { + logger.error('electron-store not found'); + return; + } - /** @type import Store from 'electron-store' */ const store = new Store({ schema }); store.onDidAnyChange((data) => { @@ -27,11 +39,11 @@ const setupStoreIpc = async (ipcChannel, mainWindow, storeInitialValues) => { }); // exposed to electron browser window - ipcChannel.handle('store', () => store.store); - ipcChannel.handle('store-get', (_, key) => store.get(key)); - ipcChannel.handle('store-set', (_, key, value) => store.set(key, value)); - ipcChannel.handle('store-delete', (_, key) => store.delete(key)); - ipcChannel.handle('store-clear', (_) => store.clear()); + ipcMain.handle('store', () => store.store); + ipcMain.handle('store-get', (_, key) => store.get(key)); + ipcMain.handle('store-set', (_, key, value) => store.set(key, value)); + ipcMain.handle('store-delete', (_, key) => store.delete(key)); + ipcMain.handle('store-clear', (_) => store.clear()); }; module.exports = { setupStoreIpc }; From bea906132942f2d6a109723027ecbbe3dadcc3d1 Mon Sep 17 00:00:00 2001 From: Atatakai Date: Fri, 16 Aug 2024 14:02:42 +0300 Subject: [PATCH 086/134] fix: electron-store issue --- electron/store.js | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/electron/store.js b/electron/store.js index fc2f09d7e..b8c5c9093 100644 --- a/electron/store.js +++ b/electron/store.js @@ -1,15 +1,12 @@ -// @ts-check -const { logger } = require('./logger'); - // set schema to validate store data const schema = { - isInitialFunded: { type: 'boolean', default: null }, // TODO: reconsider this default, can be problematic if user has already funded prior to implementation - firstStakingRewardAchieved: { type: 'boolean', default: null }, - firstRewardNotificationShown: { type: 'boolean', default: null }, - agentEvictionAlertShown: { type: 'boolean', default: null }, + isInitialFunded: { type: 'boolean', default: false }, // TODO: reconsider this default, can be problematic if user has already funded prior to implementation + firstStakingRewardAchieved: { type: 'boolean', default: false }, + firstRewardNotificationShown: { type: 'boolean', default: false }, + agentEvictionAlertShown: { type: 'boolean', default: false }, - environmentName: { type: 'string', default: null }, - currentStakingProgram: { type: 'string', default: null }, + environmentName: { type: 'string', default: '' }, + currentStakingProgram: { type: 'string', default: '' }, }; /** @@ -19,17 +16,7 @@ const schema = { * @returns {Promise} - A promise that resolves once the store is set up. */ const setupStoreIpc = async (ipcMain, mainWindow) => { - let Store; - try { - Store = await (import('electron-store').then((mod) => mod.default)); - } catch (error) { - logger.error(`Error importing electron-store: ${error}`); - } - - if (!Store) { - logger.error('electron-store not found'); - return; - } + const Store = (await import("electron-store")).default; const store = new Store({ schema }); From 6cafa985c5126348885974fbca95dadd82dff9b1 Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 12:09:16 +0100 Subject: [PATCH 087/134] chore: add minStakingDeposit for n+1 calculation --- frontend/types/Autonolas.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/types/Autonolas.ts b/frontend/types/Autonolas.ts index f971ace82..3cd552d1c 100644 --- a/frontend/types/Autonolas.ts +++ b/frontend/types/Autonolas.ts @@ -20,4 +20,6 @@ export type StakingContractInfo = { serviceStakingStartTime: number; /** 0: not staked, 1: staked, 2: unstaked - current state of the service */ serviceStakingState: number; + /** OLAS cost of staking */ + minStakingDeposit: number; }; From 300d18e4f5653e5c320b401858c49bfd1440510c Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 12:09:51 +0100 Subject: [PATCH 088/134] refactor: multi staking program refactor to Autonolas service --- frontend/service/Autonolas.ts | 151 ++++++++++++++++++++++++++++------ 1 file changed, 125 insertions(+), 26 deletions(-) diff --git a/frontend/service/Autonolas.ts b/frontend/service/Autonolas.ts index 0598210e4..190fc6030 100644 --- a/frontend/service/Autonolas.ts +++ b/frontend/service/Autonolas.ts @@ -12,10 +12,11 @@ import { MECH_ACTIVITY_CHECKER_CONTRACT_ADDRESS, SERVICE_REGISTRY_L2_CONTRACT_ADDRESS, SERVICE_REGISTRY_TOKEN_UTILITY_CONTRACT_ADDRESS, - SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESS, + SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESSES, } from '@/constants/contractAddresses'; import { gnosisMulticallProvider } from '@/constants/providers'; import { ServiceRegistryL2ServiceState } from '@/enums/ServiceRegistryL2ServiceState'; +import { StakingProgram } from '@/enums/StakingProgram'; import { Address } from '@/types/Address'; import { StakingContractInfo, StakingRewardsInfo } from '@/types/Autonolas'; @@ -26,10 +27,27 @@ const agentMechContract = new MulticallContract( AGENT_MECH_ABI.filter((abi) => abi.type === 'function'), // weird bug in the package where their filter doesn't work.. ); -const serviceStakingTokenMechUsageContract = new MulticallContract( - SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESS[Chain.GNOSIS], - SERVICE_STAKING_TOKEN_MECH_USAGE_ABI.filter((abi) => abi.type === 'function'), // same as above -); +const serviceStakingTokenMechUsageContracts: Record< + StakingProgram, + MulticallContract +> = { + [StakingProgram.Alpha]: new MulticallContract( + SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESSES[Chain.GNOSIS][ + StakingProgram.Alpha + ], + SERVICE_STAKING_TOKEN_MECH_USAGE_ABI.filter( + (abi) => abi.type === 'function', + ), // same as above + ), + [StakingProgram.Beta]: new MulticallContract( + SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESSES[Chain.GNOSIS][ + StakingProgram.Beta + ], + SERVICE_STAKING_TOKEN_MECH_USAGE_ABI.filter( + (abi) => abi.type === 'function', + ), // same as above + ), +}; const serviceRegistryTokenUtilityContract = new MulticallContract( SERVICE_REGISTRY_TOKEN_UTILITY_CONTRACT_ADDRESS[Chain.GNOSIS], @@ -49,22 +67,28 @@ const mechActivityCheckerContract = new MulticallContract( const getAgentStakingRewardsInfo = async ({ agentMultisigAddress, serviceId, + stakingProgram, }: { agentMultisigAddress: Address; serviceId: number; + stakingProgram: StakingProgram; }): Promise => { if (!agentMultisigAddress) return; if (!serviceId) return; const contractCalls = [ agentMechContract.getRequestsCount(agentMultisigAddress), - serviceStakingTokenMechUsageContract.getServiceInfo(serviceId), - serviceStakingTokenMechUsageContract.livenessPeriod(), + serviceStakingTokenMechUsageContracts[stakingProgram].getServiceInfo( + serviceId, + ), + serviceStakingTokenMechUsageContracts[stakingProgram].livenessPeriod(), mechActivityCheckerContract.livenessRatio(), - serviceStakingTokenMechUsageContract.rewardsPerSecond(), - serviceStakingTokenMechUsageContract.calculateStakingReward(serviceId), - serviceStakingTokenMechUsageContract.minStakingDeposit(), - serviceStakingTokenMechUsageContract.tsCheckpoint(), + serviceStakingTokenMechUsageContracts[stakingProgram].rewardsPerSecond(), + serviceStakingTokenMechUsageContracts[ + stakingProgram + ].calculateStakingReward(serviceId), + serviceStakingTokenMechUsageContracts[stakingProgram].minStakingDeposit(), + serviceStakingTokenMechUsageContracts[stakingProgram].tsCheckpoint(), ]; await gnosisMulticallProvider.init(); @@ -136,11 +160,13 @@ const getAgentStakingRewardsInfo = async ({ } as StakingRewardsInfo; }; -const getAvailableRewardsForEpoch = async (): Promise => { +const getAvailableRewardsForEpoch = async ( + stakingProgram: StakingProgram, +): Promise => { const contractCalls = [ - serviceStakingTokenMechUsageContract.rewardsPerSecond(), - serviceStakingTokenMechUsageContract.livenessPeriod(), // epoch length - serviceStakingTokenMechUsageContract.tsCheckpoint(), // last checkpoint timestamp + serviceStakingTokenMechUsageContracts[stakingProgram].rewardsPerSecond(), + serviceStakingTokenMechUsageContracts[stakingProgram].livenessPeriod(), // epoch length + serviceStakingTokenMechUsageContracts[stakingProgram].tsCheckpoint(), // last checkpoint timestamp ]; await gnosisMulticallProvider.init(); @@ -157,21 +183,24 @@ const getAvailableRewardsForEpoch = async (): Promise => { ); }; -/** - * function to get the staking contract info - */ -const getStakingContractInfo = async ( +const getStakingContractInfoByServiceIdStakingProgram = async ( serviceId: number, + stakingProgram: StakingProgram, ): Promise => { if (!serviceId) return; const contractCalls = [ - serviceStakingTokenMechUsageContract.availableRewards(), - serviceStakingTokenMechUsageContract.maxNumServices(), - serviceStakingTokenMechUsageContract.getServiceIds(), - serviceStakingTokenMechUsageContract.minStakingDuration(), - serviceStakingTokenMechUsageContract.getServiceInfo(serviceId), - serviceStakingTokenMechUsageContract.getStakingState(serviceId), + serviceStakingTokenMechUsageContracts[stakingProgram].availableRewards(), + serviceStakingTokenMechUsageContracts[stakingProgram].maxNumServices(), + serviceStakingTokenMechUsageContracts[stakingProgram].getServiceIds(), + serviceStakingTokenMechUsageContracts[stakingProgram].minStakingDuration(), + serviceStakingTokenMechUsageContracts[stakingProgram].getServiceInfo( + serviceId, + ), + serviceStakingTokenMechUsageContracts[stakingProgram].getStakingState( + serviceId, + ), + serviceStakingTokenMechUsageContracts[stakingProgram].minStakingDeposit(), ]; await gnosisMulticallProvider.init(); @@ -184,6 +213,7 @@ const getStakingContractInfo = async ( minStakingDurationInBN, serviceInfo, serviceStakingState, + minStakingDeposit, ] = multicallResponse; const availableRewards = parseFloat( @@ -199,6 +229,44 @@ const getStakingContractInfo = async ( minimumStakingDuration: minStakingDurationInBN.toNumber(), serviceStakingStartTime: serviceInfo.tsStart.toNumber(), serviceStakingState, + minStakingDeposit: parseFloat(ethers.utils.formatEther(minStakingDeposit)), + }; +}; + +const getStakingContractInfoByStakingProgram = async ( + stakingProgram: StakingProgram, +) => { + const contractCalls = [ + serviceStakingTokenMechUsageContracts[stakingProgram].availableRewards(), + serviceStakingTokenMechUsageContracts[stakingProgram].maxNumServices(), + serviceStakingTokenMechUsageContracts[stakingProgram].getServiceIds(), + serviceStakingTokenMechUsageContracts[stakingProgram].minStakingDuration(), + serviceStakingTokenMechUsageContracts[stakingProgram].minStakingDeposit(), + ]; + + await gnosisMulticallProvider.init(); + + const multicallResponse = await gnosisMulticallProvider.all(contractCalls); + const [ + availableRewardsInBN, + maxNumServicesInBN, + getServiceIdsInBN, + minStakingDurationInBN, + minStakingDeposit, + ] = multicallResponse; + + const availableRewards = parseFloat( + ethers.utils.formatUnits(availableRewardsInBN, 18), + ); + const serviceIds = getServiceIdsInBN.map((id: BigNumber) => id.toNumber()); + const maxNumServices = maxNumServicesInBN.toNumber(); + + return { + availableRewards, + maxNumServices, + serviceIds, + minimumStakingDuration: minStakingDurationInBN.toNumber(), + minStakingDeposit: parseFloat(ethers.utils.formatEther(minStakingDeposit)), }; }; @@ -240,9 +308,40 @@ const getServiceRegistryInfo = async ( }; }; +const getCurrentStakingProgram = async ( + agentAddress: string, +): Promise => { + const contractCalls = [ + serviceStakingTokenMechUsageContracts[StakingProgram.Alpha].getStakingState( + agentAddress, + ), + serviceStakingTokenMechUsageContracts[StakingProgram.Beta].getStakingState( + agentAddress, + ), + ]; + + await gnosisMulticallProvider.init(); + + try { + const [isAlphaStaked, isBetaStaked] = + await gnosisMulticallProvider.all(contractCalls); + + // Alpha should take precedence, as it must be migrated from + return isAlphaStaked + ? StakingProgram.Alpha + : isBetaStaked + ? StakingProgram.Beta + : null; + } catch (error) { + return null; + } +}; + export const AutonolasService = { getAgentStakingRewardsInfo, getAvailableRewardsForEpoch, + getCurrentStakingProgram, getServiceRegistryInfo, - getStakingContractInfo, + getStakingContractInfoByServiceIdStakingProgram, + getStakingContractInfoByStakingProgram, }; From 623c6608b9e91549dead230b32edc92eb23a713a Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 12:10:06 +0100 Subject: [PATCH 089/134] refactor: plural addresses rename --- frontend/constants/contractAddresses.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/constants/contractAddresses.ts b/frontend/constants/contractAddresses.ts index 4969f5715..b62d32681 100644 --- a/frontend/constants/contractAddresses.ts +++ b/frontend/constants/contractAddresses.ts @@ -16,7 +16,7 @@ export const SERVICE_REGISTRY_TOKEN_UTILITY_CONTRACT_ADDRESS: Record< [Chain.GNOSIS]: '0xa45E64d13A30a51b91ae0eb182e88a40e9b18eD8', }; -export const SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESS: Record< +export const SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESSES: Record< number, Record > = { From 604923926f07fa99e3e3f2cdb68e65b5a3bcc2e0 Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 12:10:25 +0100 Subject: [PATCH 090/134] feat: show new staking program alert conditionally --- frontend/components/MainPage/index.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/frontend/components/MainPage/index.tsx b/frontend/components/MainPage/index.tsx index 54fc9c57d..33efe223d 100644 --- a/frontend/components/MainPage/index.tsx +++ b/frontend/components/MainPage/index.tsx @@ -3,9 +3,11 @@ import { Button, Card, Flex } from 'antd'; import { useEffect } from 'react'; import { Pages } from '@/enums/PageState'; +import { StakingProgram } from '@/enums/StakingProgram'; import { useBalance } from '@/hooks/useBalance'; import { usePageState } from '@/hooks/usePageState'; import { useServices } from '@/hooks/useServices'; +import { useStakingProgram } from '@/hooks/useStakingProgram'; import { MainHeader } from './header'; import { AddFundsSection } from './sections/AddFundsSection'; @@ -20,6 +22,7 @@ export const Main = () => { const { goto } = usePageState(); const { updateServicesState } = useServices(); const { updateBalances, isLoaded, setIsLoaded } = useBalance(); + const { currentStakingProgram } = useStakingProgram(); useEffect(() => { if (!isLoaded) { @@ -50,7 +53,9 @@ export const Main = () => { style={{ borderTopColor: 'transparent' }} > - + {currentStakingProgram === StakingProgram.Alpha && ( + + )} From 207c7ce0513cb9b4779fb03bb9dca20063d1af97 Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 12:10:49 +0100 Subject: [PATCH 091/134] refactor: replace mocked contracts data --- .../components/ManageStakingPage/index.tsx | 53 +++++++++++-------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/frontend/components/ManageStakingPage/index.tsx b/frontend/components/ManageStakingPage/index.tsx index 9650564de..45ed4f2d2 100644 --- a/frontend/components/ManageStakingPage/index.tsx +++ b/frontend/components/ManageStakingPage/index.tsx @@ -1,33 +1,34 @@ import { CloseOutlined } from '@ant-design/icons'; import { Button, Card } from 'antd'; +import { Chain } from '@/client'; +import { SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESSES } from '@/constants/contractAddresses'; import { Pages } from '@/enums/PageState'; -import { StakingProgramStatus } from '@/enums/StakingProgramStatus'; +import { StakingProgram } from '@/enums/StakingProgram'; import { usePageState } from '@/hooks/usePageState'; -import { StakingProgram } from '@/types/StakingProgram'; import { CardTitle } from '../Card/CardTitle'; -import { StakingContract } from './StakingContract'; +import { StakingContractSection } from './StakingContract'; import { WhatAreStakingContractsSection } from './WhatAreStakingContracts'; -const mockStakingContracts: StakingProgram[] = [ - { - name: 'Pearl Beta', - rewardsPerWorkPeriod: 0.14, - requiredOlasForStaking: 40, - isEnoughSlots: true, - status: StakingProgramStatus.New, - contractAddress: '0x1234567890', - }, - { - name: 'Pearl Alpha', - rewardsPerWorkPeriod: 0.047, - requiredOlasForStaking: 20, - isEnoughSlots: true, - status: StakingProgramStatus.Selected, - contractAddress: '0x0987654321', - }, -]; +// const mockStakingContracts: StakingProgram[] = [ +// { +// name: 'Pearl Beta', +// rewardsPerWorkPeriod: 0.14, +// requiredOlasForStaking: 40, +// isEnoughSlots: true, +// status: StakingProgramStatus.New, +// contractAddress: '0x1234567890', +// }, +// { +// name: 'Pearl Alpha', +// rewardsPerWorkPeriod: 0.047, +// requiredOlasForStaking: 20, +// isEnoughSlots: true, +// status: StakingProgramStatus.Selected, +// contractAddress: '0x0987654321', +// }, +// ]; export const ManageStakingPage = () => { const { goto } = usePageState(); @@ -44,8 +45,14 @@ export const ManageStakingPage = () => { } > - {mockStakingContracts.map((contract) => ( - + {Object.entries( + SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESSES[Chain.GNOSIS], + ).map(([stakingProgram, contractAddress]) => ( + ))} ); From 8bfbf49a159e3d49647b0a81a5b89c006356e48d Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 12:11:18 +0100 Subject: [PATCH 092/134] refactor: progress on staking contract sections, replacing mocked data --- .../StakingContract/index.tsx | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/frontend/components/ManageStakingPage/StakingContract/index.tsx b/frontend/components/ManageStakingPage/StakingContract/index.tsx index d7c2762d8..ba52137e5 100644 --- a/frontend/components/ManageStakingPage/StakingContract/index.tsx +++ b/frontend/components/ManageStakingPage/StakingContract/index.tsx @@ -4,9 +4,10 @@ import styled from 'styled-components'; import { CardSection } from '@/components/styled/CardSection'; import { UNICODE_SYMBOLS } from '@/constants/symbols'; -import { StakingProgramStatus } from '@/enums/StakingProgramStatus'; +import { StakingProgram } from '@/enums/StakingProgram'; import { useBalance } from '@/hooks/useBalance'; -import { StakingProgram } from '@/types/StakingProgram'; +import { useStakingProgram } from '@/hooks/useStakingProgram'; +import { Address } from '@/types/Address'; import { AlertInsufficientMigrationFunds, @@ -40,11 +41,22 @@ const ContractParameter = ({ ); -export const StakingContract = ({ contract }: { contract: StakingProgram }) => { +export const StakingContractSection = ({ + stakingProgram, + contractAddress, +}: { + stakingProgram: StakingProgram; + contractAddress: Address; +}) => { + const { currentStakingProgram } = useStakingProgram(); + const { token } = useToken(); const { totalOlasBalance, isBalanceLoaded } = useBalance(); - const isSelected = contract.status === StakingProgramStatus.Selected; + const isSelected = + currentStakingProgram && currentStakingProgram === stakingProgram; + + const stakingContractInfo = useMemo(() => {}, []); const isEnoughOlas = useMemo(() => { if (totalOlasBalance === undefined) return false; From 50d688bc0496472f21c6df19e1b89898615c28fd Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 12:11:54 +0100 Subject: [PATCH 093/134] refactor: use stakingContractMeta in staking contract sections --- .../SettingsPage/StakingContractSection.tsx | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/frontend/components/SettingsPage/StakingContractSection.tsx b/frontend/components/SettingsPage/StakingContractSection.tsx index 420288786..a762e3e20 100644 --- a/frontend/components/SettingsPage/StakingContractSection.tsx +++ b/frontend/components/SettingsPage/StakingContractSection.tsx @@ -1,5 +1,7 @@ import { Button, Flex, Typography } from 'antd'; +import { Chain } from '@/client'; +import { SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESSES } from '@/constants/contractAddresses'; import { UNICODE_SYMBOLS } from '@/constants/symbols'; import { Pages } from '@/enums/PageState'; import { usePageState } from '@/hooks/usePageState'; @@ -11,14 +13,24 @@ const { Text } = Typography; export const StakingContractSection = () => { const { goto } = usePageState(); - const { currentStakingProgram } = useStakingProgram(); + const { + currentStakingProgram, + currentStakingProgramMeta, + defaultStakingProgram, + } = useStakingProgram(); + + const stakingContractAddress = + SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESSES[Chain.GNOSIS][ + currentStakingProgram ?? defaultStakingProgram + ]; + return ( Staking contract - {currentStakingProgram.name} + {currentStakingProgramMeta.name} Contract details {UNICODE_SYMBOLS.EXTERNAL_LINK} From a4020b61e73b62d096c46f447cdf1f0fab1806cc Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 12:12:12 +0100 Subject: [PATCH 094/134] feat: add staking contract meta for hardcode textual data --- frontend/constants/stakingProgramMeta.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 frontend/constants/stakingProgramMeta.ts diff --git a/frontend/constants/stakingProgramMeta.ts b/frontend/constants/stakingProgramMeta.ts new file mode 100644 index 000000000..f060c3ab2 --- /dev/null +++ b/frontend/constants/stakingProgramMeta.ts @@ -0,0 +1,15 @@ +import { StakingProgram } from '@/enums/StakingProgram'; + +export const STAKING_PROGRAM_META: Record< + StakingProgram, + { + name: string; + } +> = { + [StakingProgram.Alpha]: { + name: 'Pearl Alpha', + }, + [StakingProgram.Beta]: { + name: 'Pearl Beta', + }, +}; From e8132a6490bf7e3d0113ac0ecb5b1aebf938b467 Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 12:12:37 +0100 Subject: [PATCH 095/134] refactor: multicontract support for rewards --- frontend/context/RewardProvider.tsx | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/frontend/context/RewardProvider.tsx b/frontend/context/RewardProvider.tsx index 0e67a002a..6a27c1d76 100644 --- a/frontend/context/RewardProvider.tsx +++ b/frontend/context/RewardProvider.tsx @@ -17,6 +17,7 @@ import { AutonolasService } from '@/service/Autonolas'; import { OnlineStatusContext } from './OnlineStatusProvider'; import { ServicesContext } from './ServicesProvider'; +import { StakingProgramContext } from './StakingProgramContext'; export const RewardContext = createContext<{ accruedServiceStakingRewards?: number; @@ -42,6 +43,9 @@ export const RewardProvider = ({ children }: PropsWithChildren) => { const service = useMemo(() => services?.[0], [services]); const { storeState } = useStore(); const electronApi = useElectronApi(); + const { currentStakingProgram, defaultStakingProgram } = useContext( + StakingProgramContext, + ); const [accruedServiceStakingRewards, setAccruedServiceStakingRewards] = useState(); @@ -68,14 +72,25 @@ export const RewardProvider = ({ children }: PropsWithChildren) => { const updateRewards = useCallback(async (): Promise => { let stakingRewardsInfoPromise; - if (service?.chain_data?.multisig && service?.chain_data?.token) { + + // only check for rewards if there's a currentStakingProgram active + if ( + currentStakingProgram && + service?.chain_data?.multisig && + service?.chain_data?.token + ) { stakingRewardsInfoPromise = AutonolasService.getAgentStakingRewardsInfo({ agentMultisigAddress: service?.chain_data?.multisig, serviceId: service?.chain_data?.token, + stakingProgram: currentStakingProgram, }); } - const epochRewardsPromise = AutonolasService.getAvailableRewardsForEpoch(); + // can fallback to default staking program if no current staking program is active + const epochRewardsPromise = AutonolasService.getAvailableRewardsForEpoch( + currentStakingProgram ?? defaultStakingProgram, + ); + const [stakingRewardsInfo, rewards] = await Promise.all([ stakingRewardsInfoPromise, epochRewardsPromise, @@ -86,7 +101,12 @@ export const RewardProvider = ({ children }: PropsWithChildren) => { stakingRewardsInfo?.accruedServiceStakingRewards, ); setAvailableRewardsForEpoch(rewards); - }, [service]); + }, [ + currentStakingProgram, + defaultStakingProgram, + service?.chain_data?.multisig, + service?.chain_data?.token, + ]); useEffect(() => { if (isEligibleForRewards && !storeState?.firstStakingRewardAchieved) { From 175c321b516af2d79d3cbe74a8dd9dd73e496f56 Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 12:13:06 +0100 Subject: [PATCH 096/134] feat: extend staking contract info provider with current staking program detection .etc --- .../context/StakingContractInfoProvider.tsx | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/frontend/context/StakingContractInfoProvider.tsx b/frontend/context/StakingContractInfoProvider.tsx index 20d56ac2f..2417c2c0f 100644 --- a/frontend/context/StakingContractInfoProvider.tsx +++ b/frontend/context/StakingContractInfoProvider.tsx @@ -9,10 +9,12 @@ import { import { useInterval } from 'usehooks-ts'; import { FIVE_SECONDS_INTERVAL } from '@/constants/intervals'; +import { StakingProgram } from '@/enums/StakingProgram'; import { AutonolasService } from '@/service/Autonolas'; import { StakingContractInfo } from '@/types/Autonolas'; import { ServicesContext } from './ServicesProvider'; +import { StakingProgramContext } from './StakingProgramContext'; type StakingContractInfoContextProps = { updateStakingContractInfo: () => Promise; @@ -29,27 +31,38 @@ export const StakingContractInfoProvider = ({ children, }: PropsWithChildren) => { const { services } = useContext(ServicesContext); + const { currentStakingProgram } = useContext(StakingProgramContext); + + const [stakingContractInfoRecord, setStakingContractInfoRecord] = + useState>(); + const serviceId = useMemo(() => services?.[0]?.chain_data?.token, [services]); - const [stakingContractInfo, setStakingContractInfo] = + const [currentStakingContractInfo, setStakingContractInfo] = useState(); - const updateStakingContractInfo = useCallback(async () => { + // CURRENT staking contract info should be updated on interval + const updateCurrentStakingContractInfo = useCallback(async () => { if (!serviceId) return; - const info = await AutonolasService.getStakingContractInfo(serviceId); + if (!currentStakingProgram) return; + const info = + await AutonolasService.getStakingContractInfoByServiceIdStakingProgram( + serviceId, + currentStakingProgram, + ); if (!info) return; setStakingContractInfo(info); - }, [serviceId]); + }, [currentStakingProgram, serviceId]); - useInterval(updateStakingContractInfo, FIVE_SECONDS_INTERVAL); + useInterval(updateCurrentStakingContractInfo, FIVE_SECONDS_INTERVAL); return ( {children} From 5bdb80f154ee85d901fe5a924883cf8122b76a51 Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 12:13:32 +0100 Subject: [PATCH 097/134] feat: add context for staking program data; current, default, and update methods --- frontend/context/StakingProgramContext.tsx | 52 ++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 frontend/context/StakingProgramContext.tsx diff --git a/frontend/context/StakingProgramContext.tsx b/frontend/context/StakingProgramContext.tsx new file mode 100644 index 000000000..93c3c721a --- /dev/null +++ b/frontend/context/StakingProgramContext.tsx @@ -0,0 +1,52 @@ +import { createContext, PropsWithChildren, useCallback, useState } from 'react'; + +import { StakingProgram } from '@/enums/StakingProgram'; +import { useServices } from '@/hooks/useServices'; +import { AutonolasService } from '@/service/Autonolas'; + +export const StakingProgramContext = createContext<{ + currentStakingProgram?: StakingProgram | null; + defaultStakingProgram: StakingProgram; + updateStakingProgram: () => Promise; +}>({ + currentStakingProgram: undefined, + defaultStakingProgram: StakingProgram.Beta, + updateStakingProgram: async () => {}, +}); + +/** Determines the current active staking program, if any */ +export const StakingProgramProvider = ({ children }: PropsWithChildren) => { + const { service } = useServices(); + + const [currentStakingProgram, setCurrentStakingProgram] = + useState(); + + const updateStakingProgram = useCallback(async () => { + // if no service / instance is available, we don't need to check for staking program + if (!service?.chain_data?.instances?.[0]) { + setCurrentStakingProgram(null); + return; + } + + // TODO: check if assuming the first service is the correct approach + const operatorAddress = service?.chain_data?.instances?.[0]; + if (operatorAddress) { + // if service exists, we need to check if it is staked + AutonolasService.getCurrentStakingProgram(operatorAddress).then( + setCurrentStakingProgram, + ); + } + }, [service]); + + return ( + + {children} + + ); +}; From 154aa72fd1711862c06a51429709608f0182b713 Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 12:13:47 +0100 Subject: [PATCH 098/134] feat: hook for staking program context --- frontend/hooks/useStakingProgram.ts | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/frontend/hooks/useStakingProgram.ts b/frontend/hooks/useStakingProgram.ts index eca089948..75f3914f8 100644 --- a/frontend/hooks/useStakingProgram.ts +++ b/frontend/hooks/useStakingProgram.ts @@ -1,24 +1,21 @@ -import { useState } from 'react'; +import { useContext, useState } from 'react'; -import { StakingProgramStatus } from '@/enums/StakingProgramStatus'; -import { StakingProgram } from '@/types/StakingProgram'; +import { STAKING_PROGRAM_META } from '@/constants/stakingProgramMeta'; +import { StakingProgramContext } from '@/context/StakingProgramContext'; /** * Mock hook for staking program abstraction * @returns {currentStakingProgram: IncentiveProgram} */ export const useStakingProgram = () => { + const { currentStakingProgram, defaultStakingProgram } = useContext( + StakingProgramContext, + ); + const [isMigrating, setIsMigrating] = useState(false); - // TODO: Calculate current staking program - // from current staking contract address - const currentStakingProgram: StakingProgram = { - name: 'Pearl Alpha', - status: StakingProgramStatus.Selected, - contractAddress: '0x', - rewardsPerWorkPeriod: 0.25, - requiredOlasForStaking: 20, - }; + const currentStakingProgramMeta = + STAKING_PROGRAM_META[currentStakingProgram ?? defaultStakingProgram]; // TODO: Implement migration logic const migrate = async () => { @@ -30,6 +27,8 @@ export const useStakingProgram = () => { return { currentStakingProgram, + currentStakingProgramMeta, + defaultStakingProgram, isMigrating, migrate, }; From 04c4f02f7cdf67b0daed7f89826b6c2d9b7febbb Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 12:14:09 +0100 Subject: [PATCH 099/134] feat: staking program provider in _app --- frontend/pages/_app.tsx | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/frontend/pages/_app.tsx b/frontend/pages/_app.tsx index 68727cf8c..94e588e6d 100644 --- a/frontend/pages/_app.tsx +++ b/frontend/pages/_app.tsx @@ -15,6 +15,7 @@ import { ServicesProvider } from '@/context/ServicesProvider'; import { SettingsProvider } from '@/context/SettingsProvider'; import { SetupProvider } from '@/context/SetupProvider'; import { StakingContractInfoProvider } from '@/context/StakingContractInfoProvider'; +import { StakingProgramProvider } from '@/context/StakingProgramContext'; import { StoreProvider } from '@/context/StoreProvider'; import { WalletProvider } from '@/context/WalletProvider'; import { mainTheme } from '@/theme'; @@ -37,15 +38,17 @@ export default function App({ Component, pageProps }: AppProps) { - - - {isMounted ? ( - - - - ) : null} - - + + + + {isMounted ? ( + + + + ) : null} + + + From 65d1dc7bdc0542f540a46ce5ca9332b56ffc7655 Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 13:12:23 +0100 Subject: [PATCH 100/134] feat: staking program hooks and context --- .../context/StakingContractInfoProvider.tsx | 74 +++++++++++++------ frontend/context/StakingProgramContext.tsx | 8 +- frontend/hooks/useStakingContractInfo.ts | 11 ++- frontend/hooks/useStakingProgram.ts | 10 +-- 4 files changed, 68 insertions(+), 35 deletions(-) diff --git a/frontend/context/StakingContractInfoProvider.tsx b/frontend/context/StakingContractInfoProvider.tsx index 2417c2c0f..10ba73ede 100644 --- a/frontend/context/StakingContractInfoProvider.tsx +++ b/frontend/context/StakingContractInfoProvider.tsx @@ -3,6 +3,7 @@ import { PropsWithChildren, useCallback, useContext, + useEffect, useMemo, useState, } from 'react'; @@ -17,52 +18,79 @@ import { ServicesContext } from './ServicesProvider'; import { StakingProgramContext } from './StakingProgramContext'; type StakingContractInfoContextProps = { - updateStakingContractInfo: () => Promise; - stakingContractInfo?: StakingContractInfo; + updateActiveStakingContractInfo: () => Promise; + activeStakingContractInfo?: StakingContractInfo; + stakingContractInfoRecord?: Record< + StakingProgram, + Partial + >; }; export const StakingContractInfoContext = createContext({ - updateStakingContractInfo: async () => {}, - stakingContractInfo: undefined, + updateActiveStakingContractInfo: async () => {}, + activeStakingContractInfo: undefined, + stakingContractInfoRecord: undefined, }); export const StakingContractInfoProvider = ({ children, }: PropsWithChildren) => { const { services } = useContext(ServicesContext); - const { currentStakingProgram } = useContext(StakingProgramContext); + const { activeStakingProgram } = useContext(StakingProgramContext); + + const [activeStakingContractInfo, setActiveStakingContractInfo] = + useState(); const [stakingContractInfoRecord, setStakingContractInfoRecord] = - useState>(); + useState>>(); const serviceId = useMemo(() => services?.[0]?.chain_data?.token, [services]); - const [currentStakingContractInfo, setStakingContractInfo] = - useState(); - - // CURRENT staking contract info should be updated on interval - const updateCurrentStakingContractInfo = useCallback(async () => { + // ACTIVE staking contract info should be updated on interval + // it requires serviceId and activeStakingProgram + const updateActiveStakingContractInfo = useCallback(async () => { if (!serviceId) return; + if (!activeStakingProgram) return; + + AutonolasService.getStakingContractInfoByServiceIdStakingProgram( + serviceId, + activeStakingProgram, + ).then(setActiveStakingContractInfo); + }, [activeStakingProgram, serviceId]); + + useInterval(updateActiveStakingContractInfo, FIVE_SECONDS_INTERVAL); - if (!currentStakingProgram) return; - const info = - await AutonolasService.getStakingContractInfoByServiceIdStakingProgram( - serviceId, - currentStakingProgram, - ); - if (!info) return; + // Record of staking contract info for each staking program + // not user/service specific + const updateStakingContractInfoRecord = () => { + const alpha = AutonolasService.getStakingContractInfoByStakingProgram( + StakingProgram.Alpha, + ); + const beta = AutonolasService.getStakingContractInfoByStakingProgram( + StakingProgram.Beta, + ); - setStakingContractInfo(info); - }, [currentStakingProgram, serviceId]); + Promise.all([alpha, beta]).then((values) => { + const [alphaInfo, betaInfo] = values; + setStakingContractInfoRecord({ + [StakingProgram.Alpha]: alphaInfo, + [StakingProgram.Beta]: betaInfo, + }); + }); + }; - useInterval(updateCurrentStakingContractInfo, FIVE_SECONDS_INTERVAL); + useEffect(() => { + // Load staking contract info record on mount + updateStakingContractInfoRecord(); + }, []); return ( {children} diff --git a/frontend/context/StakingProgramContext.tsx b/frontend/context/StakingProgramContext.tsx index 93c3c721a..386c20b5d 100644 --- a/frontend/context/StakingProgramContext.tsx +++ b/frontend/context/StakingProgramContext.tsx @@ -5,11 +5,11 @@ import { useServices } from '@/hooks/useServices'; import { AutonolasService } from '@/service/Autonolas'; export const StakingProgramContext = createContext<{ - currentStakingProgram?: StakingProgram | null; + activeStakingProgram?: StakingProgram | null; defaultStakingProgram: StakingProgram; updateStakingProgram: () => Promise; }>({ - currentStakingProgram: undefined, + activeStakingProgram: undefined, defaultStakingProgram: StakingProgram.Beta, updateStakingProgram: async () => {}, }); @@ -18,7 +18,7 @@ export const StakingProgramContext = createContext<{ export const StakingProgramProvider = ({ children }: PropsWithChildren) => { const { service } = useServices(); - const [currentStakingProgram, setCurrentStakingProgram] = + const [activeStakingProgram, setCurrentStakingProgram] = useState(); const updateStakingProgram = useCallback(async () => { @@ -41,7 +41,7 @@ export const StakingProgramProvider = ({ children }: PropsWithChildren) => { return ( { - const { stakingContractInfo } = useContext(StakingContractInfoContext); + const { activeStakingContractInfo, stakingContractInfoRecord } = useContext( + StakingContractInfoContext, + ); + const { services } = useServices(); - if (!services?.[0] || !stakingContractInfo) return {}; + if (!services?.[0] || !activeStakingContractInfo) + return { stakingContractInfoRecord }; const { serviceStakingState, @@ -17,7 +21,7 @@ export const useStakingContractInfo = () => { serviceIds, maxNumServices, minimumStakingDuration, - } = stakingContractInfo; + } = activeStakingContractInfo; const isRewardsAvailable = availableRewards > 0; const hasEnoughServiceSlots = serviceIds.length < maxNumServices; @@ -55,5 +59,6 @@ export const useStakingContractInfo = () => { isEligibleForStaking, isRewardsAvailable, isAgentEvicted, + stakingContractInfoRecord, }; }; diff --git a/frontend/hooks/useStakingProgram.ts b/frontend/hooks/useStakingProgram.ts index 75f3914f8..af04920ed 100644 --- a/frontend/hooks/useStakingProgram.ts +++ b/frontend/hooks/useStakingProgram.ts @@ -8,14 +8,14 @@ import { StakingProgramContext } from '@/context/StakingProgramContext'; * @returns {currentStakingProgram: IncentiveProgram} */ export const useStakingProgram = () => { - const { currentStakingProgram, defaultStakingProgram } = useContext( + const { activeStakingProgram, defaultStakingProgram } = useContext( StakingProgramContext, ); const [isMigrating, setIsMigrating] = useState(false); - const currentStakingProgramMeta = - STAKING_PROGRAM_META[currentStakingProgram ?? defaultStakingProgram]; + const activeStakingProgramMeta = + STAKING_PROGRAM_META[activeStakingProgram ?? defaultStakingProgram]; // TODO: Implement migration logic const migrate = async () => { @@ -26,8 +26,8 @@ export const useStakingProgram = () => { }; return { - currentStakingProgram, - currentStakingProgramMeta, + activeStakingProgram, + activeStakingProgramMeta, defaultStakingProgram, isMigrating, migrate, From 99365e80d3974b22646fe1dc59896b8f2b1669ce Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 13:12:37 +0100 Subject: [PATCH 101/134] refactor: main page conditions and modals --- frontend/components/MainPage/index.tsx | 2 +- .../components/MainPage/modals/MigrationModal.tsx | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/frontend/components/MainPage/index.tsx b/frontend/components/MainPage/index.tsx index 33efe223d..f97acf159 100644 --- a/frontend/components/MainPage/index.tsx +++ b/frontend/components/MainPage/index.tsx @@ -22,7 +22,7 @@ export const Main = () => { const { goto } = usePageState(); const { updateServicesState } = useServices(); const { updateBalances, isLoaded, setIsLoaded } = useBalance(); - const { currentStakingProgram } = useStakingProgram(); + const { activeStakingProgram: currentStakingProgram } = useStakingProgram(); useEffect(() => { if (!isLoaded) { diff --git a/frontend/components/MainPage/modals/MigrationModal.tsx b/frontend/components/MainPage/modals/MigrationModal.tsx index 2b7afe6c8..30b3b2e08 100644 --- a/frontend/components/MainPage/modals/MigrationModal.tsx +++ b/frontend/components/MainPage/modals/MigrationModal.tsx @@ -1,6 +1,7 @@ import { Button, Flex, Modal, Typography } from 'antd'; import Image from 'next/image'; +import { STAKING_PROGRAM_META } from '@/constants/stakingProgramMeta'; import { UNICODE_SYMBOLS } from '@/constants/symbols'; import { useStakingProgram } from '@/hooks/useStakingProgram'; @@ -11,7 +12,15 @@ export const MigrationSuccessModal = ({ open: boolean; onClose: () => void; }) => { - const { currentStakingProgram } = useStakingProgram(); + const { activeStakingProgram } = useStakingProgram(); + + // Close modal if no active staking program, migration doesn't apply to non-stakers + if (!activeStakingProgram) { + onClose(); + return null; + } + + const activeStakingProgramMeta = STAKING_PROGRAM_META[activeStakingProgram]; return ( - Your agent is now staked on {currentStakingProgram.name}. + Your agent is now staked on {activeStakingProgramMeta.name}. {/* TODO: Add relevant block explorer domain */} From 5de93a4e208292c09adb3d65b6bbdd5d2585a85b Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 13:12:56 +0100 Subject: [PATCH 102/134] refactor: staking contract section --- .../StakingContract/StakingContractTag.tsx | 2 +- .../StakingContract/index.tsx | 79 ++++++++++++------- 2 files changed, 52 insertions(+), 29 deletions(-) diff --git a/frontend/components/ManageStakingPage/StakingContract/StakingContractTag.tsx b/frontend/components/ManageStakingPage/StakingContract/StakingContractTag.tsx index 857dd4f56..b09c11a05 100644 --- a/frontend/components/ManageStakingPage/StakingContract/StakingContractTag.tsx +++ b/frontend/components/ManageStakingPage/StakingContract/StakingContractTag.tsx @@ -5,7 +5,7 @@ import { StakingProgramStatus } from '@/enums/StakingProgramStatus'; export const StakingContractTag = ({ status, }: { - status: StakingProgramStatus; + status?: StakingProgramStatus; }) => { if (status === StakingProgramStatus.New) { return New; diff --git a/frontend/components/ManageStakingPage/StakingContract/index.tsx b/frontend/components/ManageStakingPage/StakingContract/index.tsx index ba52137e5..230ba6689 100644 --- a/frontend/components/ManageStakingPage/StakingContract/index.tsx +++ b/frontend/components/ManageStakingPage/StakingContract/index.tsx @@ -3,9 +3,11 @@ import { useMemo } from 'react'; import styled from 'styled-components'; import { CardSection } from '@/components/styled/CardSection'; +import { STAKING_PROGRAM_META } from '@/constants/stakingProgramMeta'; import { UNICODE_SYMBOLS } from '@/constants/symbols'; import { StakingProgram } from '@/enums/StakingProgram'; import { useBalance } from '@/hooks/useBalance'; +import { useStakingContractInfo } from '@/hooks/useStakingContractInfo'; import { useStakingProgram } from '@/hooks/useStakingProgram'; import { Address } from '@/types/Address'; @@ -48,27 +50,39 @@ export const StakingContractSection = ({ stakingProgram: StakingProgram; contractAddress: Address; }) => { - const { currentStakingProgram } = useStakingProgram(); - + const { activeStakingProgram } = useStakingProgram(); + const { stakingContractInfoRecord } = useStakingContractInfo(); const { token } = useToken(); const { totalOlasBalance, isBalanceLoaded } = useBalance(); - const isSelected = - currentStakingProgram && currentStakingProgram === stakingProgram; + const stakingContractInfo = stakingContractInfoRecord?.[stakingProgram]; - const stakingContractInfo = useMemo(() => {}, []); + const activeStakingProgramMeta = STAKING_PROGRAM_META[stakingProgram]; - const isEnoughOlas = useMemo(() => { + const isSelected = + activeStakingProgram && activeStakingProgram === stakingProgram; + + const hasEnoughOlas = useMemo(() => { if (totalOlasBalance === undefined) return false; - return totalOlasBalance > contract.requiredOlasForStaking; - }, [totalOlasBalance, contract.requiredOlasForStaking]); + if (!stakingContractInfo) return false; + if (!stakingContractInfo.minStakingDeposit) return false; + return totalOlasBalance > stakingContractInfo?.minStakingDeposit; + }, [stakingContractInfo, totalOlasBalance]); + + const hasEnoughSlots = + stakingContractInfo?.maxNumServices && + stakingContractInfo?.serviceIds && + stakingContractInfo?.maxNumServices > + stakingContractInfo?.serviceIds?.length; + + // TODO: compatibility needs to be implemented const isAppVersionCompatible = true; // contract.appVersion === 'rc105'; const isMigratable = !isSelected && isBalanceLoaded && - contract.isEnoughSlots && - isEnoughOlas && + hasEnoughSlots && + hasEnoughOlas && isAppVersionCompatible; const cantMigrateAlert = useMemo(() => { @@ -76,11 +90,11 @@ export const StakingContractSection = ({ return null; } - if (!contract.isEnoughSlots) { + if (!hasEnoughSlots) { return ; } - if (!isEnoughOlas) { + if (!hasEnoughOlas) { return ( ); @@ -93,8 +107,8 @@ export const StakingContractSection = ({ isSelected, isBalanceLoaded, totalOlasBalance, - contract.isEnoughSlots, - isEnoughOlas, + hasEnoughSlots, + hasEnoughOlas, isAppVersionCompatible, ]); @@ -110,13 +124,14 @@ export const StakingContractSection = ({ {`${contract.name} contract`} - + >{`${activeStakingProgramMeta.name} contract`} + {/* TODO: pass `status` attribute */} + {!isSelected && ( // here instead of isSelected we should check that the contract is not the old staking contract // but the one from staking factory (if we want to open govern) @@ -124,21 +139,29 @@ export const StakingContractSection = ({ )} - {/* Contract details */} - - - {/* "Can't migrate" Alert */} + + {/* TODO: fix */} + + {/* Contract details + {stakingContractInfo?.availableRewards && ( + + )} + + {stakingContractInfo?.minStakingDeposit && ( + + )} */} + {cantMigrateAlert} {/* Switch to program button */} {!isSelected && ( )} From e9946e8be18d4b14f8bcac3fd12a5d81f436bdbf Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 13:12:57 +0100 Subject: [PATCH 103/134] --- --- frontend/components/SettingsPage/StakingContractSection.tsx | 4 ++-- frontend/constants/contractAddresses.ts | 3 ++- frontend/context/RewardProvider.tsx | 5 ++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/components/SettingsPage/StakingContractSection.tsx b/frontend/components/SettingsPage/StakingContractSection.tsx index a762e3e20..d1e9c6a3f 100644 --- a/frontend/components/SettingsPage/StakingContractSection.tsx +++ b/frontend/components/SettingsPage/StakingContractSection.tsx @@ -14,8 +14,8 @@ const { Text } = Typography; export const StakingContractSection = () => { const { goto } = usePageState(); const { - currentStakingProgram, - currentStakingProgramMeta, + activeStakingProgram: currentStakingProgram, + activeStakingProgramMeta: currentStakingProgramMeta, defaultStakingProgram, } = useStakingProgram(); diff --git a/frontend/constants/contractAddresses.ts b/frontend/constants/contractAddresses.ts index b62d32681..bf76ee672 100644 --- a/frontend/constants/contractAddresses.ts +++ b/frontend/constants/contractAddresses.ts @@ -21,8 +21,9 @@ export const SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESSES: Record< Record > = { [Chain.GNOSIS]: { - [StakingProgram.Alpha]: '0xEE9F19b5DF06c7E8Bfc7B28745dcf944C504198A', + // Maintain order, as it is used in the UI [StakingProgram.Beta]: '0xeF44Fb0842DDeF59D37f85D61A1eF492bbA6135d', + [StakingProgram.Alpha]: '0xEE9F19b5DF06c7E8Bfc7B28745dcf944C504198A', }, }; diff --git a/frontend/context/RewardProvider.tsx b/frontend/context/RewardProvider.tsx index 6a27c1d76..534659e67 100644 --- a/frontend/context/RewardProvider.tsx +++ b/frontend/context/RewardProvider.tsx @@ -43,9 +43,8 @@ export const RewardProvider = ({ children }: PropsWithChildren) => { const service = useMemo(() => services?.[0], [services]); const { storeState } = useStore(); const electronApi = useElectronApi(); - const { currentStakingProgram, defaultStakingProgram } = useContext( - StakingProgramContext, - ); + const { activeStakingProgram: currentStakingProgram, defaultStakingProgram } = + useContext(StakingProgramContext); const [accruedServiceStakingRewards, setAccruedServiceStakingRewards] = useState(); From d096c6ca60c8a3ec3d092c10baf076efca005265 Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 13:13:35 +0100 Subject: [PATCH 104/134] refactor: reward provider --- frontend/context/RewardProvider.tsx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/frontend/context/RewardProvider.tsx b/frontend/context/RewardProvider.tsx index 534659e67..589db9d6a 100644 --- a/frontend/context/RewardProvider.tsx +++ b/frontend/context/RewardProvider.tsx @@ -43,8 +43,9 @@ export const RewardProvider = ({ children }: PropsWithChildren) => { const service = useMemo(() => services?.[0], [services]); const { storeState } = useStore(); const electronApi = useElectronApi(); - const { activeStakingProgram: currentStakingProgram, defaultStakingProgram } = - useContext(StakingProgramContext); + const { activeStakingProgram, defaultStakingProgram } = useContext( + StakingProgramContext, + ); const [accruedServiceStakingRewards, setAccruedServiceStakingRewards] = useState(); @@ -74,20 +75,20 @@ export const RewardProvider = ({ children }: PropsWithChildren) => { // only check for rewards if there's a currentStakingProgram active if ( - currentStakingProgram && + activeStakingProgram && service?.chain_data?.multisig && service?.chain_data?.token ) { stakingRewardsInfoPromise = AutonolasService.getAgentStakingRewardsInfo({ agentMultisigAddress: service?.chain_data?.multisig, serviceId: service?.chain_data?.token, - stakingProgram: currentStakingProgram, + stakingProgram: activeStakingProgram, }); } // can fallback to default staking program if no current staking program is active const epochRewardsPromise = AutonolasService.getAvailableRewardsForEpoch( - currentStakingProgram ?? defaultStakingProgram, + activeStakingProgram ?? defaultStakingProgram, ); const [stakingRewardsInfo, rewards] = await Promise.all([ @@ -101,7 +102,7 @@ export const RewardProvider = ({ children }: PropsWithChildren) => { ); setAvailableRewardsForEpoch(rewards); }, [ - currentStakingProgram, + activeStakingProgram, defaultStakingProgram, service?.chain_data?.multisig, service?.chain_data?.token, From 64a31842c8f36e36b78203131384a01888fb1570 Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 16:17:24 +0100 Subject: [PATCH 105/134] refactor: update chain data types --- frontend/client/types.ts | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/frontend/client/types.ts b/frontend/client/types.ts index ac244afd3..fc5d7fe72 100644 --- a/frontend/client/types.ts +++ b/frontend/client/types.ts @@ -1,3 +1,4 @@ +import { StakingProgram } from '@/enums/StakingProgram'; import { Address } from '@/types/Address'; import { Chain, DeploymentStatus, Ledger } from './enums'; @@ -20,6 +21,19 @@ export type ChainData = { instances?: Address[]; token?: number; multisig?: Address; + on_chain_state: number; + staked: boolean; + user_params: { + cost_of_bond: number; + fund_requirements: { + agent: number; + safe: number; + }; + nft: string; + staking_program_id: StakingProgram; + threshold: number; + use_staking: true; + }; }; export type Service = { @@ -27,8 +41,12 @@ export type Service = { hash: string; keys: ServiceKeys[]; readme?: string; - ledger: LedgerConfig; - chain_data: ChainData; + chain_configs: { + [chainId: number]: { + ledger_config: LedgerConfig; + chain_data: ChainData; + }; + }; }; export type ServiceTemplate = { @@ -43,13 +61,13 @@ export type ServiceTemplate = { }; export type ConfigurationTemplate = { + rpc?: string; // added on deployment + staking_program_id?: StakingProgram; // added on deployment nft: string; - rpc?: string; // added by user agent_id: number; threshold: number; use_staking: boolean; - cost_of_bond: number; // TODO: REQUEST RESET TO NAMING CONVENTION, OLAS_COST_OF_BOND - olas_required_to_stake: number; // TODO: CLARIFY WHY THIS WAS REMOVED + cost_of_bond: number; monthly_gas_estimate: number; fund_requirements: FundRequirementsTemplate; }; From ba68ea0c54151640459f6e5817fdf7d19a89e2f6 Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 16:17:47 +0100 Subject: [PATCH 106/134] refactor: fix agent button constants --- .../MainPage/header/AgentButton.tsx | 28 ++++++++++++++----- .../components/MainPage/header/constants.ts | 16 ----------- .../StakingContract/index.tsx | 27 ++++++++++++++++-- .../SettingsPage/DebugInfoSection.tsx | 14 ++++++---- frontend/constants/serviceTemplates.ts | 5 ++-- frontend/context/BalanceProvider.tsx | 4 ++- frontend/context/ServicesProvider.tsx | 14 +++++++--- frontend/service/Services.ts | 16 +++++++---- frontend/utils/service.ts | 8 +----- 9 files changed, 82 insertions(+), 50 deletions(-) diff --git a/frontend/components/MainPage/header/AgentButton.tsx b/frontend/components/MainPage/header/AgentButton.tsx index 7f689d92a..3db3f053b 100644 --- a/frontend/components/MainPage/header/AgentButton.tsx +++ b/frontend/components/MainPage/header/AgentButton.tsx @@ -21,7 +21,7 @@ import { CannotStartAgentDueToUnexpectedError, CannotStartAgentPopover, } from './CannotStartAgentPopover'; -import { requiredGas, requiredOlas } from './constants'; +import { requiredGas } from './constants'; const { Text } = Typography; @@ -106,7 +106,14 @@ const AgentNotRunningButton = () => { totalEthBalance, } = useBalance(); const { storeState } = useStore(); - const { isEligibleForStaking, isAgentEvicted } = useStakingContractInfo(); + const { isEligibleForStaking, isAgentEvicted, stakingContractInfoRecord } = + useStakingContractInfo(); + const { activeStakingProgram, defaultStakingProgram } = useStakingProgram(); + + const minStakingDeposit = + stakingContractInfoRecord?.[activeStakingProgram ?? defaultStakingProgram] + ?.minStakingDeposit; + const requiredOlas = minStakingDeposit && minStakingDeposit * 2; const safeOlasBalance = safeBalance?.OLAS; const safeOlasBalanceWithStaked = @@ -144,10 +151,12 @@ const AgentNotRunningButton = () => { // Then create / deploy the service try { await ServicesService.createService({ + stakingProgram: activeStakingProgram ?? defaultStakingProgram, serviceTemplate, deploy: true, }); } catch (error) { + 0; console.error(error); setServiceStatus(undefined); showNotification?.('Error while deploying service'); @@ -185,6 +194,8 @@ const AgentNotRunningButton = () => { setServiceStatus, masterSafeAddress, showNotification, + activeStakingProgram, + defaultStakingProgram, serviceTemplate, service, ]); @@ -203,6 +214,8 @@ const AgentNotRunningButton = () => { if (serviceStatus === DeploymentStatus.DEPLOYING) return false; if (serviceStatus === DeploymentStatus.STOPPING) return false; + if (!requiredOlas) return false; + // case where service exists & user has initial funded if (service && storeState?.isInitialFunded) { if (!safeOlasBalanceWithStaked) return false; @@ -218,14 +231,15 @@ const AgentNotRunningButton = () => { return hasEnoughOlas && hasEnoughEth; }, [ - isAgentEvicted, - isEligibleForStaking, - safeOlasBalanceWithStaked, - service, serviceStatus, + safeBalance, + service, storeState?.isInitialFunded, + isEligibleForStaking, + isAgentEvicted, + safeOlasBalanceWithStaked, + requiredOlas, totalEthBalance, - safeBalance, ]); const buttonProps: ButtonProps = { diff --git a/frontend/components/MainPage/header/constants.ts b/frontend/components/MainPage/header/constants.ts index a9e9a098a..101e61590 100644 --- a/frontend/components/MainPage/header/constants.ts +++ b/frontend/components/MainPage/header/constants.ts @@ -3,22 +3,6 @@ import { formatUnits } from 'ethers/lib/utils'; import { CHAINS } from '@/constants/chains'; import { SERVICE_TEMPLATES } from '@/constants/serviceTemplates'; -// TODO: Move this to more appropriate location (root /constants) -const olasCostOfBond = Number( - formatUnits( - `${SERVICE_TEMPLATES[0].configurations[CHAINS.GNOSIS.chainId].cost_of_bond}`, - 18, - ), -); - -const olasRequiredToStake = Number( - formatUnits( - `${SERVICE_TEMPLATES[0].configurations[CHAINS.GNOSIS.chainId].olas_required_to_stake}`, - 18, - ), -); - -export const requiredOlas = olasCostOfBond + olasRequiredToStake; export const requiredGas = Number( formatUnits( `${SERVICE_TEMPLATES[0].configurations[CHAINS.GNOSIS.chainId].monthly_gas_estimate}`, diff --git a/frontend/components/ManageStakingPage/StakingContract/index.tsx b/frontend/components/ManageStakingPage/StakingContract/index.tsx index 230ba6689..fdc8b4c2c 100644 --- a/frontend/components/ManageStakingPage/StakingContract/index.tsx +++ b/frontend/components/ManageStakingPage/StakingContract/index.tsx @@ -6,6 +6,7 @@ import { CardSection } from '@/components/styled/CardSection'; import { STAKING_PROGRAM_META } from '@/constants/stakingProgramMeta'; import { UNICODE_SYMBOLS } from '@/constants/symbols'; import { StakingProgram } from '@/enums/StakingProgram'; +import { StakingProgramStatus } from '@/enums/StakingProgramStatus'; import { useBalance } from '@/hooks/useBalance'; import { useStakingContractInfo } from '@/hooks/useStakingContractInfo'; import { useStakingProgram } from '@/hooks/useStakingProgram'; @@ -50,7 +51,7 @@ export const StakingContractSection = ({ stakingProgram: StakingProgram; contractAddress: Address; }) => { - const { activeStakingProgram } = useStakingProgram(); + const { activeStakingProgram, defaultStakingProgram } = useStakingProgram(); const { stakingContractInfoRecord } = useStakingContractInfo(); const { token } = useToken(); const { totalOlasBalance, isBalanceLoaded } = useBalance(); @@ -80,6 +81,7 @@ export const StakingContractSection = ({ const isMigratable = !isSelected && + activeStakingProgram === StakingProgram.Alpha && // TODO: make more elegant isBalanceLoaded && hasEnoughSlots && hasEnoughOlas && @@ -112,9 +114,28 @@ export const StakingContractSection = ({ isAppVersionCompatible, ]); + const contractTagStatus = useMemo(() => { + if (activeStakingProgram === stakingProgram) + return StakingProgramStatus.Selected; + + // Pearl is not staked, set as Selected if default (Beta) + if (!activeStakingProgram && stakingProgram === defaultStakingProgram) + return StakingProgramStatus.Selected; + + // Otherwise, highlight Beta as New + if (stakingProgram === StakingProgram.Beta) return StakingProgramStatus.New; + + // Otherwise, no tag + return; + }, [activeStakingProgram, defaultStakingProgram, stakingProgram]); + return ( {`${activeStakingProgramMeta.name} contract`} {/* TODO: pass `status` attribute */} - + {!isSelected && ( // here instead of isSelected we should check that the contract is not the old staking contract // but the one from staking factory (if we want to open govern) diff --git a/frontend/components/SettingsPage/DebugInfoSection.tsx b/frontend/components/SettingsPage/DebugInfoSection.tsx index cadeda89d..4fa00aebf 100644 --- a/frontend/components/SettingsPage/DebugInfoSection.tsx +++ b/frontend/components/SettingsPage/DebugInfoSection.tsx @@ -13,6 +13,7 @@ import { import { useCallback, useMemo, useState } from 'react'; import styled from 'styled-components'; +import { CHAINS } from '@/constants/chains'; import { COLOR } from '@/constants/colors'; import { UNICODE_SYMBOLS } from '@/constants/symbols'; import { Token } from '@/enums/Token'; @@ -169,16 +170,19 @@ export const DebugInfoSection = () => { }); } - if (services[0]?.chain_data?.instances?.[0]) { - const instanceAddress = services[0].chain_data.instances[0]; + const instanceAddress = + services[0]?.chain_configs?.[CHAINS.GNOSIS.chainId]?.chain_data + ?.instances?.[0]; + if (instanceAddress) { result.push({ title: 'Agent instance', - ...getItemData(walletBalances, instanceAddress), + ...getItemData(walletBalances, instanceAddress!), }); } - if (services[0]?.chain_data?.multisig) { - const multisigAddress = services[0].chain_data.multisig; + const multisigAddress = + services[0]?.chain_configs?.[CHAINS.GNOSIS.chainId]?.chain_data?.multisig; + if (multisigAddress) { result.push({ title: 'Agent Safe', ...getItemData(walletBalances, multisigAddress), diff --git a/frontend/constants/serviceTemplates.ts b/frontend/constants/serviceTemplates.ts index 32fb9b435..b03851eac 100644 --- a/frontend/constants/serviceTemplates.ts +++ b/frontend/constants/serviceTemplates.ts @@ -1,4 +1,5 @@ import { ServiceTemplate } from '@/client'; +import { StakingProgram } from '@/enums/StakingProgram'; export const SERVICE_TEMPLATES: ServiceTemplate[] = [ { @@ -10,13 +11,13 @@ export const SERVICE_TEMPLATES: ServiceTemplate[] = [ service_version: 'v0.18.1', home_chain_id: '100', configurations: { - '100': { + 100: { + staking_program_id: StakingProgram.Beta, // default, may be overwritten nft: 'bafybeig64atqaladigoc3ds4arltdu63wkdrk3gesjfvnfdmz35amv7faq', agent_id: 14, threshold: 1, use_staking: true, cost_of_bond: 10000000000000000, - olas_required_to_stake: 10000000000000000000, monthly_gas_estimate: 10000000000000000000, fund_requirements: { agent: 100000000000000000, diff --git a/frontend/context/BalanceProvider.tsx b/frontend/context/BalanceProvider.tsx index 12c5400ec..cc417462a 100644 --- a/frontend/context/BalanceProvider.tsx +++ b/frontend/context/BalanceProvider.tsx @@ -15,6 +15,7 @@ import { import { useInterval } from 'usehooks-ts'; import { Wallet } from '@/client'; +import { CHAINS } from '@/constants/chains'; import { FIVE_SECONDS_INTERVAL } from '@/constants/intervals'; import { TOKENS } from '@/constants/tokens'; import { ServiceRegistryL2ServiceState } from '@/enums/ServiceRegistryL2ServiceState'; @@ -134,7 +135,8 @@ export const BalanceProvider = ({ children }: PropsWithChildren) => { setWalletBalances(walletBalances); - const serviceId = services?.[0]?.chain_data.token; + const serviceId = + services?.[0]?.chain_configs[CHAINS.GNOSIS.chainId].chain_data.token; if (!isNumber(serviceId)) { setIsLoaded(true); diff --git a/frontend/context/ServicesProvider.tsx b/frontend/context/ServicesProvider.tsx index 8b44e2612..a96b43635 100644 --- a/frontend/context/ServicesProvider.tsx +++ b/frontend/context/ServicesProvider.tsx @@ -12,6 +12,7 @@ import { import { useInterval } from 'usehooks-ts'; import { DeploymentStatus, Service } from '@/client'; +import { CHAINS } from '@/constants/chains'; import { FIVE_SECONDS_INTERVAL } from '@/constants/intervals'; import { ServicesService } from '@/service/Services'; import { Address } from '@/types/Address'; @@ -58,11 +59,16 @@ export const ServicesProvider = ({ children }: PropsWithChildren) => { const serviceAddresses = useMemo( () => services?.reduce((acc, service: Service) => { - if (service.chain_data.instances) { - acc.push(...service.chain_data.instances); + const instances = + service.chain_configs[CHAINS.GNOSIS.chainId].chain_data.instances; + if (instances) { + acc.push(...instances); } - if (service.chain_data.multisig) { - acc.push(service.chain_data.multisig); + + const multisig = + service.chain_configs[CHAINS.GNOSIS.chainId].chain_data.multisig; + if (multisig) { + acc.push(multisig); } return acc; }, []), diff --git a/frontend/service/Services.ts b/frontend/service/Services.ts index a12591909..44730835c 100644 --- a/frontend/service/Services.ts +++ b/frontend/service/Services.ts @@ -1,5 +1,6 @@ import { Deployment, Service, ServiceHash, ServiceTemplate } from '@/client'; import { BACKEND_URL } from '@/constants/urls'; +import { StakingProgram } from '@/enums/StakingProgram'; /** * Get a single service from the backend @@ -29,11 +30,13 @@ const getServices = async (): Promise => * @returns Promise */ const createService = async ({ - serviceTemplate, deploy, + serviceTemplate, + stakingProgram, }: { - serviceTemplate: ServiceTemplate; deploy: boolean; + serviceTemplate: ServiceTemplate; + stakingProgram: StakingProgram; }): Promise => new Promise((resolve, reject) => fetch(`${BACKEND_URL}/services`, { @@ -41,9 +44,12 @@ const createService = async ({ body: JSON.stringify({ ...serviceTemplate, deploy, - configuration: { - ...serviceTemplate.configuration, - rpc: `${process.env.GNOSIS_RPC}`, + configurations: { + 100: { + ...serviceTemplate.configurations[100], + staking_program_id: stakingProgram, + rpc: `${process.env.GNOSIS_RPC}`, + }, }, }), headers: { diff --git a/frontend/utils/service.ts b/frontend/utils/service.ts index b03820ff2..5d69e2e2f 100644 --- a/frontend/utils/service.ts +++ b/frontend/utils/service.ts @@ -12,12 +12,6 @@ export const getMinimumStakedAmountRequired = ( 18, ), ); - const olasRequiredToStake = Number( - formatUnits( - `${serviceTemplate.configurations[CHAINS.GNOSIS.chainId].olas_required_to_stake}`, - 18, - ), - ); - return olasCostOfBond + olasRequiredToStake; + return olasCostOfBond * 2; }; From 4c9fefa95ee2331b70340ff9555a237e31325e8d Mon Sep 17 00:00:00 2001 From: Ardian Date: Fri, 16 Aug 2024 17:24:30 +0200 Subject: [PATCH 107/134] fix: local deployment --- operate/cli.py | 1 + operate/services/service.py | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/operate/cli.py b/operate/cli.py index 86acd8031..7d5285d13 100644 --- a/operate/cli.py +++ b/operate/cli.py @@ -647,6 +647,7 @@ async def _get_service_deployment(request: Request) -> JSONResponse: @with_retries async def _build_service_locally(request: Request) -> JSONResponse: """Create a service.""" + # TODO: add support for chain id. if not operate.service_manager().exists(service=request.path_params["service"]): return service_not_found_error(service=request.path_params["service"]) deployment = ( diff --git a/operate/services/service.py b/operate/services/service.py index 5ecabf103..6a476866b 100644 --- a/operate/services/service.py +++ b/operate/services/service.py @@ -484,7 +484,7 @@ def _build_docker( self.status = DeploymentStatus.BUILT self.store() - def _build_host(self, force: bool = True) -> None: + def _build_host(self, force: bool = True, chain_id: str = "100") -> None: """Build host depployment.""" build = self.path / DEPLOYMENT if build.exists() and not force: @@ -500,6 +500,10 @@ def _build_host(self, force: bool = True) -> None: "Host deployment currently only supports single agent deployments" ) + chain_config = service.chain_configs[chain_id] + ledger_config = chain_config.ledger_config + chain_data = chain_config.chain_data + keys_file = self.path / KEYS_JSON keys_file.write_text( json.dumps( @@ -524,15 +528,15 @@ def _build_host(self, force: bool = True) -> None: builder.deplopyment_type = HostDeploymentGenerator.deployment_type builder.try_update_abci_connection_params() builder.try_update_runtime_params( - multisig_address=service.chain_data.multisig, - agent_instances=service.chain_data.instances, - service_id=service.chain_data.token, + multisig_address=chain_data.multisig, + agent_instances=chain_data.instances, + service_id=chain_data.token, consensus_threshold=None, ) # TODO: Support for multiledger builder.try_update_ledger_params( - chain=LedgerType(service.ledger_config.type).name.lower(), - address=service.ledger_config.rpc, + chain=LedgerType(ledger_config.type).name.lower(), + address=ledger_config.rpc, ) ( @@ -569,6 +573,7 @@ def build( self, use_docker: bool = False, force: bool = True, + chain_id: str = "100", ) -> None: """ Build a deployment @@ -577,9 +582,10 @@ def build( :param force: Remove existing deployment and build a new one :return: Deployment object """ + # TODO: chain_id should be used properly! Added as a hotfix for now. if use_docker: return self._build_docker(force=force) - return self._build_host(force=force) + return self._build_host(force=force, chain_id=chain_id) def start(self, use_docker: bool = False) -> None: """Start the service""" From de443c37abe4aeaf5eec0588cb243a793fcb4d56 Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 19:38:32 +0100 Subject: [PATCH 108/134] refactor: remove migrating button, reset create service null coalesce --- .../MainPage/header/AgentButton.tsx | 20 +-- .../StakingContractTag.tsx | 0 .../alerts.tsx | 0 .../index.tsx | 125 ++++++++++++++++-- .../components/ManageStakingPage/index.tsx | 21 +-- ...tsx => SettingsStakingContractSection.tsx} | 21 ++- frontend/components/SettingsPage/index.tsx | 4 +- frontend/constants/serviceTemplates.ts | 1 + frontend/context/ModalProvider.tsx | 33 +++++ frontend/context/RewardProvider.tsx | 18 ++- .../context/StakingContractInfoProvider.tsx | 6 +- frontend/context/StakingProgramContext.tsx | 27 ++-- frontend/hooks/useModals.ts | 12 +- frontend/hooks/useStakingContractInfo.ts | 1 + frontend/hooks/useStakingProgram.ts | 27 ++-- frontend/pages/_app.tsx | 13 +- frontend/service/Autonolas.ts | 15 ++- operate/cli.py | 1 - 18 files changed, 236 insertions(+), 109 deletions(-) rename frontend/components/ManageStakingPage/{StakingContract => StakingContractSection}/StakingContractTag.tsx (100%) rename frontend/components/ManageStakingPage/{StakingContract => StakingContractSection}/alerts.tsx (100%) rename frontend/components/ManageStakingPage/{StakingContract => StakingContractSection}/index.tsx (58%) rename frontend/components/SettingsPage/{StakingContractSection.tsx => SettingsStakingContractSection.tsx} (70%) create mode 100644 frontend/context/ModalProvider.tsx diff --git a/frontend/components/MainPage/header/AgentButton.tsx b/frontend/components/MainPage/header/AgentButton.tsx index 3db3f053b..c58cdd3b9 100644 --- a/frontend/components/MainPage/header/AgentButton.tsx +++ b/frontend/components/MainPage/header/AgentButton.tsx @@ -151,12 +151,11 @@ const AgentNotRunningButton = () => { // Then create / deploy the service try { await ServicesService.createService({ - stakingProgram: activeStakingProgram ?? defaultStakingProgram, + stakingProgram: activeStakingProgram ?? defaultStakingProgram, // overwrite with StakingProgram.Alpha to test migration serviceTemplate, deploy: true, }); } catch (error) { - 0; console.error(error); setServiceStatus(undefined); showNotification?.('Error while deploying service'); @@ -254,19 +253,7 @@ const AgentNotRunningButton = () => { return ; }; -const MigratingButton = () => { - return ( - - - - ); -}; - export const AgentButton = () => { - const { isMigrating } = useStakingProgram(); const { service, serviceStatus, hasInitialLoaded } = useServices(); const { isEligibleForStaking, isAgentEvicted } = useStakingContractInfo(); @@ -275,10 +262,6 @@ export const AgentButton = () => { return + + + )} ); diff --git a/frontend/components/ManageStakingPage/index.tsx b/frontend/components/ManageStakingPage/index.tsx index 45ed4f2d2..310d19eca 100644 --- a/frontend/components/ManageStakingPage/index.tsx +++ b/frontend/components/ManageStakingPage/index.tsx @@ -8,28 +8,9 @@ import { StakingProgram } from '@/enums/StakingProgram'; import { usePageState } from '@/hooks/usePageState'; import { CardTitle } from '../Card/CardTitle'; -import { StakingContractSection } from './StakingContract'; +import { StakingContractSection } from './StakingContractSection'; import { WhatAreStakingContractsSection } from './WhatAreStakingContracts'; -// const mockStakingContracts: StakingProgram[] = [ -// { -// name: 'Pearl Beta', -// rewardsPerWorkPeriod: 0.14, -// requiredOlasForStaking: 40, -// isEnoughSlots: true, -// status: StakingProgramStatus.New, -// contractAddress: '0x1234567890', -// }, -// { -// name: 'Pearl Alpha', -// rewardsPerWorkPeriod: 0.047, -// requiredOlasForStaking: 20, -// isEnoughSlots: true, -// status: StakingProgramStatus.Selected, -// contractAddress: '0x0987654321', -// }, -// ]; - export const ManageStakingPage = () => { const { goto } = usePageState(); return ( diff --git a/frontend/components/SettingsPage/StakingContractSection.tsx b/frontend/components/SettingsPage/SettingsStakingContractSection.tsx similarity index 70% rename from frontend/components/SettingsPage/StakingContractSection.tsx rename to frontend/components/SettingsPage/SettingsStakingContractSection.tsx index d1e9c6a3f..121b36476 100644 --- a/frontend/components/SettingsPage/StakingContractSection.tsx +++ b/frontend/components/SettingsPage/SettingsStakingContractSection.tsx @@ -1,4 +1,4 @@ -import { Button, Flex, Typography } from 'antd'; +import { Button, Flex, Skeleton, Typography } from 'antd'; import { Chain } from '@/client'; import { SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESSES } from '@/constants/contractAddresses'; @@ -11,24 +11,33 @@ import { CardSection } from '../styled/CardSection'; const { Text } = Typography; -export const StakingContractSection = () => { +export const SettingsStakingContractSection = () => { const { goto } = usePageState(); const { - activeStakingProgram: currentStakingProgram, - activeStakingProgramMeta: currentStakingProgramMeta, + activeStakingProgram, + activeStakingProgramMeta, defaultStakingProgram, + isLoadedActiveStakingProgram, } = useStakingProgram(); const stakingContractAddress = SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESSES[Chain.GNOSIS][ - currentStakingProgram ?? defaultStakingProgram + activeStakingProgram ?? defaultStakingProgram ]; + if (!isLoadedActiveStakingProgram) { + return ; + } + return ( Staking contract - {currentStakingProgramMeta.name} + + {activeStakingProgramMeta + ? activeStakingProgramMeta.name + : 'Not staked'} + { )} {/* Staking contract section */} - + {/* Debug info */} diff --git a/frontend/constants/serviceTemplates.ts b/frontend/constants/serviceTemplates.ts index b03851eac..dcb2fd1aa 100644 --- a/frontend/constants/serviceTemplates.ts +++ b/frontend/constants/serviceTemplates.ts @@ -5,6 +5,7 @@ export const SERVICE_TEMPLATES: ServiceTemplate[] = [ { name: 'Trader Agent', hash: 'bafybeidgjgjj5ul6xkubicbemppufgsbx5sr5rwhtrwttk2oivp5bkdnce', + // hash: 'bafybeibbloa4w33vj4bvdkso7pzk6tr3duvxjpecbx4mur4ix6ehnwb5uu', // temporary description: 'Trader agent for omen prediction markets', image: 'https://operate.olas.network/_next/image?url=%2Fimages%2Fprediction-agent.png&w=3840&q=75', diff --git a/frontend/context/ModalProvider.tsx b/frontend/context/ModalProvider.tsx new file mode 100644 index 000000000..90768cce4 --- /dev/null +++ b/frontend/context/ModalProvider.tsx @@ -0,0 +1,33 @@ +import { + createContext, + Dispatch, + PropsWithChildren, + SetStateAction, + useState, +} from 'react'; + +import { MigrationSuccessModal } from '@/components/MainPage/modals/MigrationModal'; + +export const ModalContext = createContext<{ + migrationModalOpen: boolean; + setMigrationModalOpen: Dispatch>; +}>({ + migrationModalOpen: false, + setMigrationModalOpen: () => {}, +}); + +export const ModalProvider = ({ children }: PropsWithChildren) => { + const [migrationModalOpen, setMigrationModalOpen] = useState(false); + + return ( + + setMigrationModalOpen(false)} + /> + {children} + + ); +}; diff --git a/frontend/context/RewardProvider.tsx b/frontend/context/RewardProvider.tsx index 589db9d6a..b5b5480c0 100644 --- a/frontend/context/RewardProvider.tsx +++ b/frontend/context/RewardProvider.tsx @@ -10,6 +10,7 @@ import { } from 'react'; import { useInterval } from 'usehooks-ts'; +import { CHAINS } from '@/constants/chains'; import { FIVE_SECONDS_INTERVAL } from '@/constants/intervals'; import { useElectronApi } from '@/hooks/useElectronApi'; import { useStore } from '@/hooks/useStore'; @@ -76,12 +77,14 @@ export const RewardProvider = ({ children }: PropsWithChildren) => { // only check for rewards if there's a currentStakingProgram active if ( activeStakingProgram && - service?.chain_data?.multisig && - service?.chain_data?.token + service?.chain_configs[CHAINS.GNOSIS.chainId].chain_data?.multisig && + service?.chain_configs[CHAINS.GNOSIS.chainId].chain_data?.token ) { stakingRewardsInfoPromise = AutonolasService.getAgentStakingRewardsInfo({ - agentMultisigAddress: service?.chain_data?.multisig, - serviceId: service?.chain_data?.token, + agentMultisigAddress: + service.chain_configs[CHAINS.GNOSIS.chainId].chain_data.multisig!, + serviceId: + service.chain_configs[CHAINS.GNOSIS.chainId].chain_data.token!, stakingProgram: activeStakingProgram, }); } @@ -101,12 +104,7 @@ export const RewardProvider = ({ children }: PropsWithChildren) => { stakingRewardsInfo?.accruedServiceStakingRewards, ); setAvailableRewardsForEpoch(rewards); - }, [ - activeStakingProgram, - defaultStakingProgram, - service?.chain_data?.multisig, - service?.chain_data?.token, - ]); + }, [activeStakingProgram, defaultStakingProgram, service]); useEffect(() => { if (isEligibleForRewards && !storeState?.firstStakingRewardAchieved) { diff --git a/frontend/context/StakingContractInfoProvider.tsx b/frontend/context/StakingContractInfoProvider.tsx index 10ba73ede..6bf19408a 100644 --- a/frontend/context/StakingContractInfoProvider.tsx +++ b/frontend/context/StakingContractInfoProvider.tsx @@ -9,6 +9,7 @@ import { } from 'react'; import { useInterval } from 'usehooks-ts'; +import { CHAINS } from '@/constants/chains'; import { FIVE_SECONDS_INTERVAL } from '@/constants/intervals'; import { StakingProgram } from '@/enums/StakingProgram'; import { AutonolasService } from '@/service/Autonolas'; @@ -45,7 +46,10 @@ export const StakingContractInfoProvider = ({ const [stakingContractInfoRecord, setStakingContractInfoRecord] = useState>>(); - const serviceId = useMemo(() => services?.[0]?.chain_data?.token, [services]); + const serviceId = useMemo( + () => services?.[0]?.chain_configs[CHAINS.GNOSIS.chainId].chain_data?.token, + [services], + ); // ACTIVE staking contract info should be updated on interval // it requires serviceId and activeStakingProgram diff --git a/frontend/context/StakingProgramContext.tsx b/frontend/context/StakingProgramContext.tsx index 386c20b5d..420ef5bcf 100644 --- a/frontend/context/StakingProgramContext.tsx +++ b/frontend/context/StakingProgramContext.tsx @@ -1,5 +1,7 @@ import { createContext, PropsWithChildren, useCallback, useState } from 'react'; +import { useInterval } from 'usehooks-ts'; +import { CHAINS } from '@/constants/chains'; import { StakingProgram } from '@/enums/StakingProgram'; import { useServices } from '@/hooks/useServices'; import { AutonolasService } from '@/service/Autonolas'; @@ -18,26 +20,33 @@ export const StakingProgramContext = createContext<{ export const StakingProgramProvider = ({ children }: PropsWithChildren) => { const { service } = useServices(); - const [activeStakingProgram, setCurrentStakingProgram] = + const [activeStakingProgram, setActiveStakingProgram] = useState(); const updateStakingProgram = useCallback(async () => { - // if no service / instance is available, we don't need to check for staking program - if (!service?.chain_data?.instances?.[0]) { - setCurrentStakingProgram(null); + // if no service nft, not staked + const serviceId = + service?.chain_configs[CHAINS.GNOSIS.chainId].chain_data?.token; + + if (!service?.chain_configs[CHAINS.GNOSIS.chainId].chain_data?.token) { + setActiveStakingProgram(null); return; } - // TODO: check if assuming the first service is the correct approach - const operatorAddress = service?.chain_data?.instances?.[0]; - if (operatorAddress) { + if (serviceId) { // if service exists, we need to check if it is staked - AutonolasService.getCurrentStakingProgram(operatorAddress).then( - setCurrentStakingProgram, + console.log('getting current staking program'); + AutonolasService.getCurrentStakingProgramByServiceId(serviceId).then( + (stakingProgram) => { + console.log('setting stakingProgram', stakingProgram); + setActiveStakingProgram(stakingProgram); + }, ); } }, [service]); + useInterval(updateStakingProgram, 5000); + return ( { - const [isMigrationSuccessModalOpen, setIsMigrationSuccessModalOpen] = - useState(false); + const { migrationModalOpen, setMigrationModalOpen } = + useContext(ModalContext); return { - isMigrationSuccessModalOpen, - setIsMigrationSuccessModalOpen, + migrationModalOpen, + setMigrationModalOpen, }; }; diff --git a/frontend/hooks/useStakingContractInfo.ts b/frontend/hooks/useStakingContractInfo.ts index 74fdc517a..089183260 100644 --- a/frontend/hooks/useStakingContractInfo.ts +++ b/frontend/hooks/useStakingContractInfo.ts @@ -60,5 +60,6 @@ export const useStakingContractInfo = () => { isRewardsAvailable, isAgentEvicted, stakingContractInfoRecord, + isServiceStakedForMinimumDuration, }; }; diff --git a/frontend/hooks/useStakingProgram.ts b/frontend/hooks/useStakingProgram.ts index af04920ed..585bcab49 100644 --- a/frontend/hooks/useStakingProgram.ts +++ b/frontend/hooks/useStakingProgram.ts @@ -1,4 +1,4 @@ -import { useContext, useState } from 'react'; +import { useContext } from 'react'; import { STAKING_PROGRAM_META } from '@/constants/stakingProgramMeta'; import { StakingProgramContext } from '@/context/StakingProgramContext'; @@ -8,28 +8,23 @@ import { StakingProgramContext } from '@/context/StakingProgramContext'; * @returns {currentStakingProgram: IncentiveProgram} */ export const useStakingProgram = () => { - const { activeStakingProgram, defaultStakingProgram } = useContext( - StakingProgramContext, - ); + const { activeStakingProgram, defaultStakingProgram, updateStakingProgram } = + useContext(StakingProgramContext); - const [isMigrating, setIsMigrating] = useState(false); + const isLoadedActiveStakingProgram = activeStakingProgram !== undefined; const activeStakingProgramMeta = - STAKING_PROGRAM_META[activeStakingProgram ?? defaultStakingProgram]; - - // TODO: Implement migration logic - const migrate = async () => { - setIsMigrating(true); - await setTimeout(() => { - setIsMigrating(false); - }, 1000); - }; + activeStakingProgram === undefined + ? null + : activeStakingProgram === null + ? null + : STAKING_PROGRAM_META[activeStakingProgram]; return { activeStakingProgram, activeStakingProgramMeta, defaultStakingProgram, - isMigrating, - migrate, + updateStakingProgram, + isLoadedActiveStakingProgram, }; }; diff --git a/frontend/pages/_app.tsx b/frontend/pages/_app.tsx index 94e588e6d..42657f818 100644 --- a/frontend/pages/_app.tsx +++ b/frontend/pages/_app.tsx @@ -8,6 +8,7 @@ import { Layout } from '@/components/Layout'; import { BalanceProvider } from '@/context/BalanceProvider'; import { ElectronApiProvider } from '@/context/ElectronApiProvider'; import { MasterSafeProvider } from '@/context/MasterSafeProvider'; +import { ModalProvider } from '@/context/ModalProvider'; import { OnlineStatusProvider } from '@/context/OnlineStatusProvider'; import { PageStateProvider } from '@/context/PageStateProvider'; import { RewardProvider } from '@/context/RewardProvider'; @@ -41,11 +42,13 @@ export default function App({ Component, pageProps }: AppProps) { - {isMounted ? ( - - - - ) : null} + + {isMounted ? ( + + + + ) : null} + diff --git a/frontend/service/Autonolas.ts b/frontend/service/Autonolas.ts index 190fc6030..0b11573df 100644 --- a/frontend/service/Autonolas.ts +++ b/frontend/service/Autonolas.ts @@ -89,6 +89,7 @@ const getAgentStakingRewardsInfo = async ({ ].calculateStakingReward(serviceId), serviceStakingTokenMechUsageContracts[stakingProgram].minStakingDeposit(), serviceStakingTokenMechUsageContracts[stakingProgram].tsCheckpoint(), + serviceStakingTokenMechUsageContracts[stakingProgram].minStakingDuration(), ]; await gnosisMulticallProvider.init(); @@ -104,6 +105,7 @@ const getAgentStakingRewardsInfo = async ({ accruedStakingReward, minStakingDeposit, tsCheckpoint, + minStakingDuration, ] = multicallResponse; /** @@ -308,15 +310,15 @@ const getServiceRegistryInfo = async ( }; }; -const getCurrentStakingProgram = async ( - agentAddress: string, +const getCurrentStakingProgramByServiceId = async ( + serviceId: number, ): Promise => { const contractCalls = [ serviceStakingTokenMechUsageContracts[StakingProgram.Alpha].getStakingState( - agentAddress, + serviceId, ), serviceStakingTokenMechUsageContracts[StakingProgram.Beta].getStakingState( - agentAddress, + serviceId, ), ]; @@ -326,6 +328,8 @@ const getCurrentStakingProgram = async ( const [isAlphaStaked, isBetaStaked] = await gnosisMulticallProvider.all(contractCalls); + console.log(isAlphaStaked, isBetaStaked); + // Alpha should take precedence, as it must be migrated from return isAlphaStaked ? StakingProgram.Alpha @@ -333,6 +337,7 @@ const getCurrentStakingProgram = async ( ? StakingProgram.Beta : null; } catch (error) { + console.log('Error while getting current staking program', error); return null; } }; @@ -340,7 +345,7 @@ const getCurrentStakingProgram = async ( export const AutonolasService = { getAgentStakingRewardsInfo, getAvailableRewardsForEpoch, - getCurrentStakingProgram, + getCurrentStakingProgramByServiceId, getServiceRegistryInfo, getStakingContractInfoByServiceIdStakingProgram, getStakingContractInfoByStakingProgram, diff --git a/operate/cli.py b/operate/cli.py index 7d5285d13..1eac6a3b6 100644 --- a/operate/cli.py +++ b/operate/cli.py @@ -528,7 +528,6 @@ async def _create_services(request: Request) -> JSONResponse: ) if template.get("deploy", False): - def _fn() -> None: manager.deploy_service_onchain_from_safe(hash=service.hash) # manager.stake_service_on_chain_from_safe(hash=service.hash) # Done inside deploy_service_onchain From 8fe5fa38d36a9aecebcc3e74f80811595c5fdb51 Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 19:40:17 +0100 Subject: [PATCH 109/134] refactor: improve staking program retrieval and error handling --- frontend/context/StakingProgramContext.tsx | 2 -- frontend/service/Autonolas.ts | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/frontend/context/StakingProgramContext.tsx b/frontend/context/StakingProgramContext.tsx index 420ef5bcf..290f1d607 100644 --- a/frontend/context/StakingProgramContext.tsx +++ b/frontend/context/StakingProgramContext.tsx @@ -35,10 +35,8 @@ export const StakingProgramProvider = ({ children }: PropsWithChildren) => { if (serviceId) { // if service exists, we need to check if it is staked - console.log('getting current staking program'); AutonolasService.getCurrentStakingProgramByServiceId(serviceId).then( (stakingProgram) => { - console.log('setting stakingProgram', stakingProgram); setActiveStakingProgram(stakingProgram); }, ); diff --git a/frontend/service/Autonolas.ts b/frontend/service/Autonolas.ts index 0b11573df..2a6b9c3fb 100644 --- a/frontend/service/Autonolas.ts +++ b/frontend/service/Autonolas.ts @@ -328,8 +328,6 @@ const getCurrentStakingProgramByServiceId = async ( const [isAlphaStaked, isBetaStaked] = await gnosisMulticallProvider.all(contractCalls); - console.log(isAlphaStaked, isBetaStaked); - // Alpha should take precedence, as it must be migrated from return isAlphaStaked ? StakingProgram.Alpha @@ -337,7 +335,7 @@ const getCurrentStakingProgramByServiceId = async ( ? StakingProgram.Beta : null; } catch (error) { - console.log('Error while getting current staking program', error); + console.error('Error while getting current staking program', error); return null; } }; From d9b29b37f2b39eb25931e3fb1451ae6709c6f2d0 Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 19:41:54 +0100 Subject: [PATCH 110/134] refactor: remove unused code in StakingContractSection --- .../StakingContractSection/index.tsx | 45 +++++++++---------- frontend/service/Autonolas.ts | 2 - 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/frontend/components/ManageStakingPage/StakingContractSection/index.tsx b/frontend/components/ManageStakingPage/StakingContractSection/index.tsx index 53fd4901a..b07f07749 100644 --- a/frontend/components/ManageStakingPage/StakingContractSection/index.tsx +++ b/frontend/components/ManageStakingPage/StakingContractSection/index.tsx @@ -1,6 +1,5 @@ -import { Button, Divider, Flex, Popover, theme, Typography } from 'antd'; +import { Button, Flex, Popover, theme, Typography } from 'antd'; import { useMemo } from 'react'; -import styled from 'styled-components'; import { DeploymentStatus } from '@/client'; import { CardSection } from '@/components/styled/CardSection'; @@ -26,30 +25,30 @@ import { } from './alerts'; import { StakingContractTag } from './StakingContractTag'; -const { Text } = Typography; +// const { Text } = Typography; const { useToken } = theme; -const CustomDivider = styled(Divider)` - flex: auto; - width: max-content; - min-width: 0; - margin: 0; -`; - -const ContractParameter = ({ - label, - value, -}: { - label: string; - value: string; -}) => ( - - {label} - - {value} - -); +// const CustomDivider = styled(Divider)` +// flex: auto; +// width: max-content; +// min-width: 0; +// margin: 0; +// `; + +// const ContractParameter = ({ +// label, +// value, +// }: { +// label: string; +// value: string; +// }) => ( +// +// {label} +// +// {value} +// +// ); export const StakingContractSection = ({ stakingProgram, diff --git a/frontend/service/Autonolas.ts b/frontend/service/Autonolas.ts index 2a6b9c3fb..b0e9e74d6 100644 --- a/frontend/service/Autonolas.ts +++ b/frontend/service/Autonolas.ts @@ -89,7 +89,6 @@ const getAgentStakingRewardsInfo = async ({ ].calculateStakingReward(serviceId), serviceStakingTokenMechUsageContracts[stakingProgram].minStakingDeposit(), serviceStakingTokenMechUsageContracts[stakingProgram].tsCheckpoint(), - serviceStakingTokenMechUsageContracts[stakingProgram].minStakingDuration(), ]; await gnosisMulticallProvider.init(); @@ -105,7 +104,6 @@ const getAgentStakingRewardsInfo = async ({ accruedStakingReward, minStakingDeposit, tsCheckpoint, - minStakingDuration, ] = multicallResponse; /** From e56fa4e0133799a15c3a0b4f7308a2a56853fde4 Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 19:43:32 +0100 Subject: [PATCH 111/134] bump: 112 --- electron/install.js | 2 +- package.json | 2 +- pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/electron/install.js b/electron/install.js index 23cda3da0..7988e07fa 100644 --- a/electron/install.js +++ b/electron/install.js @@ -14,7 +14,7 @@ const { paths } = require('./constants'); * - use "" (nothing as a suffix) for latest release candidate, for example "0.1.0rc26" * - use "alpha" for alpha release, for example "0.1.0rc26-alpha" */ -const OlasMiddlewareVersion = '0.1.0rc110'; +const OlasMiddlewareVersion = '0.1.0rc112'; const path = require('path'); const { app } = require('electron'); diff --git a/package.json b/package.json index a813f31fc..857c15b20 100644 --- a/package.json +++ b/package.json @@ -59,5 +59,5 @@ "build:pearl": "sh build_pearl.sh" }, - "version": "0.1.0-rc110" + "version": "0.1.0-rc112" } diff --git a/pyproject.toml b/pyproject.toml index ee2657faf..b77f08413 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "olas-operate-middleware" -version = "0.1.0-rc110" +version = "0.1.0-rc112" description = "" authors = ["David Vilela ", "Viraj Patel "] readme = "README.md" From 9d70c41b69110e0a25e27386cbd585d3061194dc Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 19:48:46 +0100 Subject: [PATCH 112/134] fix: release.yml service_version --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 044325707..a07e5fe40 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -44,7 +44,7 @@ jobs: - name: Get trader bin run: | - trader_version=$(poetry run python -c "import yaml; config = yaml.safe_load(open('templates/trader.yaml')); print(config['trader_version'])") + trader_version=$(poetry run python -c "import yaml; config = yaml.safe_load(open('templates/trader.yaml')); print(config['service_version'])") echo $trader_version mkdir dist && curl -L -o dist/aea_bin "https://github.com/valory-xyz/trader/releases/download/${trader_version}/trader_bin_${{ env.OS_ARCH }}" From 9f2ed5b10501e6530d749d88df8dcff8ae8d4f65 Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 19:54:41 +0100 Subject: [PATCH 113/134] refactor: update chain data types --- frontend/hooks/useServices.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/hooks/useServices.ts b/frontend/hooks/useServices.ts index 595dca84c..3fa3cfda7 100644 --- a/frontend/hooks/useServices.ts +++ b/frontend/hooks/useServices.ts @@ -13,7 +13,11 @@ const checkServiceIsFunded = async ( serviceTemplate: ServiceTemplate, ): Promise => { const { - chain_data: { instances, multisig }, + chain_configs: { + [CHAINS.GNOSIS.chainId]: { + chain_data: { instances, multisig }, + }, + }, } = service; if (!instances || !multisig) return false; From e66dedae2ac6afb380f1ddd32ac23cf6a0926ee3 Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 21:08:18 +0100 Subject: [PATCH 114/134] fix: dynamic olas requirement dependant on staking program --- .../MainPage/header/AgentButton.tsx | 22 ++++++++++------- .../StakingContractSection/index.tsx | 24 +++++++++++-------- frontend/context/StakingProgramContext.tsx | 10 ++++---- frontend/hooks/useStakingProgram.ts | 7 ++++-- frontend/utils/service.ts | 24 +++++++++++-------- 5 files changed, 52 insertions(+), 35 deletions(-) diff --git a/frontend/components/MainPage/header/AgentButton.tsx b/frontend/components/MainPage/header/AgentButton.tsx index c58cdd3b9..4bd0e0a17 100644 --- a/frontend/components/MainPage/header/AgentButton.tsx +++ b/frontend/components/MainPage/header/AgentButton.tsx @@ -5,6 +5,7 @@ import { useCallback, useMemo } from 'react'; import { Chain, DeploymentStatus } from '@/client'; import { COLOR } from '@/constants/colors'; import { LOW_BALANCE } from '@/constants/thresholds'; +import { StakingProgram } from '@/enums/StakingProgram'; import { useBalance } from '@/hooks/useBalance'; import { useElectronApi } from '@/hooks/useElectronApi'; import { useServices } from '@/hooks/useServices'; @@ -106,14 +107,17 @@ const AgentNotRunningButton = () => { totalEthBalance, } = useBalance(); const { storeState } = useStore(); - const { isEligibleForStaking, isAgentEvicted, stakingContractInfoRecord } = - useStakingContractInfo(); + const { isEligibleForStaking, isAgentEvicted } = useStakingContractInfo(); const { activeStakingProgram, defaultStakingProgram } = useStakingProgram(); - const minStakingDeposit = - stakingContractInfoRecord?.[activeStakingProgram ?? defaultStakingProgram] - ?.minStakingDeposit; - const requiredOlas = minStakingDeposit && minStakingDeposit * 2; + // const minStakingDeposit = + // stakingContractInfoRecord?.[activeStakingProgram ?? defaultStakingProgram] + // ?.minStakingDeposit; + + const requiredOlas = getMinimumStakedAmountRequired( + serviceTemplate, + activeStakingProgram ?? defaultStakingProgram, + ); const safeOlasBalance = safeBalance?.OLAS; const safeOlasBalanceWithStaked = @@ -169,8 +173,10 @@ const AgentNotRunningButton = () => { if (!service) { showNotification?.('Your agent is now running!'); } else { - const minimumStakedAmountRequired = - getMinimumStakedAmountRequired(serviceTemplate); + const minimumStakedAmountRequired = getMinimumStakedAmountRequired( + serviceTemplate, + StakingProgram.Beta, // users should always deploy on Beta if they are yet to start their agent + ); showNotification?.( `Your agent is running and you've staked ${minimumStakedAmountRequired} OLAS!`, diff --git a/frontend/components/ManageStakingPage/StakingContractSection/index.tsx b/frontend/components/ManageStakingPage/StakingContractSection/index.tsx index b07f07749..227cb6758 100644 --- a/frontend/components/ManageStakingPage/StakingContractSection/index.tsx +++ b/frontend/components/ManageStakingPage/StakingContractSection/index.tsx @@ -69,27 +69,31 @@ export const StakingContractSection = ({ const { totalOlasBalance, isBalanceLoaded } = useBalance(); const { isServiceStakedForMinimumDuration } = useStakingContractInfo(); - const stakingContractInfo = stakingContractInfoRecord?.[stakingProgram]; + const stakingContractInfoForStakingProgram = + stakingContractInfoRecord?.[stakingProgram]; const activeStakingProgramMeta = STAKING_PROGRAM_META[stakingProgram]; const isSelected = activeStakingProgram && activeStakingProgram === stakingProgram; - const hasEnoughRewards = (stakingContractInfo?.availableRewards ?? 0) > 0; + const hasEnoughRewards = + (stakingContractInfoForStakingProgram?.availableRewards ?? 0) > 0; const hasEnoughOlasToMigrate = useMemo(() => { if (totalOlasBalance === undefined) return false; - if (!stakingContractInfo) return false; - if (!stakingContractInfo.minStakingDeposit) return false; - return totalOlasBalance > stakingContractInfo?.minStakingDeposit; - }, [stakingContractInfo, totalOlasBalance]); + if (!stakingContractInfoForStakingProgram) return false; + if (!stakingContractInfoForStakingProgram.minStakingDeposit) return false; + return ( + totalOlasBalance > stakingContractInfoForStakingProgram?.minStakingDeposit + ); + }, [stakingContractInfoForStakingProgram, totalOlasBalance]); const hasEnoughSlots = - stakingContractInfo?.maxNumServices && - stakingContractInfo?.serviceIds && - stakingContractInfo?.maxNumServices > - stakingContractInfo?.serviceIds?.length; + stakingContractInfoForStakingProgram?.maxNumServices && + stakingContractInfoForStakingProgram?.serviceIds && + stakingContractInfoForStakingProgram?.maxNumServices > + stakingContractInfoForStakingProgram?.serviceIds?.length; // TODO: compatibility needs to be implemented const isAppVersionCompatible = true; // contract.appVersion === 'rc105'; diff --git a/frontend/context/StakingProgramContext.tsx b/frontend/context/StakingProgramContext.tsx index 290f1d607..fecdf645c 100644 --- a/frontend/context/StakingProgramContext.tsx +++ b/frontend/context/StakingProgramContext.tsx @@ -9,11 +9,11 @@ import { AutonolasService } from '@/service/Autonolas'; export const StakingProgramContext = createContext<{ activeStakingProgram?: StakingProgram | null; defaultStakingProgram: StakingProgram; - updateStakingProgram: () => Promise; + updateActiveStakingProgram: () => Promise; }>({ activeStakingProgram: undefined, defaultStakingProgram: StakingProgram.Beta, - updateStakingProgram: async () => {}, + updateActiveStakingProgram: async () => {}, }); /** Determines the current active staking program, if any */ @@ -23,7 +23,7 @@ export const StakingProgramProvider = ({ children }: PropsWithChildren) => { const [activeStakingProgram, setActiveStakingProgram] = useState(); - const updateStakingProgram = useCallback(async () => { + const updateActiveStakingProgram = useCallback(async () => { // if no service nft, not staked const serviceId = service?.chain_configs[CHAINS.GNOSIS.chainId].chain_data?.token; @@ -43,13 +43,13 @@ export const StakingProgramProvider = ({ children }: PropsWithChildren) => { } }, [service]); - useInterval(updateStakingProgram, 5000); + useInterval(updateActiveStakingProgram, 5000); return ( diff --git a/frontend/hooks/useStakingProgram.ts b/frontend/hooks/useStakingProgram.ts index 585bcab49..8d07739be 100644 --- a/frontend/hooks/useStakingProgram.ts +++ b/frontend/hooks/useStakingProgram.ts @@ -8,8 +8,11 @@ import { StakingProgramContext } from '@/context/StakingProgramContext'; * @returns {currentStakingProgram: IncentiveProgram} */ export const useStakingProgram = () => { - const { activeStakingProgram, defaultStakingProgram, updateStakingProgram } = - useContext(StakingProgramContext); + const { + activeStakingProgram, + defaultStakingProgram, + updateActiveStakingProgram: updateStakingProgram, + } = useContext(StakingProgramContext); const isLoadedActiveStakingProgram = activeStakingProgram !== undefined; diff --git a/frontend/utils/service.ts b/frontend/utils/service.ts index 5d69e2e2f..5a957ce93 100644 --- a/frontend/utils/service.ts +++ b/frontend/utils/service.ts @@ -1,17 +1,21 @@ -import { formatUnits } from 'ethers/lib/utils'; - import { ServiceTemplate } from '@/client'; -import { CHAINS } from '@/constants/chains'; +import { StakingProgram } from '@/enums/StakingProgram'; +/** TODO: update from hardcoded, workaround for quick release */ export const getMinimumStakedAmountRequired = ( serviceTemplate: ServiceTemplate, + stakingProgram: StakingProgram = StakingProgram.Beta, ) => { - const olasCostOfBond = Number( - formatUnits( - `${serviceTemplate.configurations[CHAINS.GNOSIS.chainId].cost_of_bond}`, - 18, - ), - ); + // const olasCostOfBond = Number( + // formatUnits( + // `${serviceTemplate.configurations[CHAINS.GNOSIS.chainId].cost_of_bond}`, + // 18, + // ), + // ); + + if (stakingProgram === StakingProgram.Alpha) { + return 20; + } - return olasCostOfBond * 2; + return 40; }; From 8680d1bdd34bb45bdcaf6b43439e9da4bfe2c092 Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 21:09:53 +0100 Subject: [PATCH 115/134] fix: migration requirement --- .../ManageStakingPage/StakingContractSection/index.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/components/ManageStakingPage/StakingContractSection/index.tsx b/frontend/components/ManageStakingPage/StakingContractSection/index.tsx index 227cb6758..4b1e52a0b 100644 --- a/frontend/components/ManageStakingPage/StakingContractSection/index.tsx +++ b/frontend/components/ManageStakingPage/StakingContractSection/index.tsx @@ -17,6 +17,7 @@ import { useStakingContractInfo } from '@/hooks/useStakingContractInfo'; import { useStakingProgram } from '@/hooks/useStakingProgram'; import { ServicesService } from '@/service/Services'; import { Address } from '@/types/Address'; +import { getMinimumStakedAmountRequired } from '@/utils/service'; import { AlertInsufficientMigrationFunds, @@ -85,9 +86,10 @@ export const StakingContractSection = ({ if (!stakingContractInfoForStakingProgram) return false; if (!stakingContractInfoForStakingProgram.minStakingDeposit) return false; return ( - totalOlasBalance > stakingContractInfoForStakingProgram?.minStakingDeposit + totalOlasBalance >= + getMinimumStakedAmountRequired(serviceTemplate, StakingProgram.Beta) ); - }, [stakingContractInfoForStakingProgram, totalOlasBalance]); + }, [serviceTemplate, stakingContractInfoForStakingProgram, totalOlasBalance]); const hasEnoughSlots = stakingContractInfoForStakingProgram?.maxNumServices && From 43b603c8d4d94b48630356e48f46e71bef440489 Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 21:16:42 +0100 Subject: [PATCH 116/134] refactor: update minimum OLAS balance requirement for migration --- .../StakingContractSection/index.tsx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/frontend/components/ManageStakingPage/StakingContractSection/index.tsx b/frontend/components/ManageStakingPage/StakingContractSection/index.tsx index 4b1e52a0b..d361ee1cb 100644 --- a/frontend/components/ManageStakingPage/StakingContractSection/index.tsx +++ b/frontend/components/ManageStakingPage/StakingContractSection/index.tsx @@ -81,15 +81,16 @@ export const StakingContractSection = ({ const hasEnoughRewards = (stakingContractInfoForStakingProgram?.availableRewards ?? 0) > 0; + const minimumOlasRequiredToMigrate = useMemo( + () => getMinimumStakedAmountRequired(serviceTemplate, StakingProgram.Beta), + [serviceTemplate], + ); + const hasEnoughOlasToMigrate = useMemo(() => { if (totalOlasBalance === undefined) return false; - if (!stakingContractInfoForStakingProgram) return false; - if (!stakingContractInfoForStakingProgram.minStakingDeposit) return false; - return ( - totalOlasBalance >= - getMinimumStakedAmountRequired(serviceTemplate, StakingProgram.Beta) - ); - }, [serviceTemplate, stakingContractInfoForStakingProgram, totalOlasBalance]); + if (!minimumOlasRequiredToMigrate) return false; + return totalOlasBalance >= minimumOlasRequiredToMigrate; + }, [minimumOlasRequiredToMigrate, totalOlasBalance]); const hasEnoughSlots = stakingContractInfoForStakingProgram?.maxNumServices && @@ -123,7 +124,7 @@ export const StakingContractSection = ({ } if (activeStakingProgram !== StakingProgram.Alpha) { - return 'Can only migrate from Alpha'; + return 'Can only migrate from Alpha to Beta'; } if (!isBalanceLoaded) { @@ -135,7 +136,7 @@ export const StakingContractSection = ({ } if (!hasEnoughOlasToMigrate) { - return 'Insufficient OLAS balance to migrate'; + return 'Insufficient OLAS balance to migrate, need ${}'; } if (!isAppVersionCompatible) { From 3dfebf55378ab9b498404570a38ed14d7f3b193f Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 21:23:27 +0100 Subject: [PATCH 117/134] refactor: force rewards availability check to true --- .../ManageStakingPage/StakingContractSection/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/components/ManageStakingPage/StakingContractSection/index.tsx b/frontend/components/ManageStakingPage/StakingContractSection/index.tsx index d361ee1cb..b8fdf664c 100644 --- a/frontend/components/ManageStakingPage/StakingContractSection/index.tsx +++ b/frontend/components/ManageStakingPage/StakingContractSection/index.tsx @@ -78,8 +78,8 @@ export const StakingContractSection = ({ const isSelected = activeStakingProgram && activeStakingProgram === stakingProgram; - const hasEnoughRewards = - (stakingContractInfoForStakingProgram?.availableRewards ?? 0) > 0; + const hasEnoughRewards = true; + //(stakingContractInfoForStakingProgram?.availableRewards ?? 0) > 0; const minimumOlasRequiredToMigrate = useMemo( () => getMinimumStakedAmountRequired(serviceTemplate, StakingProgram.Beta), From 5a27881304e3c4c3528de58a996c7865898f6d40 Mon Sep 17 00:00:00 2001 From: truemiller Date: Fri, 16 Aug 2024 21:24:28 +0100 Subject: [PATCH 118/134] fix: default rewards availiability to true --- frontend/hooks/useStakingContractInfo.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/hooks/useStakingContractInfo.ts b/frontend/hooks/useStakingContractInfo.ts index 089183260..460f74613 100644 --- a/frontend/hooks/useStakingContractInfo.ts +++ b/frontend/hooks/useStakingContractInfo.ts @@ -23,7 +23,7 @@ export const useStakingContractInfo = () => { minimumStakingDuration, } = activeStakingContractInfo; - const isRewardsAvailable = availableRewards > 0; + const isRewardsAvailable = true; // availableRewards > 0; const hasEnoughServiceSlots = serviceIds.length < maxNumServices; const hasEnoughRewardsAndSlots = isRewardsAvailable && hasEnoughServiceSlots; From 59474d11b421922147eb9871764aef96bf7004a9 Mon Sep 17 00:00:00 2001 From: Ardian Date: Tue, 20 Aug 2024 12:33:02 +0200 Subject: [PATCH 119/134] fix: trader hash --- templates/trader.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/trader.yaml b/templates/trader.yaml index 934b2afbb..ac7f44159 100644 --- a/templates/trader.yaml +++ b/templates/trader.yaml @@ -1,6 +1,6 @@ name: "Trader Agent" description: "A single-agent service (sovereign agent) placing bets on Omen" -hash: bafybeidgjgjj5ul6xkubicbemppufgsbx5sr5rwhtrwttk2oivp5bkdnce +hash: bafybeiembjbkmym3ppclc2qnjuwzayibqp4vsv3lfq56fqelqfu6ytgv5i image: https://operate.olas.network/_next/image?url=%2Fimages%2Fprediction-agent.png&w=3840&q=75 service_version: v0.18.1 home_chain_id: 100 From 4ce058e879f5861a2b20e6f27117c0e587ef85ea Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Tue, 20 Aug 2024 16:57:15 +0200 Subject: [PATCH 120/134] chore: isort --- operate/ledger/profiles.py | 2 +- operate/services/protocol.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/operate/ledger/profiles.py b/operate/ledger/profiles.py index c70e9bf27..bf7fa8433 100644 --- a/operate/ledger/profiles.py +++ b/operate/ledger/profiles.py @@ -38,7 +38,7 @@ STAKING = { ChainType.GNOSIS: { "pearl_alpha": "0xEE9F19b5DF06c7E8Bfc7B28745dcf944C504198A", - "pearl_beta": "0xeF44Fb0842DDeF59D37f85D61A1eF492bbA6135d" + "pearl_beta": "0xeF44Fb0842DDeF59D37f85D61A1eF492bbA6135d", } } diff --git a/operate/services/protocol.py b/operate/services/protocol.py index a7b3135fc..120355c94 100644 --- a/operate/services/protocol.py +++ b/operate/services/protocol.py @@ -40,7 +40,8 @@ from autonomy.chain.config import ChainConfigs, ChainType, ContractConfigs from autonomy.chain.constants import ( GNOSIS_SAFE_PROXY_FACTORY_CONTRACT, - GNOSIS_SAFE_SAME_ADDRESS_MULTISIG_CONTRACT, MULTISEND_CONTRACT, + GNOSIS_SAFE_SAME_ADDRESS_MULTISIG_CONTRACT, + MULTISEND_CONTRACT, ) from autonomy.chain.service import ( get_agent_instances, @@ -67,9 +68,10 @@ from operate.types import ContractAddresses from operate.utils.gnosis import ( MultiSendOperation, + NULL_ADDRESS, SafeOperation, hash_payload_to_hex, - skill_input_hex_to_payload, NULL_ADDRESS, + skill_input_hex_to_payload, ) from operate.wallet.master import MasterWallet From 8a8e675f2a0b0dd54ebc3dcdb35bebdbf69ec106 Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Tue, 20 Aug 2024 16:59:27 +0200 Subject: [PATCH 121/134] fix: update user params --- operate/cli.py | 9 +++++++++ operate/services/manage.py | 37 +++++++++++++++++++++++++++---------- operate/services/service.py | 8 ++++++++ 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/operate/cli.py b/operate/cli.py index 1eac6a3b6..f4632b70c 100644 --- a/operate/cli.py +++ b/operate/cli.py @@ -504,6 +504,14 @@ async def _create_services(request: Request) -> JSONResponse: if operate.password is None: return USER_NOT_LOGGED_IN_ERROR template = await request.json() + + print("!!!!!!!!!!!!!!!!") + from icecream import ic + + ic(template) + print(template) + import sys + manager = operate.service_manager() if len(manager.json) > 0: old_hash = manager.json[0]["hash"] @@ -528,6 +536,7 @@ async def _create_services(request: Request) -> JSONResponse: ) if template.get("deploy", False): + def _fn() -> None: manager.deploy_service_onchain_from_safe(hash=service.hash) # manager.stake_service_on_chain_from_safe(hash=service.hash) # Done inside deploy_service_onchain diff --git a/operate/services/manage.py b/operate/services/manage.py index 730ec5c8d..6acf0b462 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -48,10 +48,7 @@ OnChainUserParams, Service, ) -from operate.types import ( - ServiceTemplate, - LedgerConfig -) +from operate.types import LedgerConfig, ServiceTemplate from operate.utils.gnosis import NULL_ADDRESS from operate.wallet.master import MasterWalletManager @@ -159,7 +156,12 @@ def load_or_create( """ path = self.path / hash if path.exists(): - return Service.load(path=path) + service = Service.load(path=path) + + if service_template is not None: + service.update_user_params_from_template(service_template=service_template) + + return service if service_template is None: raise ValueError( @@ -878,8 +880,8 @@ def stake_service_on_chain_from_safe(self, hash: str, chain_id: str) -> None: ledger_config = chain_config.ledger_config chain_data = chain_config.chain_data user_params = chain_data.user_params - target_staking_program_id = user_params.staking_program_id - target_staking_contract = STAKING[ledger_config.chain][target_staking_program_id] + target_staking_program = user_params.staking_program_id + target_staking_contract = STAKING[ledger_config.chain][target_staking_program] sftxb = self.get_eth_safe_tx_builder(ledger_config=ledger_config) # TODO fixme @@ -925,13 +927,27 @@ def stake_service_on_chain_from_safe(self, hash: str, chain_id: str) -> None: service_id=chain_config.chain_data.token, staking_contract=target_staking_contract, ) + self.logger.info("Checking conditions to stake.") + + staking_rewards_available = sftxb.staking_rewards_available(target_staking_contract) + staking_slots_available = sftxb.staking_slots_available(target_staking_contract) + on_chain_state = self._get_on_chain_state(chain_config=chain_config) + current_staking_program = self._get_current_staking_program(chain_data, ledger_config, sftxb) + + self.logger.info(f"use_staking={chain_config.chain_data.user_params.use_staking}") + self.logger.info(f"{staking_state=}") + self.logger.info(f"{staking_rewards_available=}") + self.logger.info(f"{staking_slots_available=}") + self.logger.info(f"{on_chain_state=}") + self.logger.info(f"{current_staking_program=}") + self.logger.info(f"{target_staking_program=}") if ( chain_config.chain_data.user_params.use_staking and staking_state == StakingState.UNSTAKED - and sftxb.staking_rewards_available(target_staking_contract) - and sftxb.staking_slots_available(target_staking_contract) - and self._get_on_chain_state(chain_config=chain_config) == OnChainState.DEPLOYED + and staking_rewards_available + and staking_slots_available + and on_chain_state == OnChainState.DEPLOYED ): self.logger.info(f"Approving staking: {chain_config.chain_data.token}") sftxb.new_tx().add( @@ -955,6 +971,7 @@ def stake_service_on_chain_from_safe(self, hash: str, chain_id: str) -> None: service.store() current_staking_program = self._get_current_staking_program(chain_data, ledger_config, sftxb) + self.logger.info(f"{target_staking_program=}") self.logger.info(f"{current_staking_program=}") def unstake_service_on_chain(self, hash: str) -> None: diff --git a/operate/services/service.py b/operate/services/service.py index 6a476866b..ea6c563ca 100644 --- a/operate/services/service.py +++ b/operate/services/service.py @@ -777,6 +777,14 @@ def new( service.store() return service + def update_user_params_from_template(self, service_template: ServiceTemplate): + """Update user params from template.""" + for chain, config in service_template["configurations"].items(): + for chain, config in service_template["configurations"].items(): + self.chain_configs[chain].chain_data.user_params = OnChainUserParams.from_json(config) + + self.store() + def delete(self) -> None: """Delete a service.""" parent_directory = self.path.parent From 138c553da527df48e57c8a4b0374fc472332940a Mon Sep 17 00:00:00 2001 From: jmoreira-valory Date: Tue, 20 Aug 2024 17:08:12 +0200 Subject: [PATCH 122/134] chore: whitespace --- operate/cli.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/operate/cli.py b/operate/cli.py index f4632b70c..7d5285d13 100644 --- a/operate/cli.py +++ b/operate/cli.py @@ -504,14 +504,6 @@ async def _create_services(request: Request) -> JSONResponse: if operate.password is None: return USER_NOT_LOGGED_IN_ERROR template = await request.json() - - print("!!!!!!!!!!!!!!!!") - from icecream import ic - - ic(template) - print(template) - import sys - manager = operate.service_manager() if len(manager.json) > 0: old_hash = manager.json[0]["hash"] From 0f9f5dc0eb4e8a6e2a5a1f107a3a141aff25d9c5 Mon Sep 17 00:00:00 2001 From: truemiller Date: Tue, 20 Aug 2024 17:17:53 +0100 Subject: [PATCH 123/134] bump: rc114 --- electron/install.js | 2 +- package.json | 5 ++--- pyproject.toml | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/electron/install.js b/electron/install.js index 7988e07fa..35eed6e98 100644 --- a/electron/install.js +++ b/electron/install.js @@ -14,7 +14,7 @@ const { paths } = require('./constants'); * - use "" (nothing as a suffix) for latest release candidate, for example "0.1.0rc26" * - use "alpha" for alpha release, for example "0.1.0rc26-alpha" */ -const OlasMiddlewareVersion = '0.1.0rc112'; +const OlasMiddlewareVersion = '0.1.0rc114'; const path = require('path'); const { app } = require('electron'); diff --git a/package.json b/package.json index 857c15b20..24c7fc52b 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,6 @@ "test:frontend": "cd frontend && yarn test", "download-binaries": "sh download_binaries.sh", "build:pearl": "sh build_pearl.sh" - }, - "version": "0.1.0-rc112" -} + "version": "0.1.0-rc114" +} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index b77f08413..a9462612f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "olas-operate-middleware" -version = "0.1.0-rc112" +version = "0.1.0-rc114" description = "" authors = ["David Vilela ", "Viraj Patel "] readme = "README.md" From 2e368cbf003675e003e53df9aea2083f8796a4ae Mon Sep 17 00:00:00 2001 From: truemiller Date: Tue, 20 Aug 2024 18:15:25 +0100 Subject: [PATCH 124/134] fix: conflict resolution, electron-store 8.2 pin --- electron/store.js | 5 +- frontend/context/BalanceProvider.tsx | 23 +++ package.json | 2 +- yarn.lock | 232 ++++++++++++++++++--------- 4 files changed, 180 insertions(+), 82 deletions(-) diff --git a/electron/store.js b/electron/store.js index b8c5c9093..eafd9428a 100644 --- a/electron/store.js +++ b/electron/store.js @@ -1,3 +1,4 @@ +const Store = require('electron-store'); // set schema to validate store data const schema = { isInitialFunded: { type: 'boolean', default: false }, // TODO: reconsider this default, can be problematic if user has already funded prior to implementation @@ -16,8 +17,6 @@ const schema = { * @returns {Promise} - A promise that resolves once the store is set up. */ const setupStoreIpc = async (ipcMain, mainWindow) => { - const Store = (await import("electron-store")).default; - const store = new Store({ schema }); store.onDidAnyChange((data) => { @@ -30,7 +29,7 @@ const setupStoreIpc = async (ipcMain, mainWindow) => { ipcMain.handle('store-get', (_, key) => store.get(key)); ipcMain.handle('store-set', (_, key, value) => store.set(key, value)); ipcMain.handle('store-delete', (_, key) => store.delete(key)); - ipcMain.handle('store-clear', (_) => store.clear()); + ipcMain.handle('store-clear', (_) => store.clear()); }; module.exports = { setupStoreIpc }; diff --git a/frontend/context/BalanceProvider.tsx b/frontend/context/BalanceProvider.tsx index cc417462a..dfcc70e6c 100644 --- a/frontend/context/BalanceProvider.tsx +++ b/frontend/context/BalanceProvider.tsx @@ -17,6 +17,10 @@ import { useInterval } from 'usehooks-ts'; import { Wallet } from '@/client'; import { CHAINS } from '@/constants/chains'; import { FIVE_SECONDS_INTERVAL } from '@/constants/intervals'; +import { + LOW_AGENT_SAFE_BALANCE, + LOW_MASTER_SAFE_BALANCE, +} from '@/constants/thresholds'; import { TOKENS } from '@/constants/tokens'; import { ServiceRegistryL2ServiceState } from '@/enums/ServiceRegistryL2ServiceState'; import { Token } from '@/enums/Token'; @@ -44,6 +48,7 @@ export const BalanceContext = createContext<{ safeBalance?: ValueOf; totalEthBalance?: number; totalOlasBalance?: number; + isLowBalance: boolean; wallets?: Wallet[]; walletBalances: WalletAddressNumberRecord; updateBalances: () => Promise; @@ -59,6 +64,7 @@ export const BalanceContext = createContext<{ safeBalance: undefined, totalEthBalance: undefined, totalOlasBalance: undefined, + isLowBalance: false, wallets: undefined, walletBalances: {}, updateBalances: async () => {}, @@ -197,6 +203,22 @@ export const BalanceProvider = ({ children }: PropsWithChildren) => { () => masterSafeAddress && walletBalances[masterSafeAddress], [masterSafeAddress, walletBalances], ); + const agentSafeBalance = useMemo( + () => + services?.[0]?.chain_data?.multisig && + walletBalances[services[0].chain_data.multisig], + [services, walletBalances], + ); + const isLowBalance = useMemo(() => { + if (!safeBalance || !agentSafeBalance) return false; + if ( + safeBalance.ETH < LOW_MASTER_SAFE_BALANCE && + // Need to check agentSafe balance as well, because it's auto-funded from safeBalance + agentSafeBalance.ETH < LOW_AGENT_SAFE_BALANCE + ) + return true; + return false; + }, [safeBalance, agentSafeBalance]); useInterval( () => { @@ -217,6 +239,7 @@ export const BalanceProvider = ({ children }: PropsWithChildren) => { safeBalance, totalEthBalance, totalOlasBalance, + isLowBalance, wallets, walletBalances, updateBalances, diff --git a/package.json b/package.json index b90fa2de7..c5afe288e 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "cross-env": "^7.0.3", "dotenv": "^16.4.5", "electron-log": "^5.1.4", - "electron-store": "^9.0.0", + "electron-store": "8.2.0", "electron-updater": "^6.1.8", "ethers": "5.7.2", "ethers-multicall": "^0.2.3", diff --git a/yarn.lock b/yarn.lock index 0d084c194..146feb635 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1347,7 +1347,7 @@ ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.12.0: +ajv@^8.0.0: version "8.16.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.16.0.tgz#22e2a92b94f005f7e0f9c9d39652ef0b8f6f0cb4" integrity sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw== @@ -1357,6 +1357,16 @@ ajv@^8.0.0, ajv@^8.12.0: require-from-string "^2.0.2" uri-js "^4.4.1" +ajv@^8.6.3: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + ansi-colors@^4.1.1, ansi-colors@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" @@ -1538,13 +1548,10 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -atomically@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/atomically/-/atomically-2.0.3.tgz#27e47bbe39994d324918491ba7c0edb7783e56cb" - integrity sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw== - dependencies: - stubborn-fs "^1.2.5" - when-exit "^2.1.1" +atomically@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/atomically/-/atomically-1.7.0.tgz#c07a0458432ea6dbc9a3506fffa424b48bccaafe" + integrity sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w== axios@^1.7.2: version "1.7.2" @@ -2024,20 +2031,21 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -conf@^12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/conf/-/conf-12.0.0.tgz#de7a5f091114a28bc52aa5eecc920f4710d60d7f" - integrity sha512-fIWyWUXrJ45cHCIQX+Ck1hrZDIf/9DR0P0Zewn3uNht28hbt5OfGUq8rRWsxi96pZWPyBEd0eY9ama01JTaknA== +conf@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/conf/-/conf-10.2.0.tgz#838e757be963f1a2386dfe048a98f8f69f7b55d6" + integrity sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg== dependencies: - ajv "^8.12.0" + ajv "^8.6.3" ajv-formats "^2.1.1" - atomically "^2.0.2" - debounce-fn "^5.1.2" - dot-prop "^8.0.2" - env-paths "^3.0.0" - json-schema-typed "^8.0.1" - semver "^7.5.4" - uint8array-extras "^0.3.0" + atomically "^1.7.0" + debounce-fn "^4.0.0" + dot-prop "^6.0.1" + env-paths "^2.2.1" + json-schema-typed "^7.0.3" + onetime "^5.1.2" + pkg-up "^3.1.0" + semver "^7.3.5" config-file-ts@^0.2.4: version "0.2.6" @@ -2139,12 +2147,12 @@ dayjs@^1.11.11: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.11.tgz#dfe0e9d54c5f8b68ccf8ca5f72ac603e7e5ed59e" integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg== -debounce-fn@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/debounce-fn/-/debounce-fn-5.1.2.tgz#c77bc447ef36828ecdd066df7de23f475e0a6281" - integrity sha512-Sr4SdOZ4vw6eQDvPYNxHogvrxmCIld/VenC5JbNrFwMiwd7lY/Z18ZFfo+EWNG4DD9nFlAujWAo/wGuOPHmy5A== +debounce-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/debounce-fn/-/debounce-fn-4.0.0.tgz#ed76d206d8a50e60de0dd66d494d82835ffe61c7" + integrity sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ== dependencies: - mimic-fn "^4.0.0" + mimic-fn "^3.0.0" debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5: version "4.3.5" @@ -2256,12 +2264,12 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dot-prop@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-8.0.2.tgz#afda6866610684dd155a96538f8efcdf78a27f18" - integrity sha512-xaBe6ZT4DHPkg0k4Ytbvn5xoxgpG0jOS1dYxSOwAHPuNLjP3/OzN0gH55SrLqpx8cBfSaVt91lXYkApjb+nYdQ== +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== dependencies: - type-fest "^3.8.0" + is-obj "^2.0.0" dotenv-cli@^7.4.2: version "7.4.2" @@ -2345,13 +2353,13 @@ electron-publish@24.13.1: lazy-val "^1.0.5" mime "^2.5.2" -electron-store@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-9.0.0.tgz#7ce8209c5ae31877ee5fbced6c6cb538c746ca8c" - integrity sha512-7LZ2dR3N3bF93G2c4x+1NZ/8fpsKv6bKrMxeOQWLqdRbxvopxVqy9QXQy9axSV2O3P1kVGTj1q2wq5/W4isiOg== +electron-store@8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-8.2.0.tgz#114e6e453e8bb746ab4ccb542424d8c881ad2ca1" + integrity sha512-ukLL5Bevdil6oieAOXz3CMy+OgaItMiVBg701MNlG6W5RaC0AHN7rvlqTCmeb6O7jP0Qa1KKYTE0xV0xbhF4Hw== dependencies: - conf "^12.0.0" - type-fest "^4.18.1" + conf "^10.2.0" + type-fest "^2.17.0" electron-updater@^6.1.8: version "6.2.1" @@ -2432,16 +2440,11 @@ enquirer@^2.3.0: ansi-colors "^4.1.1" strip-ansi "^6.0.1" -env-paths@^2.2.0: +env-paths@^2.2.0, env-paths@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -env-paths@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-3.0.0.tgz#2f1e89c2f6dbd3408e1b1711dd82d62e317f58da" - integrity sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A== - err-code@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" @@ -2742,6 +2745,11 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-uri@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" + integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== + fastq@^1.6.0: version "1.17.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" @@ -2789,6 +2797,13 @@ find-up@^2.1.0: dependencies: locate-path "^2.0.0" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -3371,6 +3386,11 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" @@ -3462,10 +3482,10 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-schema-typed@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/json-schema-typed/-/json-schema-typed-8.0.1.tgz#826ee39e3b6cef536f85412ff048d3ff6f19dfa0" - integrity sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg== +json-schema-typed@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/json-schema-typed/-/json-schema-typed-7.0.3.tgz#23ff481b8b4eebcd2ca123b4fa0409e66469a2d9" + integrity sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" @@ -3583,6 +3603,14 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -3728,10 +3756,15 @@ mime@^2.5.2: resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" + integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== mimic-response@^1.0.0: version "1.0.1" @@ -3949,6 +3982,13 @@ one-time@^1.0.0: dependencies: fn.name "1.x.x" +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -3978,6 +4018,13 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -3992,6 +4039,13 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + p-locate@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" @@ -4011,6 +4065,11 @@ p-try@^1.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + package-json-from-dist@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" @@ -4089,6 +4148,13 @@ picomatch@^2.0.4, picomatch@^2.2.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + plist@^3.0.4, plist@^3.0.5: version "3.1.0" resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" @@ -4800,11 +4866,16 @@ semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: +semver@^7.3.2, semver@^7.3.8, semver@^7.5.3: version "7.6.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== +semver@^7.3.5: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + serialize-error@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" @@ -4971,7 +5042,16 @@ string-convert@^0.2.0: resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" integrity sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -4996,7 +5076,14 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -5022,11 +5109,6 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -stubborn-fs@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/stubborn-fs/-/stubborn-fs-1.2.5.tgz#e5e244223166921ddf66ed5e062b6b3bf285bfd2" - integrity sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g== - styled-components@^6.1.8: version "6.1.11" resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.11.tgz#01948e5195bf1d39e57e0a85b41958c80e40cfb8" @@ -5245,26 +5327,16 @@ type-fest@^0.7.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -type-fest@^3.8.0: - version "3.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" - integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== - -type-fest@^4.18.1: - version "4.21.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.21.0.tgz#2eec399d9bda4ac686286314d07c6675fef3fdd8" - integrity sha512-ADn2w7hVPcK6w1I0uWnM//y1rLXZhzB9mr0a3OirzclKF1Wp6VzevUmzz/NRAWunOT6E8HrnpGY7xOfc6K57fA== +type-fest@^2.17.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== typescript@^5.3.3: version "5.5.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.3.tgz#e1b0a3c394190838a0b168e771b0ad56a0af0faa" integrity sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ== -uint8array-extras@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/uint8array-extras/-/uint8array-extras-0.3.0.tgz#4b5714e4bf15bb36ae7fd6faeef11aae34a0af59" - integrity sha512-erJsJwQ0tKdwuqI0359U8ijkFmfiTcq25JvvzRVc1VP+2son1NJRXhxcAKJmAW3ajM8JSGAfsAXye8g4s+znxA== - undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" @@ -5330,11 +5402,6 @@ verror@^1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -when-exit@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/when-exit/-/when-exit-2.1.3.tgz#5831cdbed8ad4984645da98c4a00d4ee3a3757e7" - integrity sha512-uVieSTccFIr/SFQdFWN/fFaQYmV37OKtuaGphMAzi4DmmUlrvRBJW5WSLkHyjNQY/ePJMz3LoiX9R3yy1Su6Hw== - which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -5378,7 +5445,16 @@ workerpool@^6.5.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== From 5b237b9bf923fa8586fc922d2bc2622467b8e226 Mon Sep 17 00:00:00 2001 From: truemiller Date: Tue, 20 Aug 2024 18:18:44 +0100 Subject: [PATCH 125/134] fix: balance provider type merge conflict resolution --- frontend/context/BalanceProvider.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/frontend/context/BalanceProvider.tsx b/frontend/context/BalanceProvider.tsx index dfcc70e6c..2bee8e074 100644 --- a/frontend/context/BalanceProvider.tsx +++ b/frontend/context/BalanceProvider.tsx @@ -205,8 +205,11 @@ export const BalanceProvider = ({ children }: PropsWithChildren) => { ); const agentSafeBalance = useMemo( () => - services?.[0]?.chain_data?.multisig && - walletBalances[services[0].chain_data.multisig], + services?.[0]?.chain_configs[CHAINS.GNOSIS.chainId].chain_data + ?.multisig && + walletBalances[ + services[0].chain_configs[CHAINS.GNOSIS.chainId].chain_data.multisig! + ], [services, walletBalances], ); const isLowBalance = useMemo(() => { From bb4104acb4a66d5a1c77e5138c33be995be4c7de Mon Sep 17 00:00:00 2001 From: truemiller Date: Tue, 20 Aug 2024 18:30:09 +0100 Subject: [PATCH 126/134] fix: custom alert import --- frontend/components/MainPage/header/AgentButton.tsx | 2 -- frontend/components/MainPage/sections/NeedsFundsSection.tsx | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/frontend/components/MainPage/header/AgentButton.tsx b/frontend/components/MainPage/header/AgentButton.tsx index 24ac0e71f..6fcdbdea0 100644 --- a/frontend/components/MainPage/header/AgentButton.tsx +++ b/frontend/components/MainPage/header/AgentButton.tsx @@ -4,7 +4,6 @@ import { useCallback, useMemo } from 'react'; import { Chain, DeploymentStatus } from '@/client'; import { COLOR } from '@/constants/colors'; -import { LOW_BALANCE } from '@/constants/thresholds'; import { StakingProgram } from '@/enums/StakingProgram'; import { useBalance } from '@/hooks/useBalance'; import { useElectronApi } from '@/hooks/useElectronApi'; @@ -238,7 +237,6 @@ const AgentNotRunningButton = () => { return hasEnoughOlas && hasEnoughEth; }, [ serviceStatus, - safeBalance, service, storeState?.isInitialFunded, isEligibleForStaking, diff --git a/frontend/components/MainPage/sections/NeedsFundsSection.tsx b/frontend/components/MainPage/sections/NeedsFundsSection.tsx index 3b22c46f4..08ae82696 100644 --- a/frontend/components/MainPage/sections/NeedsFundsSection.tsx +++ b/frontend/components/MainPage/sections/NeedsFundsSection.tsx @@ -3,6 +3,7 @@ import { formatUnits } from 'ethers/lib/utils'; import { ReactNode, useEffect, useMemo } from 'react'; import styled from 'styled-components'; +import { CustomAlert } from '@/components/Alert'; import { CHAINS } from '@/constants/chains'; import { UNICODE_SYMBOLS } from '@/constants/symbols'; import { useBalance } from '@/hooks/useBalance'; @@ -11,8 +12,6 @@ import { useServiceTemplates } from '@/hooks/useServiceTemplates'; import { useStore } from '@/hooks/useStore'; import { getMinimumStakedAmountRequired } from '@/utils/service'; -import { CustomAlert } from '../../Alert'; -import { AlertTitle } from '../../Alert/AlertTitle'; import { CardSection } from '../../styled/CardSection'; const { Text } = Typography; From 4a9a0f8412a71eee34fdbbfb7e12feff76b6b04b Mon Sep 17 00:00:00 2001 From: Ardian Date: Tue, 20 Aug 2024 21:30:24 +0200 Subject: [PATCH 127/134] feat: support for multichain wallet --- operate/cli.py | 79 +++++++- operate/quickstart/run_service.py | 325 ------------------------------ operate/services/manage.py | 20 +- operate/services/protocol.py | 15 +- operate/wallet/master.py | 30 ++- 5 files changed, 110 insertions(+), 359 deletions(-) delete mode 100644 operate/quickstart/run_service.py diff --git a/operate/cli.py b/operate/cli.py index 66b3d135c..a50b26536 100644 --- a/operate/cli.py +++ b/operate/cli.py @@ -395,27 +395,33 @@ async def _create_wallet(request: Request) -> t.List[t.Dict]: @with_retries async def _get_safes(request: Request) -> t.List[t.Dict]: """Create wallet safe""" - safes = [] + all_safes = [] for wallet in operate.wallet_manager: - safes.append({wallet.ledger_type: wallet.safe}) - return JSONResponse(content=safes) + safes = [] + if wallet.safes is not None: + safes = list(wallet.safes.values()) + all_safes.append({wallet.ledger_type: safes}) + return JSONResponse(content=all_safes) @app.get("/api/wallet/safe/{chain}") @with_retries async def _get_safe(request: Request) -> t.List[t.Dict]: """Create wallet safe""" - ledger_type = get_ledger_type_from_chain_type( - chain=ChainType.from_string(request.path_params["chain"]) - ) + chain_type = ChainType.from_string(request.path_params["chain"]) + ledger_type = get_ledger_type_from_chain_type(chain=chain_type) manager = operate.wallet_manager if not manager.exists(ledger_type=ledger_type): return JSONResponse( content={"error": "Wallet does not exist"}, status_code=404, ) + safes = manager.load(ledger_type=ledger_type).safes + if safes is None or safes.get(chain_type) is None: + return JSONResponse(content={"error": "No safes found"}) + return JSONResponse( content={ - "safe": manager.load(ledger_type=ledger_type).safe, + "safe": safes[chain_type], }, ) @@ -443,22 +449,73 @@ async def _create_safe(request: Request) -> t.List[t.Dict]: return JSONResponse(content={"error": "Wallet does not exist"}) wallet = manager.load(ledger_type=ledger_type) - if wallet.safe is not None: + if wallet.safes is not None and wallet.safes.get(chain_type) is not None: return JSONResponse( - content={"safe": wallet.safe, "message": "Safe already exists!"} + content={"safe": wallet.safes.get(chain_type), "message": "Safe already exists!"} ) + safes = t.cast(t.Dict[ChainType, str], wallet.safes) wallet.create_safe( # pylint: disable=no-member chain_type=chain_type, owner=data.get("owner"), ) wallet.transfer( - to=t.cast(str, wallet.safe), + to=t.cast(str, safes.get(chain_type)), amount=int(1e18), chain_type=chain_type, from_safe=False, ) - return JSONResponse(content={"safe": wallet.safe, "message": "Safe created!"}) + return JSONResponse(content={"safe": safes.get(chain_type), "message": "Safe created!"}) + + + @app.post("/api/wallet/safes") + @with_retries + async def _create_safes(request: Request) -> t.List[t.Dict]: + """Create wallet safes""" + if operate.user_account is None: + return JSONResponse( + content={"error": "Cannot create safe; User account does not exist!"}, + status_code=400, + ) + + if operate.password is None: + return JSONResponse( + content={"error": "You need to login before creating a safe"}, + status_code=401, + ) + + data = await request.json() + chain_types = [ChainType(chain_type) for chain_type in data["chain_types"]] + # check that all chains are supported + for chain_type in chain_types: + ledger_type = get_ledger_type_from_chain_type(chain=chain_type) + manager = operate.wallet_manager + if not manager.exists(ledger_type=ledger_type): + return JSONResponse(content={"error": f"Wallet does not exist for chain_type {chain_type}"}) + + # mint the safes + for chain_type in chain_types: + ledger_type = get_ledger_type_from_chain_type(chain=chain_type) + manager = operate.wallet_manager + + wallet = manager.load(ledger_type=ledger_type) + if wallet.safes is not None and wallet.safes.get(chain_type) is not None: + logger.info(f"Safe already exists for chain_type {chain_type}") + continue + + safes = t.cast(t.Dict[ChainType, str], wallet.safes) + wallet.create_safe( # pylint: disable=no-member + chain_type=chain_type, + owner=data.get("owner"), + ) + wallet.transfer( + to=t.cast(str, safes.get(chain_type)), + amount=int(1e18), + chain_type=chain_type, + from_safe=False, + ) + + return JSONResponse(content={"safes": safes, "message": "Safes created!"}) @app.put("/api/wallet/safe") @with_retries diff --git a/operate/quickstart/run_service.py b/operate/quickstart/run_service.py deleted file mode 100644 index e602ab2ef..000000000 --- a/operate/quickstart/run_service.py +++ /dev/null @@ -1,325 +0,0 @@ -from pathlib import Path -from operate.cli import OperateApp -from operate.types import ( - LedgerType, - ServiceTemplate, - ConfigurationTemplate, - FundRequirementsTemplate, - OnChainUserParams, - OnChainFundRequirements, -) -from operate.account.user import UserAccount -import time -import sys -import getpass -import requests -import typing as t -import os -from halo import Halo -from termcolor import colored -from icecream import ic -from dotenv import load_dotenv - -load_dotenv() - -RPC = os.getenv('DEV_RPC') -if not RPC: - raise ValueError("No DEV_RPC provided") - -OLAS_BALANCE_REQUIRED_TO_BOND = 10_000_000_000_000_000_000 -OLAS_BALANCE_REQUIRED_TO_STAKE = 10_000_000_000_000_000_000 -NATIVE_BALANCE_REQUIRED_TO_BOND = 10_000_000_000_000_000 -SUGGESTED_TOP_UP_DEFAULT = 50_000_000_000_000_000 -SUGGESTED_SAFE_TOP_UP_DEFAULT = 500_000_000_000_000_000 -MASTER_WALLET_MIMIMUM_BALANCE = 1_000_000_000_000_000_000 -WARNING_ICON = colored('\u26A0', 'yellow') -OPERATE_HOME = Path.cwd() / ".operate2" -NATIVE_TOKEN_NAME = "ETH" - -TEMPLATE = ServiceTemplate( - { - "name": "optimism_service", - "hash": "bafybeihy3rom5x3f42ys6btjihtvkmxaqn56jg3o4e7wu3g72vwkxodcfi", - # "hash": "bafybeibbloa4w33vj4bvdkso7pzk6tr3duvxjpecbx4mur4ix6ehnwb5uu", - "description": "Superfest service", - "image": "https://operate.olas.network/_next/image?url=%2Fimages%2Fprediction-agent.png&w=3840&q=75", - "service_version": 'v0.1.0', - "home_chain_id": "10", - "configurations": { - "10": ConfigurationTemplate( # Registry + staking configuration - { - "rpc": RPC, - "nft": "bafybeig64atqaladigoc3ds4arltdu63wkdrk3gesjfvnfdmz35amv7faq", - "agent_id": 14, - "cost_of_bond": NATIVE_BALANCE_REQUIRED_TO_BOND, - "olas_cost_of_bond": OLAS_BALANCE_REQUIRED_TO_BOND, - "olas_required_to_stake": OLAS_BALANCE_REQUIRED_TO_STAKE, - "threshold": 1, - "use_staking": False, - "fund_requirements": FundRequirementsTemplate( - { - "agent": SUGGESTED_TOP_UP_DEFAULT, - "safe": SUGGESTED_SAFE_TOP_UP_DEFAULT, - } - ), - } - ) - }, - } -) - - -ocp1 = FundRequirementsTemplate( - agent= 111, - safe= 1111 -) - -ocp2 = FundRequirementsTemplate( { - "agent": 222, - "safe": 2222 -} -) - - -ofr1 = OnChainFundRequirements( - agent= 333, - safe= 3333 -) - -# ofr2 = OnChainFundRequirements( { -# "agent": 444, -# "safe": 4444 -# } -# ) - -ic(ocp2) -ic(ocp1) -ic(ofr1) -# ic(ofr2) - - -def print_box(text: str, margin: int = 1, character: str = '=') -> None: - """Print text centered within a box.""" - - lines = text.split('\n') - text_length = max(len(line) for line in lines) - length = text_length + 2 * margin - - border = character * length - margin_str = ' ' * margin - - print(border) - print(f"{margin_str}{text}{margin_str}") - print(border) - print() - - -def print_title(text: str) -> None: - """Print title.""" - print() - print_box(text, 4, '=') - - -def print_section(text: str) -> None: - """Print section.""" - print_box(text, 1, '-') - - -def wei_to_unit(wei: int) -> float: - """Convert Wei to unit.""" - return wei / 1e18 - - -def wei_to_token(wei: int, token: str = NATIVE_TOKEN_NAME) -> str: - """Convert Wei to token.""" - return f"{wei_to_unit(wei):.2f} {token}" - - -def ask_confirm_password() -> str: - password = getpass.getpass("Please enter a password: ") - confirm_password = getpass.getpass("Please confirm your password: ") - - if password == confirm_password: - return password - else: - print("Passwords do not match. Terminating.") - sys.exit(1) - - -def check_rpc(rpc_url: str) -> None: - spinner = Halo(text=f"Checking RPC...", spinner="dots") - spinner.start() - - rpc_data = { - "jsonrpc": "2.0", - "method": "eth_newFilter", - "params": ["invalid"], - "id": 1 - } - - try: - response = requests.post( - rpc_url, - json=rpc_data, - headers={"Content-Type": "application/json"} - ) - response.raise_for_status() - rpc_response = response.json() - except Exception as e: - print("Error: Failed to send RPC request:", e) - sys.exit(1) - - rcp_error_message = rpc_response.get("error", {}).get("message", "Exception processing RCP response") - - if rcp_error_message == "Exception processing RCP response": - print("Error: The received RCP response is malformed. Please verify the RPC address and/or RCP behavior.") - print(" Received response:") - print(" ", rpc_response) - print("") - print("Terminating script.") - sys.exit(1) - elif rcp_error_message == "Out of requests": - print("Error: The provided RCP is out of requests.") - print("Terminating script.") - sys.exit(1) - elif rcp_error_message == "The method eth_newFilter does not exist/is not available": - print("Error: The provided RPC does not support 'eth_newFilter'.") - print("Terminating script.") - sys.exit(1) - elif rcp_error_message == "invalid params": - spinner.succeed("RPC checks passed.") - else: - print("Error: Unknown RCP error.") - print(" Received response:") - print(" ", rpc_response) - print("") - print("Terminating script.") - sys.exit(1) - - - -def main() -> None: - """Run service.""" - - print_title("Superfest Quickstart") - print("This script will assist you in setting up and running the Superfest service.") - print() - - print_section("Set up local user account") - operate = OperateApp( - home=OPERATE_HOME, - ) - operate.setup() - - if operate.user_account is None: - print("Creating a new local user account...") - password = ask_confirm_password() - UserAccount.new( - password=password, - path=operate._path / "user.json", - ) - else: - password="foo" - #password = getpass.getpass("Enter local user account password: ") - if not operate.user_account.is_valid(password=password): - print("Invalid password!") - sys.exit(1) - - operate.password = password - if not operate.wallet_manager.exists(ledger_type=LedgerType.ETHEREUM): - print("Creating the main wallet...") - wallet, mnemonic = operate.wallet_manager.create(ledger_type=LedgerType.ETHEREUM) - wallet.password = password - print() - print_box(f"Please save the mnemonic phrase for the main wallet:\n{', '.join(mnemonic)}", 0 , '-') - input("Press enter to continue...") - else: - wallet = operate.wallet_manager.load(ledger_type=LedgerType.ETHEREUM) - - manager = operate.service_manager() - - service_path = operate._services / TEMPLATE["hash"] - # if not service_path.exists(): - # rpc_url = getpass.getpass("Please enter your RPC: ") - # check_rpc(rpc_url=rpc_url) - - service = manager.load_or_create( - hash=TEMPLATE["hash"], - service_template=TEMPLATE, - ) - - home_chain_config = service.chain_configs[service.home_chain_id] - home_ledger_api = wallet.ledger_api( - chain_type=home_chain_config.ledger_config.chain, - rpc=home_chain_config.ledger_config.rpc, - ) - - print(f"Main wallet balance: {wei_to_token(home_ledger_api.get_balance(wallet.crypto.address))}") - spinner = Halo(text=f"Please make sure main wallet {wallet.crypto.address} has at least {wei_to_token(MASTER_WALLET_MIMIMUM_BALANCE)}.", spinner="dots") - spinner.start() - - while home_ledger_api.get_balance(wallet.crypto.address) < MASTER_WALLET_MIMIMUM_BALANCE: - time.sleep(1) - - spinner.succeed(f"Main wallet updated balance: {wei_to_token(home_ledger_api.get_balance(wallet.crypto.address))}.") - print() - - if wallet.safe is not None: - print("Safe already exists") - else: - print("Creating Safe") - chain_type = home_chain_config.ledger_config.chain - ledger_type = LedgerType.ETHEREUM - wallet_manager = operate.wallet_manager - wallet = wallet_manager.load(ledger_type=ledger_type) - - import pdb;pdb.set_trace() - - wallet.create_safe( # pylint: disable=no-member - chain_type=chain_type, - rpc="https://virtual.gnosis.rpc.tenderly.co/a929dfd1-7b52-43b3-a158-fb2865e97af2", - ) - print("Funding Safe") - wallet.transfer( - to=t.cast(str, wallet.safe), - amount=int(1e18), - chain_type=home_chain_config.ledger_config.chain, - from_safe=False, - ) - - print_section("Set up the service in the Olas Protocol") - - - address = wallet.safe - print(f"Safe balance: {wei_to_token(home_ledger_api.get_balance(address))}") - spinner = Halo(text=f"Please make sure address {address} has at least {wei_to_token(MASTER_WALLET_MIMIMUM_BALANCE)}.", spinner="dots") - spinner.start() - - while home_ledger_api.get_balance(address) < MASTER_WALLET_MIMIMUM_BALANCE: - time.sleep(1) - - spinner.succeed(f"Safe updated balance: {wei_to_token(home_ledger_api.get_balance(address))}.") - print() - - - - - - manager.deploy_service_onchain_from_safe(hash=service.hash) - - - #manager.stake_service_on_chain(hash=service.hash) - #manager.fund_service(hash=service.hash) - - print() - print_section("Run the service") - -# manager.deploy_service_locally(hash=service.hash) - - -if __name__ == "__main__": - main() - - - - diff --git a/operate/services/manage.py b/operate/services/manage.py index abe7893b7..eae49cf09 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -51,7 +51,7 @@ ) from operate.types import ( ServiceTemplate, - LedgerConfig + LedgerConfig, ChainType ) from operate.wallet.master import MasterWalletManager @@ -396,6 +396,8 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to instances = [key.address for key in keys] wallet = self.wallet_manager.load(ledger_config.type) sftxb = self.get_eth_safe_tx_builder(ledger_config=ledger_config) + chain_type = ChainType.from_id(chain_id) + safe = wallet.safes.get(chain_type) # TODO fixme os.environ["CUSTOM_CHAIN_RPC"] = ledger_config.rpc @@ -433,13 +435,13 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to ledger_api=sftxb.ledger_api, contract_address=OLAS[ledger_config.chain], ) - .functions.balanceOf(wallet.safe) + .functions.balanceOf(safe) .call() ) if balance < required_olas: raise ValueError( "You don't have enough olas to stake, " - f"address: {wallet.safe}; required olas: {required_olas}; your balance: {balance}" + f"address: {safe}; required olas: {required_olas}; your balance: {balance}" ) on_chain_hash = self._get_on_chain_hash(chain_config=chain_config) @@ -514,7 +516,7 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to token_utility = "0xa45E64d13A30a51b91ae0eb182e88a40e9b18eD8" # nosec olas_token = "0xcE11e14225575945b8E6Dc0D4F2dD4C570f79d9f" # nosec self.logger.info( - f"Approving OLAS as bonding token from {wallet.safe} to {token_utility}" + f"Approving OLAS as bonding token from {safe} to {token_utility}" ) cost_of_bond = ( registry_contracts.service_registry_token_utility.get_agent_bond( @@ -537,13 +539,13 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to contract_address=olas_token, ) .functions.allowance( - wallet.safe, + safe, token_utility, ) .call() ) self.logger.info( - f"Approved {token_utility_allowance} OLAS from {wallet.safe} to {token_utility}" + f"Approved {token_utility_allowance} OLAS from {safe} to {token_utility}" ) cost_of_bond = 1 @@ -563,7 +565,7 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to token_utility = "0xa45E64d13A30a51b91ae0eb182e88a40e9b18eD8" # nosec olas_token = "0xcE11e14225575945b8E6Dc0D4F2dD4C570f79d9f" # nosec self.logger.info( - f"Approving OLAS as bonding token from {wallet.safe} to {token_utility}" + f"Approving OLAS as bonding token from {safe} to {token_utility}" ) cost_of_bond = ( registry_contracts.service_registry_token_utility.get_agent_bond( @@ -586,13 +588,13 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to contract_address=olas_token, ) .functions.allowance( - wallet.safe, + safe, token_utility, ) .call() ) self.logger.info( - f"Approved {token_utility_allowance} OLAS from {wallet.safe} to {token_utility}" + f"Approved {token_utility_allowance} OLAS from {safe} to {token_utility}" ) cost_of_bond = 1 diff --git a/operate/services/protocol.py b/operate/services/protocol.py index 7c6c6cba0..c2c130f75 100644 --- a/operate/services/protocol.py +++ b/operate/services/protocol.py @@ -872,11 +872,12 @@ class EthSafeTxBuilder(_ChainUtil): def new_tx(self) -> GnosisSafeTransaction: """Create a new GnosisSafeTransaction instance.""" + safe = self.wallet.safes[self.chain_type] return GnosisSafeTransaction( ledger_api=self.ledger_api, crypto=self.crypto, chain_type=self.chain_type, - safe=t.cast(str, self.wallet.safe), + safe=safe, ) def get_mint_tx_data( # pylint: disable=too-many-arguments @@ -917,10 +918,11 @@ def get_mint_tx_data( # pylint: disable=too-many-arguments contract_address=self.contracts["service_manager"], ) + safe = self.wallet.safes[self.chain_type] txd = instance.encodeABI( fn_name="create" if update_token is None else "update", args=[ - self.wallet.safe, + safe, token or ETHEREUM_ERC20, manager.metadata_hash, [agent_id], @@ -968,8 +970,9 @@ def get_activate_data(self, service_id: int, cost_of_bond: int) -> t.Dict: fn_name="activateRegistration", args=[service_id], ) + safe = self.wallet.safes[self.chain_type] return { - "from": self.wallet.safe, + "from": safe, "to": self.contracts["service_manager"], "data": txd[2:], "operation": MultiSendOperation.CALL, @@ -996,8 +999,9 @@ def get_register_instances_data( agents, ], ) + safe = self.wallet.safes[self.chain_type] return { - "from": self.wallet.safe, + "from": safe, "to": self.contracts["service_manager"], "data": txd[2:], "operation": MultiSendOperation.CALL, @@ -1099,8 +1103,9 @@ def get_staking_approval_data( service_registry=service_registry, staking_contract=staking_contract, ) + safe = self.wallet.safes[self.chain_type] return { - "from": self.wallet.safe, + "from": safe, "to": self.contracts["service_registry"], "data": txd[2:], "operation": MultiSendOperation.CALL, diff --git a/operate/wallet/master.py b/operate/wallet/master.py index ecbd60fc9..352d7610b 100644 --- a/operate/wallet/master.py +++ b/operate/wallet/master.py @@ -49,7 +49,7 @@ class MasterWallet(LocalResource): """Master wallet.""" path: Path - safe: t.Optional[str] = None + safes: t.Optional[t.Dict[ChainType, str]] = None ledger_type: LedgerType _key: str @@ -155,7 +155,7 @@ class EthereumMasterWallet(MasterWallet): safe_chains: t.List[ChainType] # For cross-chain support ledger_type: LedgerType = LedgerType.ETHEREUM - safe: t.Optional[str] = None + safes: t.Optional[t.Dict[ChainType, str]] = None safe_nonce: t.Optional[int] = None # For cross-chain reusability _file = ledger_type.config_file @@ -200,7 +200,7 @@ def _transfer_from_safe(self, to: str, amount: int, chain_type: ChainType) -> No transfer_from_safe( ledger_api=self.ledger_api(chain_type=chain_type), crypto=self.crypto, - safe=t.cast(str, self.safe), + safe=t.cast(str, self.safes), to=to, amount=amount, ) @@ -260,13 +260,16 @@ def create_safe( """Create safe.""" if chain_type in self.safe_chains: return - self.safe, self.safe_nonce = create_gnosis_safe( + safe, self.safe_nonce = create_gnosis_safe( ledger_api=self.ledger_api(chain_type=chain_type, rpc=rpc), crypto=self.crypto, owner=owner, salt_nonce=self.safe_nonce, ) self.safe_chains.append(chain_type) + if self.safes is None: + self.safes = {} + self.safes[chain_type] = safe self.store() def add_backup_owner( @@ -277,11 +280,14 @@ def add_backup_owner( ) -> None: """Add a backup owner.""" ledger_api = self.ledger_api(chain_type=chain_type, rpc=rpc) - if len(get_owners(ledger_api=ledger_api, safe=t.cast(str, self.safe))) == 2: + if chain_type not in self.safes: + raise ValueError(f"Safes not created for chain_type {chain_type}!") + safe = t.cast(str, self.safes[chain_type]) + if len(get_owners(ledger_api=ledger_api, safe=safe)) == 2: raise ValueError("Backup owner already exist!") add_owner( ledger_api=ledger_api, - safe=t.cast(str, self.safe), + safe=safe, owner=owner, crypto=self.crypto, ) @@ -295,11 +301,14 @@ def swap_backup_owner( ) -> None: """Swap backup owner.""" ledger_api = self.ledger_api(chain_type=chain_type, rpc=rpc) - if len(get_owners(ledger_api=ledger_api, safe=t.cast(str, self.safe))) == 1: + if chain_type not in self.safes: + raise ValueError(f"Safes not created for chain_type {chain_type}!") + safe = t.cast(str, self.safes[chain_type]) + if len(get_owners(ledger_api=ledger_api, safe=safe)) == 1: raise ValueError("Backup owner does not exist, cannot swap!") swap_owner( ledger_api=ledger_api, - safe=t.cast(str, self.safe), + safe=safe, old_owner=old_owner, new_owner=new_owner, crypto=self.crypto, @@ -313,7 +322,10 @@ def add_or_swap_owner( ) -> None: """Add or swap backup owner.""" ledger_api = self.ledger_api(chain_type=chain_type, rpc=rpc) - owners = get_owners(ledger_api=ledger_api, safe=t.cast(str, self.safe)) + if chain_type not in self.safes: + raise ValueError(f"Safes not created for chain_type {chain_type}!") + safe = t.cast(str, self.safes[chain_type]) + owners = get_owners(ledger_api=ledger_api, safe=safe) if len(owners) == 1: return self.add_backup_owner(chain_type=chain_type, owner=owner, rpc=rpc) From 717714b5e0b3ac4e0bd3348caffa9f267a841242 Mon Sep 17 00:00:00 2001 From: truemiller Date: Wed, 21 Aug 2024 10:08:19 +0100 Subject: [PATCH 128/134] fix: gitleaks ignore 2 keys --- .gitleaksignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitleaksignore b/.gitleaksignore index 446eb5a4b..33c8c27cf 100644 --- a/.gitleaksignore +++ b/.gitleaksignore @@ -27,4 +27,6 @@ d8149e9b5b7bd6a7ed7bc1039900702f1d4f287b:operate/services/manage.py:generic-api- 99c0f139b037da2587708212fcf6d0e20786d0ba:operate/services/manage.py:generic-api-key:406 99c0f139b037da2587708212fcf6d0e20786d0ba:operate/services/manage.py:generic-api-key:454 99c0f139b037da2587708212fcf6d0e20786d0ba:operate/services/manage.py:generic-api-key:455 -91ec07457f69e9a29f63693ac8ef887e4b5f49f0:operate/services/manage.py:generic-api-key:454 \ No newline at end of file +91ec07457f69e9a29f63693ac8ef887e4b5f49f0:operate/services/manage.py:generic-api-key:454 +410bea2bd02ff54da69387fe8f3b58793e09f7b0:operate/services/manage.py:generic-api-key:421 +410bea2bd02ff54da69387fe8f3b58793e09f7b0:operate/services/manage.py:generic-api-key:422 \ No newline at end of file From c54ab4b556bc6930db8114a36c5138d8bb6c9ff7 Mon Sep 17 00:00:00 2001 From: Ardian Date: Wed, 21 Aug 2024 12:55:43 +0200 Subject: [PATCH 129/134] fix: update trader hash --- frontend/constants/serviceTemplates.ts | 2 +- templates/trader.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/constants/serviceTemplates.ts b/frontend/constants/serviceTemplates.ts index dcb2fd1aa..19948f76a 100644 --- a/frontend/constants/serviceTemplates.ts +++ b/frontend/constants/serviceTemplates.ts @@ -4,7 +4,7 @@ import { StakingProgram } from '@/enums/StakingProgram'; export const SERVICE_TEMPLATES: ServiceTemplate[] = [ { name: 'Trader Agent', - hash: 'bafybeidgjgjj5ul6xkubicbemppufgsbx5sr5rwhtrwttk2oivp5bkdnce', + hash: 'bafybeicrstlxew36hlxl7pzi73nmd44aibnhwxzkchzlec6t6yhvs7gvhy', // hash: 'bafybeibbloa4w33vj4bvdkso7pzk6tr3duvxjpecbx4mur4ix6ehnwb5uu', // temporary description: 'Trader agent for omen prediction markets', image: diff --git a/templates/trader.yaml b/templates/trader.yaml index ac7f44159..ed0b8679d 100644 --- a/templates/trader.yaml +++ b/templates/trader.yaml @@ -1,6 +1,6 @@ name: "Trader Agent" description: "A single-agent service (sovereign agent) placing bets on Omen" -hash: bafybeiembjbkmym3ppclc2qnjuwzayibqp4vsv3lfq56fqelqfu6ytgv5i +hash: bafybeicrstlxew36hlxl7pzi73nmd44aibnhwxzkchzlec6t6yhvs7gvhy image: https://operate.olas.network/_next/image?url=%2Fimages%2Fprediction-agent.png&w=3840&q=75 service_version: v0.18.1 home_chain_id: 100 From a48b677271e488401230c8357ac842c2b6088a70 Mon Sep 17 00:00:00 2001 From: Ardian Date: Tue, 27 Aug 2024 01:01:35 +0200 Subject: [PATCH 130/134] feat: working version --- operate/ledger/__init__.py | 2 ++ operate/ledger/profiles.py | 17 +++++++++++++- operate/services/manage.py | 43 ++++++++++++++++++++---------------- operate/services/protocol.py | 22 ++++++++++-------- operate/services/service.py | 17 +++++++------- operate/wallet/master.py | 14 ++++++++---- templates/superfest.yaml | 18 +++++++++++++++ 7 files changed, 92 insertions(+), 41 deletions(-) create mode 100644 templates/superfest.yaml diff --git a/operate/ledger/__init__.py b/operate/ledger/__init__.py index 078a93d1e..b5b1aca3b 100644 --- a/operate/ledger/__init__.py +++ b/operate/ledger/__init__.py @@ -37,6 +37,7 @@ GNOSIS_RPC = os.environ.get("DEV_RPC", "https://rpc-gate.autonolas.tech/gnosis-rpc/") GOERLI_RPC = os.environ.get("DEV_RPC", "https://ethereum-goerli.publicnode.com") SOLANA_RPC = os.environ.get("DEV_RPC", "https://api.mainnet-beta.solana.com") +OPTIMISM_RPC = os.environ.get("DEV_RPC", "https://optimism-rpc.publicnode.com") PUBLIC_RPCS = { ChainType.ETHEREUM: ETHEREUM_PUBLIC_RPC, @@ -50,6 +51,7 @@ ChainType.GNOSIS: GNOSIS_RPC, ChainType.GOERLI: GOERLI_RPC, ChainType.SOLANA: SOLANA_RPC, + ChainType.OPTIMISM: OPTIMISM_RPC, } CHAIN_HELPERS: t.Dict[ChainType, t.Type[LedgerHelper]] = { diff --git a/operate/ledger/profiles.py b/operate/ledger/profiles.py index bf7fa8433..6f31977db 100644 --- a/operate/ledger/profiles.py +++ b/operate/ledger/profiles.py @@ -32,16 +32,31 @@ "gnosis_safe_same_address_multisig": "0x6e7f594f680f7aBad18b7a63de50F0FeE47dfD06", "multisend": "0x40A2aCCbd92BCA938b02010E17A5b8929b49130D", } - ) + ), + ChainType.OPTIMISM: ContractAddresses( + { + "service_manager": "0xFbBEc0C8b13B38a9aC0499694A69a10204c5E2aB", + "service_registry": "0x3d77596beb0f130a4415df3D2D8232B3d3D31e44", + "service_registry_token_utility": "0xBb7e1D6Cb6F243D6bdE81CE92a9f2aFF7Fbe7eac", + "gnosis_safe_proxy_factory": "0xE43d4F4103b623B61E095E8bEA34e1bc8979e168", + "gnosis_safe_same_address_multisig": "0xb09CcF0Dbf0C178806Aaee28956c74bd66d21f73", + "multisend": "0x40A2aCCbd92BCA938b02010E17A5b8929b49130D", + } + ), } STAKING = { ChainType.GNOSIS: { "pearl_alpha": "0xEE9F19b5DF06c7E8Bfc7B28745dcf944C504198A", "pearl_beta": "0xeF44Fb0842DDeF59D37f85D61A1eF492bbA6135d", + }, + ChainType.OPTIMISM: { + "pearl_alpha": "0xEE9F19b5DF06c7E8Bfc7B28745dcf944C504198A", + "pearl_beta": "0xeF44Fb0842DDeF59D37f85D61A1eF492bbA6135d", } } OLAS = { ChainType.GNOSIS: "0xcE11e14225575945b8E6Dc0D4F2dD4C570f79d9f", + ChainType.OPTIMISM: "0x01B8b6384298D4848E3BE63D4C9D17830EeE488A", } diff --git a/operate/services/manage.py b/operate/services/manage.py index 6acf0b462..246d30044 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -48,7 +48,7 @@ OnChainUserParams, Service, ) -from operate.types import LedgerConfig, ServiceTemplate +from operate.types import LedgerConfig, ServiceTemplate, ChainType from operate.utils.gnosis import NULL_ADDRESS from operate.wallet.master import MasterWalletManager @@ -407,7 +407,8 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to instances = [key.address for key in keys] wallet = self.wallet_manager.load(ledger_config.type) sftxb = self.get_eth_safe_tx_builder(ledger_config=ledger_config) - + chain_type = ChainType.from_id(int(chain_id)) + safe = wallet.safes[chain_type] # TODO fix this os.environ["CUSTOM_CHAIN_RPC"] = ledger_config.rpc os.environ["OPEN_AUTONOMY_SUBGRAPH_URL"] = "https://subgraph.autonolas.tech/subgraphs/name/autonolas-staging" @@ -460,13 +461,13 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to ledger_api=sftxb.ledger_api, contract_address=OLAS[ledger_config.chain], ) - .functions.balanceOf(wallet.safe) + .functions.balanceOf(safe) .call() ) if balance < required_olas: raise ValueError( "You don't have enough olas to stake, " - f"address: {wallet.safe}; required olas: {required_olas}; your balance: {balance}" + f"address: {safe}; required olas: {required_olas}; your balance: {balance}" ) on_chain_hash = self._get_on_chain_hash(chain_config=chain_config) @@ -476,9 +477,10 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to and (on_chain_hash is not None) and (on_chain_hash != service.hash or current_agent_id != staking_params["agent_ids"][0]) ) - current_staking_program = self._get_current_staking_program(chain_data, ledger_config, sftxb) + if user_params.use_staking: + current_staking_program = self._get_current_staking_program(chain_data, ledger_config, sftxb) + self.logger.info(f"{current_staking_program=}") - self.logger.info(f"{current_staking_program=}") self.logger.info(f"{user_params.staking_program_id=}") self.logger.info(f"{on_chain_hash=}") self.logger.info(f"{service.hash=}") @@ -579,13 +581,13 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to service.store() if self._get_on_chain_state(chain_config=chain_config) == OnChainState.PRE_REGISTRATION: - cost_of_bond = staking_params["min_staking_deposit"] + cost_of_bond = user_params.cost_of_bond if user_params.use_staking: token_utility = staking_params["service_registry_token_utility"] olas_token = staking_params["staking_token"] agent_id = staking_params["agent_ids"][0] self.logger.info( - f"Approving OLAS as bonding token from {wallet.safe} to {token_utility}" + f"Approving OLAS as bonding token from {safe} to {token_utility}" ) cost_of_bond = ( registry_contracts.service_registry_token_utility.get_agent_bond( @@ -608,13 +610,13 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to contract_address=olas_token, ) .functions.allowance( - wallet.safe, + safe, token_utility, ) .call() ) self.logger.info( - f"Approved {token_utility_allowance} OLAS from {wallet.safe} to {token_utility}" + f"Approved {token_utility_allowance} OLAS from {safe} to {token_utility}" ) cost_of_bond = 1 @@ -630,12 +632,12 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to if self._get_on_chain_state(chain_config=chain_config) == OnChainState.ACTIVE_REGISTRATION: cost_of_bond = user_params.cost_of_bond + agent_id = staking_params["agent_ids"][0] if user_params.use_staking: token_utility = staking_params["service_registry_token_utility"] olas_token = staking_params["staking_token"] - agent_id = staking_params["agent_ids"][0] self.logger.info( - f"Approving OLAS as bonding token from {wallet.safe} to {token_utility}" + f"Approving OLAS as bonding token from {safe} to {token_utility}" ) cost_of_bond = ( registry_contracts.service_registry_token_utility.get_agent_bond( @@ -658,13 +660,13 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to contract_address=olas_token, ) .functions.allowance( - wallet.safe, + safe, token_utility, ) .call() ) self.logger.info( - f"Approved {token_utility_allowance} OLAS from {wallet.safe} to {token_utility}" + f"Approved {token_utility_allowance} OLAS from {safe} to {token_utility}" ) cost_of_bond = 1 @@ -695,7 +697,7 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to messages = sftxb.get_deploy_data_from_safe( service_id=chain_data.token, reuse_multisig=reuse_multisig, - master_safe=sftxb.wallet.safe, + master_safe=safe, ) tx = sftxb.new_tx() for message in messages: @@ -711,7 +713,9 @@ def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,to chain_data.multisig = info["multisig"] chain_data.on_chain_state = OnChainState(info["service_state"]) service.store() - self.stake_service_on_chain_from_safe(hash=hash, chain_id=chain_id) + if user_params.use_staking: + self.stake_service_on_chain_from_safe(hash=hash, chain_id=chain_id) + def terminate_service_on_chain(self, hash: str) -> None: """ @@ -1141,7 +1145,7 @@ async def funding_job( ) await asyncio.sleep(60) - def deploy_service_locally(self, hash: str, force: bool = True) -> Deployment: + def deploy_service_locally(self, hash: str, force: bool = True, chain_id: str = "100", use_docker: bool = False) -> Deployment: """ Deploy service locally @@ -1150,8 +1154,8 @@ def deploy_service_locally(self, hash: str, force: bool = True) -> Deployment: :return: Deployment instance """ deployment = self.load_or_create(hash=hash).deployment - deployment.build(force=force) - deployment.start() + deployment.build(use_docker=use_docker, force=force, chain_id=chain_id) + deployment.start(use_docker=use_docker) return deployment def stop_service_locally(self, hash: str, delete: bool = False) -> Deployment: @@ -1217,3 +1221,4 @@ def update_service( def _log_directories(self) -> None: directories = [str(p) for p in self.path.iterdir() if p.is_dir()] self.logger.info(f"Directories in {self.path}: {', '.join(directories)}") + diff --git a/operate/services/protocol.py b/operate/services/protocol.py index e758f278d..2f568f792 100644 --- a/operate/services/protocol.py +++ b/operate/services/protocol.py @@ -74,6 +74,7 @@ skill_input_hex_to_payload, ) from operate.wallet.master import MasterWallet +from operate.types import ChainType as OperateChainType ETHEREUM_ERC20 = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" @@ -507,6 +508,13 @@ def _patch(self) -> None: for name, address in self.contracts.items(): ContractConfigs.get(name=name).contracts[self.chain_type] = address + @property + def safe(self) -> str: + """Get safe address.""" + chain_id = self.ledger_api.api.eth.chain_id + chain_type = OperateChainType.from_id(chain_id) + return self.wallet.safes[chain_type] + @property def crypto(self) -> Crypto: """Load crypto object.""" @@ -937,12 +945,11 @@ class EthSafeTxBuilder(_ChainUtil): def new_tx(self) -> GnosisSafeTransaction: """Create a new GnosisSafeTransaction instance.""" - safe = self.wallet.safes[self.chain_type] return GnosisSafeTransaction( ledger_api=self.ledger_api, crypto=self.crypto, chain_type=self.chain_type, - safe=safe, + safe=self.safe, ) def get_mint_tx_data( # pylint: disable=too-many-arguments @@ -983,8 +990,8 @@ def get_mint_tx_data( # pylint: disable=too-many-arguments contract_address=self.contracts["service_manager"], ) - safe = self.wallet.safes[self.chain_type] if update_token is None: + safe = self.safe txd = instance.encodeABI( fn_name="create", args=[ @@ -1048,9 +1055,8 @@ def get_activate_data(self, service_id: int, cost_of_bond: int) -> t.Dict: fn_name="activateRegistration", args=[service_id], ) - safe = self.wallet.safes[self.chain_type] return { - "from": safe, + "from": self.safe, "to": self.contracts["service_manager"], "data": txd[2:], "operation": MultiSendOperation.CALL, @@ -1077,9 +1083,8 @@ def get_register_instances_data( agents, ], ) - safe = self.wallet.safes[self.chain_type] return { - "from": safe, + "from": self.safe, "to": self.contracts["service_manager"], "data": txd[2:], "operation": MultiSendOperation.CALL, @@ -1230,9 +1235,8 @@ def get_staking_approval_data( service_registry=service_registry, staking_contract=staking_contract, ) - safe = self.wallet.safes[self.chain_type] return { - "from": safe, + "from": self.safe, "to": self.contracts["service_registry"], "data": txd[2:], "operation": MultiSendOperation.CALL, diff --git a/operate/services/service.py b/operate/services/service.py index ebd48014b..e343e9597 100644 --- a/operate/services/service.py +++ b/operate/services/service.py @@ -251,7 +251,6 @@ def ledger_configs(self) -> "LedgerConfigs": override["type"] == "connection" and "valory/ledger" in override["public_id"] ): - import pdb;pdb.set_trace() (_, config), *_ = override["config"]["ledger_apis"].items() # TODO chain name is inferred from the chain_id. The actual id provided on service.yaml is ignored. @@ -383,6 +382,7 @@ def load(cls, path: Path) -> "Deployment": def _build_docker( self, force: bool = True, + chain_id: str = "100", ) -> None: """Build docker deployment.""" service = Service.load(path=self.path) @@ -426,15 +426,16 @@ def _build_docker( home_chain_data = service.chain_configs[service.home_chain_id] builder.try_update_runtime_params( - multisig_address=home_chain_data.multisig, - agent_instances=home_chain_data.instances, - service_id=home_chain_data.token, + multisig_address=home_chain_data.chain_data.multisig, + agent_instances=home_chain_data.chain_data.instances, + service_id=home_chain_data.chain_data.token, consensus_threshold=None, ) # TODO: Support for multiledger + ledger_config = service.chain_configs[service.home_chain_id].ledger_config builder.try_update_ledger_params( - chain=LedgerType(service.ledger_config.type).name.lower(), - address=service.ledger_config.rpc, + chain=LedgerType(ledger_config.type).name.lower(), + address=ledger_config.rpc, ) # build deployment @@ -592,7 +593,7 @@ def build( """ # TODO: chain_id should be used properly! Added as a hotfix for now. if use_docker: - return self._build_docker(force=force) + return self._build_docker(force=force, chain_id=chain_id) return self._build_host(force=force, chain_id=chain_id) def start(self, use_docker: bool = False) -> None: @@ -680,7 +681,7 @@ def migrate_format(cls, path: Path) -> None: "keys": data.get("keys"), "home_chain_id": "100", # Assuming a default value for home_chain_id "chain_configs": { - "100": { + '10': { "ledger_config": { "rpc": data.get("ledger_config", {}).get("rpc"), "type": data.get("ledger_config", {}).get("type"), diff --git a/operate/wallet/master.py b/operate/wallet/master.py index 352d7610b..9790867bc 100644 --- a/operate/wallet/master.py +++ b/operate/wallet/master.py @@ -21,7 +21,7 @@ import json import typing as t -from dataclasses import dataclass +from dataclasses import dataclass, field from pathlib import Path from aea.crypto.base import Crypto, LedgerApi @@ -49,7 +49,7 @@ class MasterWallet(LocalResource): """Master wallet.""" path: Path - safes: t.Optional[t.Dict[ChainType, str]] = None + safes: t.Optional[t.Dict[ChainType, str]] = {} ledger_type: LedgerType _key: str @@ -155,7 +155,7 @@ class EthereumMasterWallet(MasterWallet): safe_chains: t.List[ChainType] # For cross-chain support ledger_type: LedgerType = LedgerType.ETHEREUM - safes: t.Optional[t.Dict[ChainType, str]] = None + safes: t.Optional[t.Dict[ChainType, str]] = field(default_factory=dict) safe_nonce: t.Optional[int] = None # For cross-chain reusability _file = ledger_type.config_file @@ -344,7 +344,13 @@ def add_or_swap_owner( @classmethod def load(cls, path: Path) -> "EthereumMasterWallet": """Load master wallet.""" - return super().load(path) # type: ignore + raw_ethereum_wallet = super().load(path) # type: ignore + safes = {} + for id_, safe_address in raw_ethereum_wallet.safes.items(): + safes[ChainType(int(id_))] = safe_address + + raw_ethereum_wallet.safes = safes + return t.cast(EthereumMasterWallet, raw_ethereum_wallet) LEDGER_TYPE_TO_WALLET_CLASS = { diff --git a/templates/superfest.yaml b/templates/superfest.yaml new file mode 100644 index 000000000..7425b0042 --- /dev/null +++ b/templates/superfest.yaml @@ -0,0 +1,18 @@ +name: "Superfest Agent" +description: "A single-agent service (sovereign agent) placing bets on Omen" +hash: bafybeiegxvr7uzl6srgq7x36escs4jrc35cnk73ky23egfgkarp7hz6x4u +image: https://operate.olas.network/_next/image?url=%2Fimages%2Fprediction-agent.png&w=3840&q=75 +service_version: v0.18.1 +home_chain_id: 10 +configurations: + 100: + staking_program_id: pearl_beta + nft: bafybeig64atqaladigoc3ds4arltdu63wkdrk3gesjfvnfdmz35amv7faq + rpc: http://localhost:8545 # User provided + threshold: 1 # TODO: Move to service component + use_staking: false # User provided + cost_of_bond: 10000000000000000 + monthly_gas_estimate: 10000000000000000000 # TODO: Where is this used + fund_requirements: + agent: 100000000000000000 + safe: 5000000000000000000 From 7f888b38a5bc4ad9778c226e4be71a9bbe5a5e58 Mon Sep 17 00:00:00 2001 From: Ardian Date: Wed, 28 Aug 2024 00:05:02 +0200 Subject: [PATCH 131/134] feat: working version --- operate/ledger/__init__.py | 10 ++++++++-- operate/ledger/profiles.py | 32 +++++++++++++++++++++++++++++++- operate/services/manage.py | 2 +- operate/services/service.py | 18 ++++++++---------- 4 files changed, 48 insertions(+), 14 deletions(-) diff --git a/operate/ledger/__init__.py b/operate/ledger/__init__.py index b5b1aca3b..eaf88968d 100644 --- a/operate/ledger/__init__.py +++ b/operate/ledger/__init__.py @@ -22,6 +22,8 @@ import os import typing as t +from autonomy.chain.config import Chain + from operate.ledger.base import LedgerHelper from operate.ledger.ethereum import Ethereum from operate.ledger.solana import Solana @@ -33,11 +35,12 @@ GOERLI_PUBLIC_RPC = os.environ.get("DEV_RPC", "https://ethereum-goerli.publicnode.com") SOLANA_PUBLIC_RPC = os.environ.get("DEV_RPC", "https://api.mainnet-beta.solana.com") -ETHEREUM_RPC = os.environ.get("DEV_RPC", "https://ethereum.publicnode.com") +ETHEREUM_RPC = os.environ.get("ETHEREUM_RPC", "https://ethereum.publicnode.com") GNOSIS_RPC = os.environ.get("DEV_RPC", "https://rpc-gate.autonolas.tech/gnosis-rpc/") GOERLI_RPC = os.environ.get("DEV_RPC", "https://ethereum-goerli.publicnode.com") SOLANA_RPC = os.environ.get("DEV_RPC", "https://api.mainnet-beta.solana.com") -OPTIMISM_RPC = os.environ.get("DEV_RPC", "https://optimism-rpc.publicnode.com") +OPTIMISM_RPC = os.environ.get("OPTIMISM_RPC", "https://optimism-rpc.publicnode.com") +BASE_RPC = os.environ.get("BASE_RPC", "https://base-rpc.publicnode.com") PUBLIC_RPCS = { ChainType.ETHEREUM: ETHEREUM_PUBLIC_RPC, @@ -52,12 +55,15 @@ ChainType.GOERLI: GOERLI_RPC, ChainType.SOLANA: SOLANA_RPC, ChainType.OPTIMISM: OPTIMISM_RPC, + ChainType.BASE: BASE_RPC, } CHAIN_HELPERS: t.Dict[ChainType, t.Type[LedgerHelper]] = { ChainType.ETHEREUM: Ethereum, ChainType.GNOSIS: Ethereum, ChainType.GOERLI: Ethereum, + ChainType.BASE: Ethereum, + ChainType.OPTIMISM: Ethereum, ChainType.SOLANA: Solana, } diff --git a/operate/ledger/profiles.py b/operate/ledger/profiles.py index 6f31977db..6b0f979cc 100644 --- a/operate/ledger/profiles.py +++ b/operate/ledger/profiles.py @@ -43,6 +43,26 @@ "multisend": "0x40A2aCCbd92BCA938b02010E17A5b8929b49130D", } ), + ChainType.ETHEREUM: ContractAddresses( + { + "service_manager": "0xFbBEc0C8b13B38a9aC0499694A69a10204c5E2aB", + "service_registry": "0x3d77596beb0f130a4415df3D2D8232B3d3D31e44", + "service_registry_token_utility": "0xBb7e1D6Cb6F243D6bdE81CE92a9f2aFF7Fbe7eac", + "gnosis_safe_proxy_factory": "0xE43d4F4103b623B61E095E8bEA34e1bc8979e168", + "gnosis_safe_same_address_multisig": "0xb09CcF0Dbf0C178806Aaee28956c74bd66d21f73", + "multisend": "0x40A2aCCbd92BCA938b02010E17A5b8929b49130D", + } + ), + ChainType.BASE: ContractAddresses( + { + "service_manager": "0x63e66d7ad413C01A7b49C7FF4e3Bb765C4E4bd1b", + "service_registry": "0x3C1fF68f5aa342D296d4DEe4Bb1cACCA912D95fE", + "service_registry_token_utility": "0xBb7e1D6Cb6F243D6bdE81CE92a9f2aFF7Fbe7eac", + "gnosis_safe_proxy_factory": "0xC22834581EbC8527d974F8a1c97E1bEA4EF910BC", + "gnosis_safe_same_address_multisig": "0xFbBEc0C8b13B38a9aC0499694A69a10204c5E2aB", + "multisend": "0x40A2aCCbd92BCA938b02010E17A5b8929b49130D", + } + ) } STAKING = { @@ -53,10 +73,20 @@ ChainType.OPTIMISM: { "pearl_alpha": "0xEE9F19b5DF06c7E8Bfc7B28745dcf944C504198A", "pearl_beta": "0xeF44Fb0842DDeF59D37f85D61A1eF492bbA6135d", - } + }, + ChainType.BASE: { + "pearl_alpha": "0xEE9F19b5DF06c7E8Bfc7B28745dcf944C504198A", + "pearl_beta": "0xeF44Fb0842DDeF59D37f85D61A1eF492bbA6135d", + }, + ChainType.ETHEREUM: { + "pearl_alpha": "0xEE9F19b5DF06c7E8Bfc7B28745dcf944C504198A", + "pearl_beta": "0xeF44Fb0842DDeF59D37f85D61A1eF492bbA6135d", + }, } OLAS = { ChainType.GNOSIS: "0xcE11e14225575945b8E6Dc0D4F2dD4C570f79d9f", ChainType.OPTIMISM: "0x01B8b6384298D4848E3BE63D4C9D17830EeE488A", + ChainType.BASE: "0x54330d28ca3357F294334BDC454a032e7f353416", + ChainType.ETHEREUM: "0x0001A500A6B18995B03f44bb040A5fFc28E45CB0", } diff --git a/operate/services/manage.py b/operate/services/manage.py index 246d30044..379603f33 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -1061,10 +1061,10 @@ def fund_service( # pylint: disable=too-many-arguments agent_fund_threshold: t.Optional[float] = None, safe_fund_treshold: t.Optional[float] = None, from_safe: bool = True, + chain_id: str = "10", ) -> None: """Fund service if required.""" service = self.load_or_create(hash=hash) - chain_id = service.home_chain_id chain_config = service.chain_configs[chain_id] ledger_config = chain_config.ledger_config chain_data = chain_config.chain_data diff --git a/operate/services/service.py b/operate/services/service.py index e343e9597..39a659762 100644 --- a/operate/services/service.py +++ b/operate/services/service.py @@ -251,16 +251,14 @@ def ledger_configs(self) -> "LedgerConfigs": override["type"] == "connection" and "valory/ledger" in override["public_id"] ): - (_, config), *_ = override["config"]["ledger_apis"].items() - # TODO chain name is inferred from the chain_id. The actual id provided on service.yaml is ignored. - - chain = ChainType.from_id(cid=config["chain_id"]) - ledger_configs[str(config["chain_id"])] = LedgerConfig( - rpc=config["address"], - chain=chain, - type=LedgerType.ETHEREUM, - ) - print(f"Adding {chain} {config['address']}") + for chain_id, config in override["config"]["ledger_apis"].items(): + chain = ChainType.from_id(cid=config["chain_id"]) + ledger_configs[str(config["chain_id"])] = LedgerConfig( + rpc=config["address"], + chain=chain, + type=LedgerType.ETHEREUM, + ) + print(f"Adding {chain} {config['address']}") return ledger_configs def deployment_config(self) -> DeploymentConfig: From 0d3c7deb210e877ccfb1c2d1f364fb7f121c582c Mon Sep 17 00:00:00 2001 From: Ardian Date: Wed, 28 Aug 2024 16:40:16 +0200 Subject: [PATCH 132/134] fix: base version --- operate/ledger/profiles.py | 14 +++++------ operate/services/manage.py | 8 +++--- operate/services/protocol.py | 47 +++++++++++++++--------------------- operate/wallet/master.py | 14 +++++++---- 4 files changed, 40 insertions(+), 43 deletions(-) diff --git a/operate/ledger/profiles.py b/operate/ledger/profiles.py index 6b0f979cc..cb9fa85b1 100644 --- a/operate/ledger/profiles.py +++ b/operate/ledger/profiles.py @@ -45,11 +45,11 @@ ), ChainType.ETHEREUM: ContractAddresses( { - "service_manager": "0xFbBEc0C8b13B38a9aC0499694A69a10204c5E2aB", - "service_registry": "0x3d77596beb0f130a4415df3D2D8232B3d3D31e44", - "service_registry_token_utility": "0xBb7e1D6Cb6F243D6bdE81CE92a9f2aFF7Fbe7eac", - "gnosis_safe_proxy_factory": "0xE43d4F4103b623B61E095E8bEA34e1bc8979e168", - "gnosis_safe_same_address_multisig": "0xb09CcF0Dbf0C178806Aaee28956c74bd66d21f73", + "service_manager": "0x2EA682121f815FBcF86EA3F3CaFdd5d67F2dB143", + "service_registry": "0x48b6af7B12C71f09e2fC8aF4855De4Ff54e775cA", + "service_registry_token_utility": "0x3Fb926116D454b95c669B6Bf2E7c3bad8d19affA", + "gnosis_safe_proxy_factory": "0x46C0D07F55d4F9B5Eed2Fc9680B5953e5fd7b461", + "gnosis_safe_same_address_multisig": "0xfa517d01DaA100cB1932FA4345F68874f7E7eF46", "multisend": "0x40A2aCCbd92BCA938b02010E17A5b8929b49130D", } ), @@ -57,8 +57,8 @@ { "service_manager": "0x63e66d7ad413C01A7b49C7FF4e3Bb765C4E4bd1b", "service_registry": "0x3C1fF68f5aa342D296d4DEe4Bb1cACCA912D95fE", - "service_registry_token_utility": "0xBb7e1D6Cb6F243D6bdE81CE92a9f2aFF7Fbe7eac", - "gnosis_safe_proxy_factory": "0xC22834581EbC8527d974F8a1c97E1bEA4EF910BC", + "service_registry_token_utility": "0x34C895f302D0b5cf52ec0Edd3945321EB0f83dd5", + "gnosis_safe_proxy_factory": "0xBb7e1D6Cb6F243D6bdE81CE92a9f2aFF7Fbe7eac", "gnosis_safe_same_address_multisig": "0xFbBEc0C8b13B38a9aC0499694A69a10204c5E2aB", "multisend": "0x40A2aCCbd92BCA938b02010E17A5b8929b49130D", } diff --git a/operate/services/manage.py b/operate/services/manage.py index 379603f33..75909e5a0 100644 --- a/operate/services/manage.py +++ b/operate/services/manage.py @@ -381,12 +381,12 @@ def deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too """ service = self.load_or_create(hash=hash) for chain_id in service.chain_configs.keys(): - self._deploy_service_onchain_from_safe( + self.deploy_service_onchain_from_safe_single_chain( hash=hash, chain_id=chain_id, ) - def _deploy_service_onchain_from_safe( # pylint: disable=too-many-statements,too-many-locals + def deploy_service_onchain_from_safe_single_chain( # pylint: disable=too-many-statements,too-many-locals self, hash: str, chain_id: str, @@ -1069,7 +1069,7 @@ def fund_service( # pylint: disable=too-many-arguments ledger_config = chain_config.ledger_config chain_data = chain_config.chain_data wallet = self.wallet_manager.load(ledger_config.type) - ledger_api = wallet.ledger_api(chain_type=ledger_config.chain, rpc=rpc if rpc else ledger_config.rpc) + ledger_api = wallet.ledger_api(chain_type=ledger_config.chain, rpc=rpc or ledger_config.rpc) agent_fund_threshold = ( agent_fund_threshold or chain_data.user_params.fund_requirements.agent @@ -1091,6 +1091,7 @@ def fund_service( # pylint: disable=too-many-arguments amount=int(to_transfer), chain_type=ledger_config.chain, from_safe=from_safe, + rpc=rpc or ledger_config.rpc, ) safe_balance = ledger_api.get_balance(chain_data.multisig) @@ -1111,6 +1112,7 @@ def fund_service( # pylint: disable=too-many-arguments to=t.cast(str, chain_data.multisig), amount=int(to_transfer), chain_type=ledger_config.chain, + rpc=rpc or ledger_config.rpc, ) async def funding_job( diff --git a/operate/services/protocol.py b/operate/services/protocol.py index 2f568f792..b9fd314bb 100644 --- a/operate/services/protocol.py +++ b/operate/services/protocol.py @@ -55,6 +55,7 @@ from autonomy.cli.helpers.chain import ServiceHelper as ServiceManager from eth_utils import to_bytes from hexbytes import HexBytes +from web3.contract import Contract from operate.constants import ( ON_CHAIN_INTERACT_RETRIES, @@ -537,6 +538,17 @@ def ledger_api(self) -> LedgerApi: ) return ledger_api + @property + def service_manager_instance(self) -> Contract: + """Load service manager contract instance.""" + contract_interface = registry_contracts.service_manager.contract_interface.get(self.ledger_api.identifier, {}) + instance = self.ledger_api.get_contract_instance( + contract_interface, + self.contracts["service_manager"], + ) + return instance + + def owner_of(self, token_id: int) -> str: """Get owner of a service.""" self._patch() @@ -985,11 +997,8 @@ def get_mint_tx_data( # pylint: disable=too-many-arguments #.verify_service_dependencies(agent_id=agent_id) # TODO add this check once subgraph production indexes agent 25 .publish_metadata() ) - instance = registry_contracts.service_manager.get_instance( - ledger_api=self.ledger_api, - contract_address=self.contracts["service_manager"], - ) + instance = self.service_manager_instance if update_token is None: safe = self.safe txd = instance.encodeABI( @@ -1047,10 +1056,7 @@ def get_olas_approval_data( def get_activate_data(self, service_id: int, cost_of_bond: int) -> t.Dict: """Get activate tx data.""" - instance = registry_contracts.service_manager.get_instance( - ledger_api=self.ledger_api, - contract_address=self.contracts["service_manager"], - ) + instance = self.service_manager_instance txd = instance.encodeABI( fn_name="activateRegistration", args=[service_id], @@ -1071,10 +1077,7 @@ def get_register_instances_data( cost_of_bond: int, ) -> t.Dict: """Get register instances tx data.""" - instance = registry_contracts.service_manager.get_instance( - ledger_api=self.ledger_api, - contract_address=self.contracts["service_manager"], - ) + instance = self.service_manager_instance txd = instance.encodeABI( fn_name="registerAgents", args=[ @@ -1097,10 +1100,7 @@ def get_deploy_data( reuse_multisig: bool = False, ) -> t.Dict: """Get deploy tx data.""" - instance = registry_contracts.service_manager.get_instance( - ledger_api=self.ledger_api, - contract_address=self.contracts["service_manager"], - ) + instance = self.service_manager_instance if reuse_multisig: _deployment_payload, error = get_reuse_multisig_payload( ledger_api=self.ledger_api, @@ -1142,10 +1142,7 @@ def get_deploy_data_from_safe( reuse_multisig: bool = False, ) -> t.List[t.Dict[str, t.Any]]: """Get the deploy data instructions for a safe""" - registry_instance = registry_contracts.service_manager.get_instance( - ledger_api=self.ledger_api, - contract_address=self.contracts["service_manager"], - ) + registry_instance = self.service_manager_instance approve_hash_message = None if reuse_multisig: _deployment_payload, approve_hash_message, error = get_reuse_multisig_from_safe_payload( @@ -1186,10 +1183,7 @@ def get_deploy_data_from_safe( def get_terminate_data(self, service_id: int) -> t.Dict: """Get terminate tx data.""" - instance = registry_contracts.service_manager.get_instance( - ledger_api=self.ledger_api, - contract_address=self.contracts["service_manager"], - ) + instance = self.service_manager_instance txd = instance.encodeABI( fn_name="terminate", args=[service_id], @@ -1203,10 +1197,7 @@ def get_terminate_data(self, service_id: int) -> t.Dict: def get_unbond_data(self, service_id: int) -> t.Dict: """Get unbond tx data.""" - instance = registry_contracts.service_manager.get_instance( - ledger_api=self.ledger_api, - contract_address=self.contracts["service_manager"], - ) + instance = self.service_manager_instance txd = instance.encodeABI( fn_name="unbond", args=[service_id], diff --git a/operate/wallet/master.py b/operate/wallet/master.py index 9790867bc..3b8be2af5 100644 --- a/operate/wallet/master.py +++ b/operate/wallet/master.py @@ -99,6 +99,7 @@ def transfer( amount: int, chain_type: ChainType, from_safe: bool = True, + rpc: t.Optional[str] = None, ) -> None: """Transfer funds to the given account.""" raise NotImplementedError() @@ -162,9 +163,9 @@ class EthereumMasterWallet(MasterWallet): _key = ledger_type.key_file _crypto_cls = EthereumCrypto - def _transfer_from_eoa(self, to: str, amount: int, chain_type: ChainType) -> None: + def _transfer_from_eoa(self, to: str, amount: int, chain_type: ChainType, rpc: t.Optional[str] = None) -> None: """Transfer funds from EOA wallet.""" - ledger_api = t.cast(EthereumApi, self.ledger_api(chain_type=chain_type)) + ledger_api = t.cast(EthereumApi, self.ledger_api(chain_type=chain_type, rpc=rpc)) tx_helper = TxSettler( ledger_api=ledger_api, crypto=self.crypto, @@ -195,12 +196,12 @@ def _build_tx( # pylint: disable=unused-argument setattr(tx_helper, "build", _build_tx) # noqa: B010 tx_helper.transact(lambda x: x, "", kwargs={}) - def _transfer_from_safe(self, to: str, amount: int, chain_type: ChainType) -> None: + def _transfer_from_safe(self, to: str, amount: int, chain_type: ChainType, rpc: t.Optional[str] = None) -> None: """Transfer funds from safe wallet.""" transfer_from_safe( - ledger_api=self.ledger_api(chain_type=chain_type), + ledger_api=self.ledger_api(chain_type=chain_type, rpc=rpc), crypto=self.crypto, - safe=t.cast(str, self.safes), + safe=t.cast(str, self.safes[chain_type]), to=to, amount=amount, ) @@ -211,6 +212,7 @@ def transfer( amount: int, chain_type: ChainType, from_safe: bool = True, + rpc: t.Optional[str] = None, ) -> None: """Transfer funds to the given account.""" if from_safe: @@ -218,11 +220,13 @@ def transfer( to=to, amount=amount, chain_type=chain_type, + rpc=rpc, ) return self._transfer_from_eoa( to=to, amount=amount, chain_type=chain_type, + rpc=rpc, ) @classmethod From eddca930961402b8307efc56664e0b9fa04272c4 Mon Sep 17 00:00:00 2001 From: Ardian Date: Wed, 28 Aug 2024 21:33:24 +0200 Subject: [PATCH 133/134] feat: add setup script --- operate/services/service.py | 1 - run_service.py | 367 ++++++++++++++++++++++++++++++++++++ run_service.sh | 28 +++ 3 files changed, 395 insertions(+), 1 deletion(-) create mode 100644 run_service.py create mode 100644 run_service.sh diff --git a/operate/services/service.py b/operate/services/service.py index 39a659762..f2549a1fd 100644 --- a/operate/services/service.py +++ b/operate/services/service.py @@ -589,7 +589,6 @@ def build( :param force: Remove existing deployment and build a new one :return: Deployment object """ - # TODO: chain_id should be used properly! Added as a hotfix for now. if use_docker: return self._build_docker(force=force, chain_id=chain_id) return self._build_host(force=force, chain_id=chain_id) diff --git a/run_service.py b/run_service.py new file mode 100644 index 000000000..2ad49dd17 --- /dev/null +++ b/run_service.py @@ -0,0 +1,367 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ +"""Optimus Quickstart script.""" + +import getpass +import sys +import time +import typing as t +from dataclasses import dataclass +from pathlib import Path + +import requests +from dotenv import load_dotenv +from halo import Halo +from termcolor import colored + +from operate.account.user import UserAccount +from operate.cli import OperateApp +from operate.resource import LocalResource +from operate.types import ( + LedgerType, + ServiceTemplate, + ConfigurationTemplate, + FundRequirementsTemplate, +) + +load_dotenv() + +XDAI_BALANCE_REQUIRED_TO_BOND = 10_000_000_000_000_000 +SUGGESTED_TOP_UP_DEFAULT = 50_000_000_000_000_000 +SUGGESTED_SAFE_TOP_UP_DEFAULT = 500_000_000_000_000_000 +MASTER_WALLET_MIMIMUM_BALANCE = 1_000_000_000_000_000_000 +COST_OF_BOND = 20_000_000_000_000_000 +WARNING_ICON = colored('\u26A0', 'yellow') +OPERATE_HOME = Path.cwd() / ".optimus" + + +@dataclass +class OptimusConfig(LocalResource): + """Local configuration.""" + + tenderly_api_key: t.Optional[str] = None + optimism_rpc: t.Optional[str] = None + ethereum_rpc: t.Optional[str] = None + base_rpc: t.Optional[str] = None + + +def print_box(text: str, margin: int = 1, character: str = '=') -> None: + """Print text centered within a box.""" + + lines = text.split('\n') + text_length = max(len(line) for line in lines) + length = text_length + 2 * margin + + border = character * length + margin_str = ' ' * margin + + print(border) + print(f"{margin_str}{text}{margin_str}") + print(border) + print() + + +def print_title(text: str) -> None: + """Print title.""" + print() + print_box(text, 4, '=') + + +def print_section(text: str) -> None: + """Print section.""" + print_box(text, 1, '-') + + +def wei_to_unit(wei: int) -> float: + """Convert Wei to unit.""" + return wei / 1e18 + + +def wei_to_token(wei: int, token: str = "xDAI") -> str: + """Convert Wei to token.""" + return f"{wei_to_unit(wei):.2f} {token}" + + +def ask_confirm_password() -> str: + password = getpass.getpass("Please enter a password: ") + confirm_password = getpass.getpass("Please confirm your password: ") + + if password == confirm_password: + return password + else: + print("Passwords do not match. Terminating.") + sys.exit(1) + + +def check_rpc(rpc_url: str) -> None: + spinner = Halo(text=f"Checking RPC...", spinner="dots") + spinner.start() + + rpc_data = { + "jsonrpc": "2.0", + "method": "eth_newFilter", + "params": ["invalid"], + "id": 1 + } + + try: + response = requests.post( + rpc_url, + json=rpc_data, + headers={"Content-Type": "application/json"} + ) + response.raise_for_status() + rpc_response = response.json() + except Exception as e: + print("Error: Failed to send RPC request:", e) + sys.exit(1) + + rcp_error_message = rpc_response.get("error", {}).get("message", "Exception processing RCP response") + + if rcp_error_message == "Exception processing RCP response": + print("Error: The received RCP response is malformed. Please verify the RPC address and/or RCP behavior.") + print(" Received response:") + print(" ", rpc_response) + print("") + print("Terminating script.") + sys.exit(1) + elif rcp_error_message == "Out of requests": + print("Error: The provided RCP is out of requests.") + print("Terminating script.") + sys.exit(1) + elif rcp_error_message == "The method eth_newFilter does not exist/is not available": + print("Error: The provided RPC does not support 'eth_newFilter'.") + print("Terminating script.") + sys.exit(1) + elif rcp_error_message == "invalid params": + spinner.succeed("RPC checks passed.") + else: + print("Error: Unknown RCP error.") + print(" Received response:") + print(" ", rpc_response) + print("") + print("Terminating script.") + sys.exit(1) + + +def get_local_config() -> OptimusConfig: + """Get local optimus configuration.""" + path = OPERATE_HOME / "local_config.json" + if path.exists(): + optimus_config = OptimusConfig.load(path) + else: + optimus_config = OptimusConfig() + + print_section("API Key Configuration") + + if optimus_config.ethereum_rpc is None: + optimus_config.ethereum_rpc = input("Please enter an Ethereum RPC URL: ") + + if optimus_config.optimism_rpc is None: + optimus_config.optimism_rpc = input("Please enter an Optimism RPC URL: ") + + if optimus_config.base_rpc is None: + optimus_config.base_rpc = input("Please enter a Base RPC URL: ") + + if optimus_config.tenderly_api_key is None: + optimus_config.tenderly_api_key = input( + "Please enter your Tenderly API Key. Get one at https://dashboard.tenderly.co/: " + ) + + return optimus_config + + +def get_service_template(config: OptimusConfig) -> ServiceTemplate: + """Get the service template""" + return ServiceTemplate({ + "name": "Optimus", + "hash": "bafybeihjiabgn2wzlrnwdij7lbg6tqvhe62mdycefdmsy2udiyxqtc3rsy", + "description": "Optimus", + "image": "https://operate.olas.network/_next/image?url=%2Fimages%2Fprediction-agent.png&w=3840&q=75", + "service_version": 'v0.18.1', + "home_chain_id": "10", + "configurations": { + "1": ConfigurationTemplate( + { + "staking_program_id": "pearl_alpha", + "rpc": config.ethereum_rpc, + "nft": "bafybeig64atqaladigoc3ds4arltdu63wkdrk3gesjfvnfdmz35amv7faq", + "cost_of_bond": COST_OF_BOND, + "threshold": 1, + "use_staking": False, + "fund_requirements": FundRequirementsTemplate( + { + "agent": SUGGESTED_TOP_UP_DEFAULT, + "safe": SUGGESTED_SAFE_TOP_UP_DEFAULT, + } + ), + } + ), + "10": ConfigurationTemplate( + { + "staking_program_id": "pearl_alpha", + "rpc": config.optimism_rpc, + "nft": "bafybeig64atqaladigoc3ds4arltdu63wkdrk3gesjfvnfdmz35amv7faq", + "cost_of_bond": COST_OF_BOND, + "threshold": 1, + "use_staking": False, + "fund_requirements": FundRequirementsTemplate( + { + "agent": SUGGESTED_TOP_UP_DEFAULT, + "safe": SUGGESTED_SAFE_TOP_UP_DEFAULT, + } + ), + } + ), + "8453": ConfigurationTemplate( + { + "staking_program_id": "pearl_alpha", + "rpc": config.base_rpc, + "nft": "bafybeig64atqaladigoc3ds4arltdu63wkdrk3gesjfvnfdmz35amv7faq", + "cost_of_bond": COST_OF_BOND, + "threshold": 1, + "use_staking": False, + "fund_requirements": FundRequirementsTemplate( + { + "agent": SUGGESTED_TOP_UP_DEFAULT, + "safe": SUGGESTED_SAFE_TOP_UP_DEFAULT, + } + ), + } + ), + }, +}) + + +def main() -> None: + """Run service.""" + + print_title("Optimus Quickstart") + print("This script will assist you in setting up and running the Optimus service.") + print() + + print_section("Set up local user account") + operate = OperateApp( + home=OPERATE_HOME, + ) + operate.setup() + + optimus_config = get_local_config() + template = get_service_template(optimus_config) + + if operate.user_account is None: + print("Creating a new local user account...") + password = "12345" + UserAccount.new( + password=password, + path=operate._path / "user.json", + ) + else: + password = "12345" + # password = getpass.getpass("Enter local user account password: ") + if not operate.user_account.is_valid(password=password): + print("Invalid password!") + sys.exit(1) + + operate.password = password + if not operate.wallet_manager.exists(ledger_type=LedgerType.ETHEREUM): + print("Creating the main wallet...") + wallet, mnemonic = operate.wallet_manager.create(ledger_type=LedgerType.ETHEREUM) + wallet.password = password + print() + print_box(f"Please save the mnemonic phrase for the main wallet:\n{', '.join(mnemonic)}", 0, '-') + input("Press enter to continue...") + else: + wallet = operate.wallet_manager.load(ledger_type=LedgerType.ETHEREUM) + + manager = operate.service_manager() + service = manager.load_or_create( + hash=template["hash"], + service_template=template, + ) + + for chain_id, configuration in service.chain_configs.items(): + chain_config = service.chain_configs[chain_id] + chain_type = chain_config.ledger_config.chain + ledger_api = wallet.ledger_api( + chain_type=chain_type, + rpc=chain_config.ledger_config.rpc, + ) + + print(f"[Chain {chain_id}] Main wallet balance: {wei_to_token(ledger_api.get_balance(wallet.crypto.address))}") + spinner = Halo( + text=f"Please make sure main wallet {wallet.crypto.address} has at least {wei_to_token(MASTER_WALLET_MIMIMUM_BALANCE)}.", + spinner="dots" + ) + spinner.start() + + while ledger_api.get_balance(wallet.crypto.address) < MASTER_WALLET_MIMIMUM_BALANCE: + time.sleep(1) + + spinner.succeed(f"Main wallet updated balance: {wei_to_token(ledger_api.get_balance(wallet.crypto.address))}.") + print() + + if wallet.safes.get(chain_type) is not None: + print("Safe already exists") + else: + print("Creating Safe") + ledger_type = LedgerType.ETHEREUM + wallet_manager = operate.wallet_manager + wallet = wallet_manager.load(ledger_type=ledger_type) + + wallet.create_safe( # pylint: disable=no-member + chain_type=chain_type, + rpc=chain_config.ledger_config.rpc, + ) + print("Funding Safe") + wallet.transfer( + to=t.cast(str, wallet.safes[chain_type]), + amount=int(MASTER_WALLET_MIMIMUM_BALANCE), + chain_type=chain_type, + from_safe=False, + rpc=chain_config.ledger_config.rpc, + ) + + print_section("Set up the service in the Olas Protocol") + + address = wallet.safes[chain_type] + print(f"Safe balance: {wei_to_token(ledger_api.get_balance(address))}") + spinner = Halo( + text=f"Please make sure address {address} has at least {wei_to_token(MASTER_WALLET_MIMIMUM_BALANCE)}.", + spinner="dots", + ) + spinner.start() + + while ledger_api.get_balance(address) < MASTER_WALLET_MIMIMUM_BALANCE: + time.sleep(1) + + spinner.succeed(f"Safe updated balance: {wei_to_token(ledger_api.get_balance(address))}.") + + manager.deploy_service_onchain_from_safe_single_chain(hash=service.hash, chain_id=chain_id) + manager.fund_service(hash=service.hash, chain_id=chain_id) + + home_chain_id = service.home_chain_id + manager.deploy_service_locally(hash=service.hash, chain_id=chain_id, use_docker=True) + + print() + print_section("Run the service") + + +if __name__ == "__main__": + main() diff --git a/run_service.sh b/run_service.sh new file mode 100644 index 000000000..2c23a9c9f --- /dev/null +++ b/run_service.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# ------------------------------------------------------------------------------ +# +# Copyright 2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + +if [ "$(git rev-parse --is-inside-work-tree)" = true ] +then + poetry install + poetry run python quickstart/run_service.py +else + echo "$directory is not a git repo!" + exit 1 +fi From 8bfc593fcbe4532ed77b9dd5aa727f0b7973d5e2 Mon Sep 17 00:00:00 2001 From: Ardian Date: Wed, 28 Aug 2024 21:36:27 +0200 Subject: [PATCH 134/134] chore: remove unecessary files --- build.js | 68 - build.tester.js | 52 - build_pearl.sh | 47 - download_binaries.sh | 10 - electron/.eslintrc.json | 24 - electron/afterPack.js | 25 - electron/assets/css/antd.css | 27541 ---------------- .../assets/icons/splash-robot-head-dock.png | Bin 32513 -> 0 bytes electron/assets/icons/splash-robot-head.png | Bin 319634 -> 0 bytes electron/assets/icons/tray-logged-out.png | Bin 1336 -> 0 bytes electron/assets/icons/tray-low-gas.png | Bin 1433 -> 0 bytes electron/assets/icons/tray-paused.png | Bin 1312 -> 0 bytes electron/assets/icons/tray-running.png | Bin 1342 -> 0 bytes electron/constants/index.js | 55 - electron/entitlements.mac.plist | 26 - electron/icons.js | 30 - electron/install.js | 209 - electron/loading/index.html | 46 - electron/loading/styles.css | 26 - electron/logger.js | 73 - electron/main.js | 697 - electron/ports.js | 79 - electron/preload.js | 25 - electron/processes.js | 40 - electron/public/broken-robot.svg | 9 - electron/public/happy-robot.svg | 9 - electron/public/onboarding-robot.svg | 6 - electron/public/sad-robot.svg | 14 - electron/public/splash-robot-head.png | Bin 319634 -> 0 bytes electron/public/twitter.svg | 3 - electron/scripts/install_brew.sh | 1097 - electron/scripts/install_docker_ubuntu.sh | 8 - electron/store.js | 35 - electron/update.js | 16 - frontend/.eslintrc.json | 40 - frontend/abis/agentMech.ts | 339 - frontend/abis/erc20.ts | 3 - frontend/abis/gnosisSafe.ts | 573 - frontend/abis/mechActivityChecker.ts | 44 - frontend/abis/multicall3.ts | 440 - frontend/abis/serviceRegistryL2.ts | 1009 - frontend/abis/serviceRegistryTokenUtility.ts | 481 - frontend/abis/serviceStakingTokenMechUsage.ts | 1265 - frontend/client/enums.ts | 35 - frontend/client/index.ts | 2 - frontend/client/types.ts | 138 - frontend/components/Alert/AlertTitle.tsx | 5 - frontend/components/Alert/index.tsx | 28 - frontend/components/Card/CardTitle.tsx | 10 - .../components/Confetti/ConfettiAnimation.jsx | 43 - .../components/HelpAndSupportPage/index.tsx | 122 - frontend/components/Layout/TopBar.tsx | 66 - frontend/components/Layout/index.tsx | 59 - .../MainPage/MainHeader/FirstRunModal.tsx | 58 - .../MainPage/header/AgentButton.tsx | 304 - .../components/MainPage/header/AgentHead.tsx | 36 - .../header/CannotStartAgentPopover.tsx | 102 - .../components/MainPage/header/constants.ts | 11 - frontend/components/MainPage/header/index.tsx | 46 - frontend/components/MainPage/index.tsx | 68 - .../MainPage/modals/FirstRunModal.tsx | 58 - .../MainPage/modals/MigrationModal.tsx | 66 - .../MainPage/sections/AddFundsSection.tsx | 155 - .../MainPage/sections/GasBalanceSection.tsx | 135 - .../sections/KeepAgentRunningSection.tsx | 36 - .../MainPage/sections/NeedsFundsSection.tsx | 162 - .../NewStakingProgramAlertSection.tsx | 36 - .../MainPage/sections/OlasBalanceSection.tsx | 230 - .../MainPage/sections/RewardsSection.tsx | 184 - .../StakingContractTag.tsx | 16 - .../StakingContractSection/alerts.tsx | 62 - .../StakingContractSection/index.tsx | 301 - .../WhatAreStakingContracts.tsx | 43 - .../components/ManageStakingPage/index.tsx | 40 - .../SettingsPage/AddBackupWalletPage.tsx | 68 - .../SettingsPage/DebugInfoSection.tsx | 228 - .../SettingsStakingContractSection.tsx | 58 - frontend/components/SettingsPage/index.tsx | 134 - .../SetupPage/Create/SetupBackupSigner.tsx | 68 - .../SetupPage/Create/SetupCreateHeader.tsx | 42 - .../SetupPage/Create/SetupCreateSafe.tsx | 79 - .../SetupPage/Create/SetupEoaFunding.tsx | 173 - .../SetupPage/Create/SetupPassword.tsx | 88 - .../SetupPage/Create/SetupSeedPhrase.tsx | 46 - .../components/SetupPage/SetupRestore.tsx | 197 - .../components/SetupPage/SetupWelcome.tsx | 197 - frontend/components/SetupPage/index.tsx | 53 - frontend/components/styled/CardFlex.tsx | 19 - frontend/components/styled/CardSection.tsx | 45 - frontend/components/styled/FormFlex.tsx | 7 - frontend/constants/chains.ts | 8 - frontend/constants/colors.ts | 12 - frontend/constants/contractAddresses.ts | 36 - frontend/constants/env.ts | 1 - frontend/constants/intervals.ts | 1 - frontend/constants/providers.ts | 8 - frontend/constants/serviceTemplates.ts | 30 - frontend/constants/stakingProgramMeta.ts | 15 - frontend/constants/symbols.ts | 4 - frontend/constants/thresholds.ts | 11 - frontend/constants/tokens.ts | 7 - frontend/constants/urls.ts | 7 - frontend/context/BalanceProvider.tsx | 328 - frontend/context/ElectronApiProvider.tsx | 97 - frontend/context/MasterSafeProvider.tsx | 86 - frontend/context/ModalProvider.tsx | 33 - frontend/context/OnlineStatusProvider.tsx | 43 - frontend/context/PageStateProvider.tsx | 29 - frontend/context/RewardProvider.tsx | 138 - frontend/context/ServicesProvider.tsx | 125 - frontend/context/SettingsProvider.tsx | 23 - frontend/context/SetupProvider.tsx | 44 - .../context/StakingContractInfoProvider.tsx | 103 - frontend/context/StakingProgramContext.tsx | 59 - frontend/context/StoreProvider.tsx | 39 - frontend/context/WalletProvider.tsx | 51 - frontend/enums/PageState.ts | 9 - .../enums/ServiceRegistryL2ServiceState.ts | 9 - frontend/enums/SettingsScreen.ts | 4 - frontend/enums/SetupScreen.ts | 14 - frontend/enums/StakingProgram.ts | 4 - frontend/enums/StakingProgramStatus.ts | 4 - frontend/enums/Token.ts | 4 - frontend/hooks/useBalance.ts | 5 - frontend/hooks/useElectronApi.ts | 5 - frontend/hooks/useLogs.ts | 96 - frontend/hooks/useMasterSafe.ts | 7 - frontend/hooks/useModals.ts | 13 - frontend/hooks/usePageState.ts | 14 - frontend/hooks/useReward.ts | 19 - frontend/hooks/useServiceTemplates.ts | 14 - frontend/hooks/useServices.ts | 105 - frontend/hooks/useSettings.ts | 5 - frontend/hooks/useSetup.ts | 26 - frontend/hooks/useStakingContractInfo.ts | 65 - frontend/hooks/useStakingProgram.ts | 33 - frontend/hooks/useStore.ts | 5 - frontend/hooks/useWallet.ts | 5 - frontend/jest.config.ts | 19 - frontend/jest.setup.ts | 1 - frontend/next-env.d.ts | 5 - frontend/next.config.mjs | 42 - frontend/package.json | 54 - frontend/pages/_app.tsx | 67 - frontend/pages/index.tsx | 54 - frontend/public/broken-robot.svg | 9 - frontend/public/happy-robot.svg | 9 - frontend/public/onboarding-robot.svg | 6 - frontend/public/sad-robot.svg | 14 - frontend/public/splash-robot-head.png | Bin 319634 -> 0 bytes frontend/public/twitter.svg | 3 - frontend/service/Account.ts | 58 - frontend/service/Autonolas.ts | 348 - frontend/service/Ethers.ts | 108 - frontend/service/GnosisSafe.ts | 23 - frontend/service/Multicall.ts | 83 - frontend/service/Services.ts | 114 - frontend/service/Wallet.ts | 42 - frontend/styles/globals.scss | 207 - frontend/theme/index.ts | 43 - frontend/tsconfig.json | 38 - frontend/types/Address.ts | 1 - frontend/types/Autonolas.ts | 25 - frontend/types/ElectronApi.ts | 13 - frontend/types/Records.ts | 12 - frontend/types/StakingProgram.ts | 12 - frontend/utils/copyToClipboard.ts | 2 - frontend/utils/isDev.ts | 1 - frontend/utils/numberFormatters.ts | 11 - frontend/utils/service.ts | 21 - frontend/utils/truncate.ts | 4 - frontend/yarn.lock | 6263 ---- hardhat.config.js | 16 - 173 files changed, 48154 deletions(-) delete mode 100644 build.js delete mode 100644 build.tester.js delete mode 100755 build_pearl.sh delete mode 100755 download_binaries.sh delete mode 100644 electron/.eslintrc.json delete mode 100644 electron/afterPack.js delete mode 100644 electron/assets/css/antd.css delete mode 100644 electron/assets/icons/splash-robot-head-dock.png delete mode 100644 electron/assets/icons/splash-robot-head.png delete mode 100644 electron/assets/icons/tray-logged-out.png delete mode 100644 electron/assets/icons/tray-low-gas.png delete mode 100644 electron/assets/icons/tray-paused.png delete mode 100644 electron/assets/icons/tray-running.png delete mode 100644 electron/constants/index.js delete mode 100644 electron/entitlements.mac.plist delete mode 100644 electron/icons.js delete mode 100644 electron/install.js delete mode 100644 electron/loading/index.html delete mode 100644 electron/loading/styles.css delete mode 100644 electron/logger.js delete mode 100644 electron/main.js delete mode 100644 electron/ports.js delete mode 100644 electron/preload.js delete mode 100644 electron/processes.js delete mode 100644 electron/public/broken-robot.svg delete mode 100644 electron/public/happy-robot.svg delete mode 100644 electron/public/onboarding-robot.svg delete mode 100644 electron/public/sad-robot.svg delete mode 100644 electron/public/splash-robot-head.png delete mode 100644 electron/public/twitter.svg delete mode 100644 electron/scripts/install_brew.sh delete mode 100644 electron/scripts/install_docker_ubuntu.sh delete mode 100644 electron/store.js delete mode 100644 electron/update.js delete mode 100644 frontend/.eslintrc.json delete mode 100644 frontend/abis/agentMech.ts delete mode 100644 frontend/abis/erc20.ts delete mode 100644 frontend/abis/gnosisSafe.ts delete mode 100644 frontend/abis/mechActivityChecker.ts delete mode 100644 frontend/abis/multicall3.ts delete mode 100644 frontend/abis/serviceRegistryL2.ts delete mode 100644 frontend/abis/serviceRegistryTokenUtility.ts delete mode 100644 frontend/abis/serviceStakingTokenMechUsage.ts delete mode 100644 frontend/client/enums.ts delete mode 100644 frontend/client/index.ts delete mode 100644 frontend/client/types.ts delete mode 100644 frontend/components/Alert/AlertTitle.tsx delete mode 100644 frontend/components/Alert/index.tsx delete mode 100644 frontend/components/Card/CardTitle.tsx delete mode 100644 frontend/components/Confetti/ConfettiAnimation.jsx delete mode 100644 frontend/components/HelpAndSupportPage/index.tsx delete mode 100644 frontend/components/Layout/TopBar.tsx delete mode 100644 frontend/components/Layout/index.tsx delete mode 100644 frontend/components/MainPage/MainHeader/FirstRunModal.tsx delete mode 100644 frontend/components/MainPage/header/AgentButton.tsx delete mode 100644 frontend/components/MainPage/header/AgentHead.tsx delete mode 100644 frontend/components/MainPage/header/CannotStartAgentPopover.tsx delete mode 100644 frontend/components/MainPage/header/constants.ts delete mode 100644 frontend/components/MainPage/header/index.tsx delete mode 100644 frontend/components/MainPage/index.tsx delete mode 100644 frontend/components/MainPage/modals/FirstRunModal.tsx delete mode 100644 frontend/components/MainPage/modals/MigrationModal.tsx delete mode 100644 frontend/components/MainPage/sections/AddFundsSection.tsx delete mode 100644 frontend/components/MainPage/sections/GasBalanceSection.tsx delete mode 100644 frontend/components/MainPage/sections/KeepAgentRunningSection.tsx delete mode 100644 frontend/components/MainPage/sections/NeedsFundsSection.tsx delete mode 100644 frontend/components/MainPage/sections/NewStakingProgramAlertSection.tsx delete mode 100644 frontend/components/MainPage/sections/OlasBalanceSection.tsx delete mode 100644 frontend/components/MainPage/sections/RewardsSection.tsx delete mode 100644 frontend/components/ManageStakingPage/StakingContractSection/StakingContractTag.tsx delete mode 100644 frontend/components/ManageStakingPage/StakingContractSection/alerts.tsx delete mode 100644 frontend/components/ManageStakingPage/StakingContractSection/index.tsx delete mode 100644 frontend/components/ManageStakingPage/WhatAreStakingContracts.tsx delete mode 100644 frontend/components/ManageStakingPage/index.tsx delete mode 100644 frontend/components/SettingsPage/AddBackupWalletPage.tsx delete mode 100644 frontend/components/SettingsPage/DebugInfoSection.tsx delete mode 100644 frontend/components/SettingsPage/SettingsStakingContractSection.tsx delete mode 100644 frontend/components/SettingsPage/index.tsx delete mode 100644 frontend/components/SetupPage/Create/SetupBackupSigner.tsx delete mode 100644 frontend/components/SetupPage/Create/SetupCreateHeader.tsx delete mode 100644 frontend/components/SetupPage/Create/SetupCreateSafe.tsx delete mode 100644 frontend/components/SetupPage/Create/SetupEoaFunding.tsx delete mode 100644 frontend/components/SetupPage/Create/SetupPassword.tsx delete mode 100644 frontend/components/SetupPage/Create/SetupSeedPhrase.tsx delete mode 100644 frontend/components/SetupPage/SetupRestore.tsx delete mode 100644 frontend/components/SetupPage/SetupWelcome.tsx delete mode 100644 frontend/components/SetupPage/index.tsx delete mode 100644 frontend/components/styled/CardFlex.tsx delete mode 100644 frontend/components/styled/CardSection.tsx delete mode 100644 frontend/components/styled/FormFlex.tsx delete mode 100644 frontend/constants/chains.ts delete mode 100644 frontend/constants/colors.ts delete mode 100644 frontend/constants/contractAddresses.ts delete mode 100644 frontend/constants/env.ts delete mode 100644 frontend/constants/intervals.ts delete mode 100644 frontend/constants/providers.ts delete mode 100644 frontend/constants/serviceTemplates.ts delete mode 100644 frontend/constants/stakingProgramMeta.ts delete mode 100644 frontend/constants/symbols.ts delete mode 100644 frontend/constants/thresholds.ts delete mode 100644 frontend/constants/tokens.ts delete mode 100644 frontend/constants/urls.ts delete mode 100644 frontend/context/BalanceProvider.tsx delete mode 100644 frontend/context/ElectronApiProvider.tsx delete mode 100644 frontend/context/MasterSafeProvider.tsx delete mode 100644 frontend/context/ModalProvider.tsx delete mode 100644 frontend/context/OnlineStatusProvider.tsx delete mode 100644 frontend/context/PageStateProvider.tsx delete mode 100644 frontend/context/RewardProvider.tsx delete mode 100644 frontend/context/ServicesProvider.tsx delete mode 100644 frontend/context/SettingsProvider.tsx delete mode 100644 frontend/context/SetupProvider.tsx delete mode 100644 frontend/context/StakingContractInfoProvider.tsx delete mode 100644 frontend/context/StakingProgramContext.tsx delete mode 100644 frontend/context/StoreProvider.tsx delete mode 100644 frontend/context/WalletProvider.tsx delete mode 100644 frontend/enums/PageState.ts delete mode 100644 frontend/enums/ServiceRegistryL2ServiceState.ts delete mode 100644 frontend/enums/SettingsScreen.ts delete mode 100644 frontend/enums/SetupScreen.ts delete mode 100644 frontend/enums/StakingProgram.ts delete mode 100644 frontend/enums/StakingProgramStatus.ts delete mode 100644 frontend/enums/Token.ts delete mode 100644 frontend/hooks/useBalance.ts delete mode 100644 frontend/hooks/useElectronApi.ts delete mode 100644 frontend/hooks/useLogs.ts delete mode 100644 frontend/hooks/useMasterSafe.ts delete mode 100644 frontend/hooks/useModals.ts delete mode 100644 frontend/hooks/usePageState.ts delete mode 100644 frontend/hooks/useReward.ts delete mode 100644 frontend/hooks/useServiceTemplates.ts delete mode 100644 frontend/hooks/useServices.ts delete mode 100644 frontend/hooks/useSettings.ts delete mode 100644 frontend/hooks/useSetup.ts delete mode 100644 frontend/hooks/useStakingContractInfo.ts delete mode 100644 frontend/hooks/useStakingProgram.ts delete mode 100644 frontend/hooks/useStore.ts delete mode 100644 frontend/hooks/useWallet.ts delete mode 100644 frontend/jest.config.ts delete mode 100644 frontend/jest.setup.ts delete mode 100644 frontend/next-env.d.ts delete mode 100644 frontend/next.config.mjs delete mode 100644 frontend/package.json delete mode 100644 frontend/pages/_app.tsx delete mode 100644 frontend/pages/index.tsx delete mode 100644 frontend/public/broken-robot.svg delete mode 100644 frontend/public/happy-robot.svg delete mode 100644 frontend/public/onboarding-robot.svg delete mode 100644 frontend/public/sad-robot.svg delete mode 100644 frontend/public/splash-robot-head.png delete mode 100644 frontend/public/twitter.svg delete mode 100644 frontend/service/Account.ts delete mode 100644 frontend/service/Autonolas.ts delete mode 100644 frontend/service/Ethers.ts delete mode 100644 frontend/service/GnosisSafe.ts delete mode 100644 frontend/service/Multicall.ts delete mode 100644 frontend/service/Services.ts delete mode 100644 frontend/service/Wallet.ts delete mode 100644 frontend/styles/globals.scss delete mode 100644 frontend/theme/index.ts delete mode 100644 frontend/tsconfig.json delete mode 100644 frontend/types/Address.ts delete mode 100644 frontend/types/Autonolas.ts delete mode 100644 frontend/types/ElectronApi.ts delete mode 100644 frontend/types/Records.ts delete mode 100644 frontend/types/StakingProgram.ts delete mode 100644 frontend/utils/copyToClipboard.ts delete mode 100644 frontend/utils/isDev.ts delete mode 100644 frontend/utils/numberFormatters.ts delete mode 100644 frontend/utils/service.ts delete mode 100644 frontend/utils/truncate.ts delete mode 100644 frontend/yarn.lock delete mode 100644 hardhat.config.js diff --git a/build.js b/build.js deleted file mode 100644 index fa1e1b0db..000000000 --- a/build.js +++ /dev/null @@ -1,68 +0,0 @@ -/** - * This script is used to build the electron app **with notarization**. It is used for the final build and release process. - */ -require('dotenv').config(); -const build = require('electron-builder').build; - -const { publishOptions } = require('./electron/constants'); - -/** - * Get the artifact name for the build based on the environment. - * @returns {string} - */ -function artifactName() { - const env = process.env.NODE_ENV; - const prefix = env === 'production' ? '' : 'dev-'; - return prefix + '${productName}-${version}-${platform}-${arch}.${ext}'; -} - -const main = async () => { - console.log('Building...'); - - /** @type import {CliOptions} from "electron-builder" */ - await build({ - publish: 'onTag', - config: { - appId: 'xyz.valory.olas-operate-app', - artifactName: artifactName(), - productName: 'Pearl', - files: ['electron/**/*', 'package.json'], - directories: { - output: 'dist', - }, - extraResources: [ - { - from: 'electron/bins', - to: 'bins', - filter: ['**/*'], - }, - { - from: '.env', - to: '.env' - }, - ], - cscKeyPassword: process.env.CSC_KEY_PASSWORD, - cscLink: process.env.CSC_LINK, - mac: { - target: [ - { - target: 'default', - arch: ['x64', 'arm64'], - }, - ], - publish: publishOptions, - category: 'public.app-category.utilities', - icon: 'electron/assets/icons/splash-robot-head-dock.png', - hardenedRuntime: true, - gatekeeperAssess: false, - entitlements: 'electron/entitlements.mac.plist', - entitlementsInherit: 'electron/entitlements.mac.plist', - notarize: { - teamId: process.env.APPLETEAMID, - }, - }, - }, - }); -}; - -main().then((response) => { console.log('Build & Notarize complete'); }).catch((e) => console.error(e)); diff --git a/build.tester.js b/build.tester.js deleted file mode 100644 index c4a9439e0..000000000 --- a/build.tester.js +++ /dev/null @@ -1,52 +0,0 @@ -/** - * This script is used to build the electron app **without** notarization. - * - * This is useful for testing the build process. - * It will not notarize the app, so it will not be able to be run on someone else's Mac without disabling Gatekeeper on their machine. - */ -require('dotenv').config(); -const build = require('electron-builder').build; - -const { publishOptions } = require('./electron/constants'); - -const main = async () => { - console.log('Building...'); - - /** @type import {CliOptions} from "electron-builder" */ - await build({ - publish: 'onTag', - config: { - appId: 'xyz.valory.olas-operate-app', - artifactName: '${productName}-${version}-${platform}-${arch}.${ext}', - productName: 'Pearl', - files: ['electron/**/*', 'package.json'], - directories: { - output: 'dist', - }, - extraResources: [ - { - from: 'electron/bins', - to: 'bins', - filter: ['**/*'], - }, - ], - mac: { - publish: null, - target: [ - { - target: 'default', - arch: ['arm64'], - }, - ], - category: 'public.app-category.utilities', - icon: 'electron/assets/icons/splash-robot-head-dock.png', - hardenedRuntime: true, - gatekeeperAssess: false, - entitlements: 'electron/entitlements.mac.plist', - entitlementsInherit: 'electron/entitlements.mac.plist', - }, - }, - }); -}; - -main().then((response) => { console.log('Build & Notarize complete'); }).catch((e) => console.error(e)); diff --git a/build_pearl.sh b/build_pearl.sh deleted file mode 100755 index 65e5d4ac9..000000000 --- a/build_pearl.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash - -# ------------------------------------------------------------------------------ -# -# Copyright 2023-2024 Valory AG -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# ------------------------------------------------------------------------------ - -cd "$(dirname "$0")" - -BIN_DIR="electron/bins/" -mkdir -p $BIN_DIR - -poetry install - -poetry run pyinstaller operate/services/utils/tendermint.py --onefile --distpath $BIN_DIR - -poetry run pyinstaller \ - --collect-data eth_account \ - --collect-all aea \ - --collect-all autonomy \ - --collect-all operate \ - --collect-all aea_ledger_ethereum \ - --collect-all aea_ledger_cosmos \ - --collect-all aea_ledger_ethereum_flashbots \ - --hidden-import aea_ledger_ethereum \ - --hidden-import aea_ledger_cosmos \ - --hidden-import aea_ledger_ethereum_flashbots \ - operate/pearl.py \ - --add-binary ${BIN_DIR}/aea_bin_x64:. \ - --add-binary ${BIN_DIR}/aea_bin_arm64:. \ - --onefile \ - --distpath $BIN_DIR \ - --name pearl_$(uname -m) - diff --git a/download_binaries.sh b/download_binaries.sh deleted file mode 100755 index db12c6223..000000000 --- a/download_binaries.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -BIN_DIR="electron/bins/" -mkdir -p $BIN_DIR - -trader_version=$(poetry run python -c "import yaml; config = yaml.safe_load(open('templates/trader.yaml')); print(config['configuration']['trader_version'])") - -curl -L -o "${BIN_DIR}aea_bin_x64" "https://github.com/valory-xyz/trader/releases/download/${trader_version}/trader_bin_x64" - -curl -L -o "${BIN_DIR}aea_bin_arm64" "https://github.com/valory-xyz/trader/releases/download/${trader_version}/trader_bin_arm64" diff --git a/electron/.eslintrc.json b/electron/.eslintrc.json deleted file mode 100644 index 1aca62fc4..000000000 --- a/electron/.eslintrc.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "extends": ["eslint:recommended", "plugin:prettier/recommended"], - "plugins": ["prettier"], - "ignorePatterns": [".next/"], - "rules": { - "prettier/prettier": [ - "error", - { - "endOfLine": "auto", - "semi": true, - "singleQuote": true - } - ], - "no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }] - }, - "parserOptions": { - "ecmaVersion": "latest", - "commonjs": true - }, - "env": { - "node": true, - "es6": true - } -} diff --git a/electron/afterPack.js b/electron/afterPack.js deleted file mode 100644 index 2c196e49a..000000000 --- a/electron/afterPack.js +++ /dev/null @@ -1,25 +0,0 @@ -const { promises: fs } = require('fs'); -const log = (...messages) => console.log(...messages); - -exports.default = async function (context) { - if (context.electronPlatformName !== 'darwin') { - return context; - } - const troublesome_files = [ - `dist/mac-arm64/Olas Operate.app/Contents/Resources/app.asar.unpacked/node_modules/electron-sudo/dist/bin/applet.app/Contents/MacOS/applet/LICENSE`, - ]; - - try { - log('\n\n🪝 afterPack hook triggered: '); - await Promise.all( - troublesome_files.map((file) => { - log(`Deleting ${file}`); - return fs.rm(file); - }), - ); - log('Cleaned up LICENSE files\n\n'); - return context; - } catch (e) { - log(`afterPack issue: `, e); - } -}; diff --git a/electron/assets/css/antd.css b/electron/assets/css/antd.css deleted file mode 100644 index 76932195c..000000000 --- a/electron/assets/css/antd.css +++ /dev/null @@ -1,27541 +0,0 @@ -/*! - * - * antd v4.4.3 - * - * Copyright 2015-present, Alipay, Inc. - * All rights reserved. - * - */ -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -[class^=ant-]::-ms-clear, -[class*= ant-]::-ms-clear, -[class^=ant-] input::-ms-clear, -[class*= ant-] input::-ms-clear, -[class^=ant-] input::-ms-reveal, -[class*= ant-] input::-ms-reveal { - display: none; -} -[class^=ant-], -[class*= ant-], -[class^=ant-] *, -[class*= ant-] *, -[class^=ant-] *::before, -[class*= ant-] *::before, -[class^=ant-] *::after, -[class*= ant-] *::after { - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -/* stylelint-disable at-rule-no-unknown */ -html, -body { - width: 100%; - height: 100%; -} -input::-ms-clear, -input::-ms-reveal { - display: none; -} -*, -*::before, -*::after { - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -html { - font-family: sans-serif; - line-height: 1.15; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; - -ms-overflow-style: scrollbar; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -@-ms-viewport { - width: device-width; -} -body { - margin: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; - font-variant: tabular-nums; - line-height: 1.5715; - background-color: #fff; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; -} -[tabindex='-1']:focus { - outline: none !important; -} -hr { - -webkit-box-sizing: content-box; - box-sizing: content-box; - height: 0; - overflow: visible; -} -h1, -h2, -h3, -h4, -h5, -h6 { - margin-top: 0; - margin-bottom: 0.5em; - color: rgba(0, 0, 0, 0.85); - font-weight: 500; -} -p { - margin-top: 0; - margin-bottom: 1em; -} -abbr[title], -abbr[data-original-title] { - text-decoration: underline; - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; - border-bottom: 0; - cursor: help; -} -address { - margin-bottom: 1em; - font-style: normal; - line-height: inherit; -} -input[type='text'], -input[type='password'], -input[type='number'], -textarea { - -webkit-appearance: none; -} -ol, -ul, -dl { - margin-top: 0; - margin-bottom: 1em; -} -ol ol, -ul ul, -ol ul, -ul ol { - margin-bottom: 0; -} -dt { - font-weight: 500; -} -dd { - margin-bottom: 0.5em; - margin-left: 0; -} -blockquote { - margin: 0 0 1em; -} -dfn { - font-style: italic; -} -b, -strong { - font-weight: bolder; -} -small { - font-size: 80%; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sub { - bottom: -0.25em; -} -sup { - top: -0.5em; -} -a { - color: #1890ff; - text-decoration: none; - background-color: transparent; - outline: none; - cursor: pointer; - -webkit-transition: color 0.3s; - transition: color 0.3s; - -webkit-text-decoration-skip: objects; -} -a:hover { - color: #40a9ff; -} -a:active { - color: #096dd9; -} -a:active, -a:hover { - text-decoration: none; - outline: 0; -} -a:focus { - text-decoration: none; - outline: 0; -} -a[disabled] { - color: rgba(0, 0, 0, 0.25); - cursor: not-allowed; - pointer-events: none; -} -pre, -code, -kbd, -samp { - font-size: 1em; - font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace; -} -pre { - margin-top: 0; - margin-bottom: 1em; - overflow: auto; -} -figure { - margin: 0 0 1em; -} -img { - vertical-align: middle; - border-style: none; -} -svg:not(:root) { - overflow: hidden; -} -a, -area, -button, -[role='button'], -input:not([type='range']), -label, -select, -summary, -textarea { - -ms-touch-action: manipulation; - touch-action: manipulation; -} -table { - border-collapse: collapse; -} -caption { - padding-top: 0.75em; - padding-bottom: 0.3em; - color: rgba(0, 0, 0, 0.45); - text-align: left; - caption-side: bottom; -} -th { - text-align: inherit; -} -input, -button, -select, -optgroup, -textarea { - margin: 0; - color: inherit; - font-size: inherit; - font-family: inherit; - line-height: inherit; -} -button, -input { - overflow: visible; -} -button, -select { - text-transform: none; -} -button, -html [type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; -} -button::-moz-focus-inner, -[type='button']::-moz-focus-inner, -[type='reset']::-moz-focus-inner, -[type='submit']::-moz-focus-inner { - padding: 0; - border-style: none; -} -input[type='radio'], -input[type='checkbox'] { - -webkit-box-sizing: border-box; - box-sizing: border-box; - padding: 0; -} -input[type='date'], -input[type='time'], -input[type='datetime-local'], -input[type='month'] { - -webkit-appearance: listbox; -} -textarea { - overflow: auto; - resize: vertical; -} -fieldset { - min-width: 0; - margin: 0; - padding: 0; - border: 0; -} -legend { - display: block; - width: 100%; - max-width: 100%; - margin-bottom: 0.5em; - padding: 0; - color: inherit; - font-size: 1.5em; - line-height: inherit; - white-space: normal; -} -progress { - vertical-align: baseline; -} -[type='number']::-webkit-inner-spin-button, -[type='number']::-webkit-outer-spin-button { - height: auto; -} -[type='search'] { - outline-offset: -2px; - -webkit-appearance: none; -} -[type='search']::-webkit-search-cancel-button, -[type='search']::-webkit-search-decoration { - -webkit-appearance: none; -} -::-webkit-file-upload-button { - font: inherit; - -webkit-appearance: button; -} -output { - display: inline-block; -} -summary { - display: list-item; -} -template { - display: none; -} -[hidden] { - display: none !important; -} -mark { - padding: 0.2em; - background-color: #feffe6; -} -::-moz-selection { - color: #fff; - background: #1890ff; -} -::selection { - color: #fff; - background: #1890ff; -} -.clearfix::before { - display: table; - content: ''; -} -.clearfix::after { - display: table; - clear: both; - content: ''; -} -.anticon { - display: inline-block; - color: inherit; - font-style: normal; - line-height: 0; - text-align: center; - text-transform: none; - vertical-align: -0.125em; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.anticon > * { - line-height: 1; -} -.anticon svg { - display: inline-block; -} -.anticon::before { - display: none; -} -.anticon .anticon-icon { - display: block; -} -.anticon[tabindex] { - cursor: pointer; -} -.anticon-spin::before { - display: inline-block; - -webkit-animation: loadingCircle 1s infinite linear; - animation: loadingCircle 1s infinite linear; -} -.anticon-spin { - display: inline-block; - -webkit-animation: loadingCircle 1s infinite linear; - animation: loadingCircle 1s infinite linear; -} -.fade-enter, -.fade-appear { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.fade-leave { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.fade-enter.fade-enter-active, -.fade-appear.fade-appear-active { - -webkit-animation-name: antFadeIn; - animation-name: antFadeIn; - -webkit-animation-play-state: running; - animation-play-state: running; -} -.fade-leave.fade-leave-active { - -webkit-animation-name: antFadeOut; - animation-name: antFadeOut; - -webkit-animation-play-state: running; - animation-play-state: running; - pointer-events: none; -} -.fade-enter, -.fade-appear { - opacity: 0; - -webkit-animation-timing-function: linear; - animation-timing-function: linear; -} -.fade-leave { - -webkit-animation-timing-function: linear; - animation-timing-function: linear; -} -@-webkit-keyframes antFadeIn { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } -} -@keyframes antFadeIn { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } -} -@-webkit-keyframes antFadeOut { - 0% { - opacity: 1; - } - 100% { - opacity: 0; - } -} -@keyframes antFadeOut { - 0% { - opacity: 1; - } - 100% { - opacity: 0; - } -} -.move-up-enter, -.move-up-appear { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.move-up-leave { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.move-up-enter.move-up-enter-active, -.move-up-appear.move-up-appear-active { - -webkit-animation-name: antMoveUpIn; - animation-name: antMoveUpIn; - -webkit-animation-play-state: running; - animation-play-state: running; -} -.move-up-leave.move-up-leave-active { - -webkit-animation-name: antMoveUpOut; - animation-name: antMoveUpOut; - -webkit-animation-play-state: running; - animation-play-state: running; - pointer-events: none; -} -.move-up-enter, -.move-up-appear { - opacity: 0; - -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); - animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); -} -.move-up-leave { - -webkit-animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); - animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); -} -.move-down-enter, -.move-down-appear { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.move-down-leave { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.move-down-enter.move-down-enter-active, -.move-down-appear.move-down-appear-active { - -webkit-animation-name: antMoveDownIn; - animation-name: antMoveDownIn; - -webkit-animation-play-state: running; - animation-play-state: running; -} -.move-down-leave.move-down-leave-active { - -webkit-animation-name: antMoveDownOut; - animation-name: antMoveDownOut; - -webkit-animation-play-state: running; - animation-play-state: running; - pointer-events: none; -} -.move-down-enter, -.move-down-appear { - opacity: 0; - -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); - animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); -} -.move-down-leave { - -webkit-animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); - animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); -} -.move-left-enter, -.move-left-appear { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.move-left-leave { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.move-left-enter.move-left-enter-active, -.move-left-appear.move-left-appear-active { - -webkit-animation-name: antMoveLeftIn; - animation-name: antMoveLeftIn; - -webkit-animation-play-state: running; - animation-play-state: running; -} -.move-left-leave.move-left-leave-active { - -webkit-animation-name: antMoveLeftOut; - animation-name: antMoveLeftOut; - -webkit-animation-play-state: running; - animation-play-state: running; - pointer-events: none; -} -.move-left-enter, -.move-left-appear { - opacity: 0; - -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); - animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); -} -.move-left-leave { - -webkit-animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); - animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); -} -.move-right-enter, -.move-right-appear { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.move-right-leave { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.move-right-enter.move-right-enter-active, -.move-right-appear.move-right-appear-active { - -webkit-animation-name: antMoveRightIn; - animation-name: antMoveRightIn; - -webkit-animation-play-state: running; - animation-play-state: running; -} -.move-right-leave.move-right-leave-active { - -webkit-animation-name: antMoveRightOut; - animation-name: antMoveRightOut; - -webkit-animation-play-state: running; - animation-play-state: running; - pointer-events: none; -} -.move-right-enter, -.move-right-appear { - opacity: 0; - -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); - animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); -} -.move-right-leave { - -webkit-animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); - animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); -} -@-webkit-keyframes antMoveDownIn { - 0% { - -webkit-transform: translateY(100%); - transform: translateY(100%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 0; - } - 100% { - -webkit-transform: translateY(0%); - transform: translateY(0%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 1; - } -} -@keyframes antMoveDownIn { - 0% { - -webkit-transform: translateY(100%); - transform: translateY(100%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 0; - } - 100% { - -webkit-transform: translateY(0%); - transform: translateY(0%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 1; - } -} -@-webkit-keyframes antMoveDownOut { - 0% { - -webkit-transform: translateY(0%); - transform: translateY(0%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 1; - } - 100% { - -webkit-transform: translateY(100%); - transform: translateY(100%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 0; - } -} -@keyframes antMoveDownOut { - 0% { - -webkit-transform: translateY(0%); - transform: translateY(0%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 1; - } - 100% { - -webkit-transform: translateY(100%); - transform: translateY(100%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 0; - } -} -@-webkit-keyframes antMoveLeftIn { - 0% { - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 0; - } - 100% { - -webkit-transform: translateX(0%); - transform: translateX(0%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 1; - } -} -@keyframes antMoveLeftIn { - 0% { - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 0; - } - 100% { - -webkit-transform: translateX(0%); - transform: translateX(0%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 1; - } -} -@-webkit-keyframes antMoveLeftOut { - 0% { - -webkit-transform: translateX(0%); - transform: translateX(0%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 1; - } - 100% { - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 0; - } -} -@keyframes antMoveLeftOut { - 0% { - -webkit-transform: translateX(0%); - transform: translateX(0%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 1; - } - 100% { - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 0; - } -} -@-webkit-keyframes antMoveRightIn { - 0% { - -webkit-transform: translateX(100%); - transform: translateX(100%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 0; - } - 100% { - -webkit-transform: translateX(0%); - transform: translateX(0%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 1; - } -} -@keyframes antMoveRightIn { - 0% { - -webkit-transform: translateX(100%); - transform: translateX(100%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 0; - } - 100% { - -webkit-transform: translateX(0%); - transform: translateX(0%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 1; - } -} -@-webkit-keyframes antMoveRightOut { - 0% { - -webkit-transform: translateX(0%); - transform: translateX(0%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 1; - } - 100% { - -webkit-transform: translateX(100%); - transform: translateX(100%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 0; - } -} -@keyframes antMoveRightOut { - 0% { - -webkit-transform: translateX(0%); - transform: translateX(0%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 1; - } - 100% { - -webkit-transform: translateX(100%); - transform: translateX(100%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 0; - } -} -@-webkit-keyframes antMoveUpIn { - 0% { - -webkit-transform: translateY(-100%); - transform: translateY(-100%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 0; - } - 100% { - -webkit-transform: translateY(0%); - transform: translateY(0%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 1; - } -} -@keyframes antMoveUpIn { - 0% { - -webkit-transform: translateY(-100%); - transform: translateY(-100%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 0; - } - 100% { - -webkit-transform: translateY(0%); - transform: translateY(0%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 1; - } -} -@-webkit-keyframes antMoveUpOut { - 0% { - -webkit-transform: translateY(0%); - transform: translateY(0%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 1; - } - 100% { - -webkit-transform: translateY(-100%); - transform: translateY(-100%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 0; - } -} -@keyframes antMoveUpOut { - 0% { - -webkit-transform: translateY(0%); - transform: translateY(0%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 1; - } - 100% { - -webkit-transform: translateY(-100%); - transform: translateY(-100%); - -webkit-transform-origin: 0 0; - transform-origin: 0 0; - opacity: 0; - } -} -@-webkit-keyframes loadingCircle { - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@keyframes loadingCircle { - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} -[ant-click-animating='true'], -[ant-click-animating-without-extra-node='true'] { - position: relative; -} -html { - --antd-wave-shadow-color: #1890ff; - --scroll-bar: 0; -} -[ant-click-animating-without-extra-node='true']::after, -.ant-click-animating-node { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - display: block; - border-radius: inherit; - -webkit-box-shadow: 0 0 0 0 #1890ff; - box-shadow: 0 0 0 0 #1890ff; - -webkit-box-shadow: 0 0 0 0 var(--antd-wave-shadow-color); - box-shadow: 0 0 0 0 var(--antd-wave-shadow-color); - opacity: 0.2; - -webkit-animation: fadeEffect 2s cubic-bezier(0.08, 0.82, 0.17, 1), waveEffect 0.4s cubic-bezier(0.08, 0.82, 0.17, 1); - animation: fadeEffect 2s cubic-bezier(0.08, 0.82, 0.17, 1), waveEffect 0.4s cubic-bezier(0.08, 0.82, 0.17, 1); - -webkit-animation-fill-mode: forwards; - animation-fill-mode: forwards; - content: ''; - pointer-events: none; -} -@-webkit-keyframes waveEffect { - 100% { - -webkit-box-shadow: 0 0 0 #1890ff; - box-shadow: 0 0 0 #1890ff; - -webkit-box-shadow: 0 0 0 6px var(--antd-wave-shadow-color); - box-shadow: 0 0 0 6px var(--antd-wave-shadow-color); - } -} -@keyframes waveEffect { - 100% { - -webkit-box-shadow: 0 0 0 #1890ff; - box-shadow: 0 0 0 #1890ff; - -webkit-box-shadow: 0 0 0 6px var(--antd-wave-shadow-color); - box-shadow: 0 0 0 6px var(--antd-wave-shadow-color); - } -} -@-webkit-keyframes fadeEffect { - 100% { - opacity: 0; - } -} -@keyframes fadeEffect { - 100% { - opacity: 0; - } -} -.slide-up-enter, -.slide-up-appear { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.slide-up-leave { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.slide-up-enter.slide-up-enter-active, -.slide-up-appear.slide-up-appear-active { - -webkit-animation-name: antSlideUpIn; - animation-name: antSlideUpIn; - -webkit-animation-play-state: running; - animation-play-state: running; -} -.slide-up-leave.slide-up-leave-active { - -webkit-animation-name: antSlideUpOut; - animation-name: antSlideUpOut; - -webkit-animation-play-state: running; - animation-play-state: running; - pointer-events: none; -} -.slide-up-enter, -.slide-up-appear { - opacity: 0; - -webkit-animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); - animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); -} -.slide-up-leave { - -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); -} -.slide-down-enter, -.slide-down-appear { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.slide-down-leave { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.slide-down-enter.slide-down-enter-active, -.slide-down-appear.slide-down-appear-active { - -webkit-animation-name: antSlideDownIn; - animation-name: antSlideDownIn; - -webkit-animation-play-state: running; - animation-play-state: running; -} -.slide-down-leave.slide-down-leave-active { - -webkit-animation-name: antSlideDownOut; - animation-name: antSlideDownOut; - -webkit-animation-play-state: running; - animation-play-state: running; - pointer-events: none; -} -.slide-down-enter, -.slide-down-appear { - opacity: 0; - -webkit-animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); - animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); -} -.slide-down-leave { - -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); -} -.slide-left-enter, -.slide-left-appear { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.slide-left-leave { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.slide-left-enter.slide-left-enter-active, -.slide-left-appear.slide-left-appear-active { - -webkit-animation-name: antSlideLeftIn; - animation-name: antSlideLeftIn; - -webkit-animation-play-state: running; - animation-play-state: running; -} -.slide-left-leave.slide-left-leave-active { - -webkit-animation-name: antSlideLeftOut; - animation-name: antSlideLeftOut; - -webkit-animation-play-state: running; - animation-play-state: running; - pointer-events: none; -} -.slide-left-enter, -.slide-left-appear { - opacity: 0; - -webkit-animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); - animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); -} -.slide-left-leave { - -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); -} -.slide-right-enter, -.slide-right-appear { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.slide-right-leave { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.slide-right-enter.slide-right-enter-active, -.slide-right-appear.slide-right-appear-active { - -webkit-animation-name: antSlideRightIn; - animation-name: antSlideRightIn; - -webkit-animation-play-state: running; - animation-play-state: running; -} -.slide-right-leave.slide-right-leave-active { - -webkit-animation-name: antSlideRightOut; - animation-name: antSlideRightOut; - -webkit-animation-play-state: running; - animation-play-state: running; - pointer-events: none; -} -.slide-right-enter, -.slide-right-appear { - opacity: 0; - -webkit-animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); - animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); -} -.slide-right-leave { - -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); -} -@-webkit-keyframes antSlideUpIn { - 0% { - -webkit-transform: scaleY(0.8); - transform: scaleY(0.8); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 0; - } - 100% { - -webkit-transform: scaleY(1); - transform: scaleY(1); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 1; - } -} -@keyframes antSlideUpIn { - 0% { - -webkit-transform: scaleY(0.8); - transform: scaleY(0.8); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 0; - } - 100% { - -webkit-transform: scaleY(1); - transform: scaleY(1); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 1; - } -} -@-webkit-keyframes antSlideUpOut { - 0% { - -webkit-transform: scaleY(1); - transform: scaleY(1); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 1; - } - 100% { - -webkit-transform: scaleY(0.8); - transform: scaleY(0.8); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 0; - } -} -@keyframes antSlideUpOut { - 0% { - -webkit-transform: scaleY(1); - transform: scaleY(1); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 1; - } - 100% { - -webkit-transform: scaleY(0.8); - transform: scaleY(0.8); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 0; - } -} -@-webkit-keyframes antSlideDownIn { - 0% { - -webkit-transform: scaleY(0.8); - transform: scaleY(0.8); - -webkit-transform-origin: 100% 100%; - transform-origin: 100% 100%; - opacity: 0; - } - 100% { - -webkit-transform: scaleY(1); - transform: scaleY(1); - -webkit-transform-origin: 100% 100%; - transform-origin: 100% 100%; - opacity: 1; - } -} -@keyframes antSlideDownIn { - 0% { - -webkit-transform: scaleY(0.8); - transform: scaleY(0.8); - -webkit-transform-origin: 100% 100%; - transform-origin: 100% 100%; - opacity: 0; - } - 100% { - -webkit-transform: scaleY(1); - transform: scaleY(1); - -webkit-transform-origin: 100% 100%; - transform-origin: 100% 100%; - opacity: 1; - } -} -@-webkit-keyframes antSlideDownOut { - 0% { - -webkit-transform: scaleY(1); - transform: scaleY(1); - -webkit-transform-origin: 100% 100%; - transform-origin: 100% 100%; - opacity: 1; - } - 100% { - -webkit-transform: scaleY(0.8); - transform: scaleY(0.8); - -webkit-transform-origin: 100% 100%; - transform-origin: 100% 100%; - opacity: 0; - } -} -@keyframes antSlideDownOut { - 0% { - -webkit-transform: scaleY(1); - transform: scaleY(1); - -webkit-transform-origin: 100% 100%; - transform-origin: 100% 100%; - opacity: 1; - } - 100% { - -webkit-transform: scaleY(0.8); - transform: scaleY(0.8); - -webkit-transform-origin: 100% 100%; - transform-origin: 100% 100%; - opacity: 0; - } -} -@-webkit-keyframes antSlideLeftIn { - 0% { - -webkit-transform: scaleX(0.8); - transform: scaleX(0.8); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 0; - } - 100% { - -webkit-transform: scaleX(1); - transform: scaleX(1); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 1; - } -} -@keyframes antSlideLeftIn { - 0% { - -webkit-transform: scaleX(0.8); - transform: scaleX(0.8); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 0; - } - 100% { - -webkit-transform: scaleX(1); - transform: scaleX(1); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 1; - } -} -@-webkit-keyframes antSlideLeftOut { - 0% { - -webkit-transform: scaleX(1); - transform: scaleX(1); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 1; - } - 100% { - -webkit-transform: scaleX(0.8); - transform: scaleX(0.8); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 0; - } -} -@keyframes antSlideLeftOut { - 0% { - -webkit-transform: scaleX(1); - transform: scaleX(1); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 1; - } - 100% { - -webkit-transform: scaleX(0.8); - transform: scaleX(0.8); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 0; - } -} -@-webkit-keyframes antSlideRightIn { - 0% { - -webkit-transform: scaleX(0.8); - transform: scaleX(0.8); - -webkit-transform-origin: 100% 0%; - transform-origin: 100% 0%; - opacity: 0; - } - 100% { - -webkit-transform: scaleX(1); - transform: scaleX(1); - -webkit-transform-origin: 100% 0%; - transform-origin: 100% 0%; - opacity: 1; - } -} -@keyframes antSlideRightIn { - 0% { - -webkit-transform: scaleX(0.8); - transform: scaleX(0.8); - -webkit-transform-origin: 100% 0%; - transform-origin: 100% 0%; - opacity: 0; - } - 100% { - -webkit-transform: scaleX(1); - transform: scaleX(1); - -webkit-transform-origin: 100% 0%; - transform-origin: 100% 0%; - opacity: 1; - } -} -@-webkit-keyframes antSlideRightOut { - 0% { - -webkit-transform: scaleX(1); - transform: scaleX(1); - -webkit-transform-origin: 100% 0%; - transform-origin: 100% 0%; - opacity: 1; - } - 100% { - -webkit-transform: scaleX(0.8); - transform: scaleX(0.8); - -webkit-transform-origin: 100% 0%; - transform-origin: 100% 0%; - opacity: 0; - } -} -@keyframes antSlideRightOut { - 0% { - -webkit-transform: scaleX(1); - transform: scaleX(1); - -webkit-transform-origin: 100% 0%; - transform-origin: 100% 0%; - opacity: 1; - } - 100% { - -webkit-transform: scaleX(0.8); - transform: scaleX(0.8); - -webkit-transform-origin: 100% 0%; - transform-origin: 100% 0%; - opacity: 0; - } -} -.zoom-enter, -.zoom-appear { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.zoom-leave { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.zoom-enter.zoom-enter-active, -.zoom-appear.zoom-appear-active { - -webkit-animation-name: antZoomIn; - animation-name: antZoomIn; - -webkit-animation-play-state: running; - animation-play-state: running; -} -.zoom-leave.zoom-leave-active { - -webkit-animation-name: antZoomOut; - animation-name: antZoomOut; - -webkit-animation-play-state: running; - animation-play-state: running; - pointer-events: none; -} -.zoom-enter, -.zoom-appear { - -webkit-transform: scale(0); - transform: scale(0); - opacity: 0; - -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); - animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); -} -.zoom-leave { - -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); - animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); -} -.zoom-big-enter, -.zoom-big-appear { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.zoom-big-leave { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.zoom-big-enter.zoom-big-enter-active, -.zoom-big-appear.zoom-big-appear-active { - -webkit-animation-name: antZoomBigIn; - animation-name: antZoomBigIn; - -webkit-animation-play-state: running; - animation-play-state: running; -} -.zoom-big-leave.zoom-big-leave-active { - -webkit-animation-name: antZoomBigOut; - animation-name: antZoomBigOut; - -webkit-animation-play-state: running; - animation-play-state: running; - pointer-events: none; -} -.zoom-big-enter, -.zoom-big-appear { - -webkit-transform: scale(0); - transform: scale(0); - opacity: 0; - -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); - animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); -} -.zoom-big-leave { - -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); - animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); -} -.zoom-big-fast-enter, -.zoom-big-fast-appear { - -webkit-animation-duration: 0.1s; - animation-duration: 0.1s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.zoom-big-fast-leave { - -webkit-animation-duration: 0.1s; - animation-duration: 0.1s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.zoom-big-fast-enter.zoom-big-fast-enter-active, -.zoom-big-fast-appear.zoom-big-fast-appear-active { - -webkit-animation-name: antZoomBigIn; - animation-name: antZoomBigIn; - -webkit-animation-play-state: running; - animation-play-state: running; -} -.zoom-big-fast-leave.zoom-big-fast-leave-active { - -webkit-animation-name: antZoomBigOut; - animation-name: antZoomBigOut; - -webkit-animation-play-state: running; - animation-play-state: running; - pointer-events: none; -} -.zoom-big-fast-enter, -.zoom-big-fast-appear { - -webkit-transform: scale(0); - transform: scale(0); - opacity: 0; - -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); - animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); -} -.zoom-big-fast-leave { - -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); - animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); -} -.zoom-up-enter, -.zoom-up-appear { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.zoom-up-leave { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.zoom-up-enter.zoom-up-enter-active, -.zoom-up-appear.zoom-up-appear-active { - -webkit-animation-name: antZoomUpIn; - animation-name: antZoomUpIn; - -webkit-animation-play-state: running; - animation-play-state: running; -} -.zoom-up-leave.zoom-up-leave-active { - -webkit-animation-name: antZoomUpOut; - animation-name: antZoomUpOut; - -webkit-animation-play-state: running; - animation-play-state: running; - pointer-events: none; -} -.zoom-up-enter, -.zoom-up-appear { - -webkit-transform: scale(0); - transform: scale(0); - opacity: 0; - -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); - animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); -} -.zoom-up-leave { - -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); - animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); -} -.zoom-down-enter, -.zoom-down-appear { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.zoom-down-leave { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.zoom-down-enter.zoom-down-enter-active, -.zoom-down-appear.zoom-down-appear-active { - -webkit-animation-name: antZoomDownIn; - animation-name: antZoomDownIn; - -webkit-animation-play-state: running; - animation-play-state: running; -} -.zoom-down-leave.zoom-down-leave-active { - -webkit-animation-name: antZoomDownOut; - animation-name: antZoomDownOut; - -webkit-animation-play-state: running; - animation-play-state: running; - pointer-events: none; -} -.zoom-down-enter, -.zoom-down-appear { - -webkit-transform: scale(0); - transform: scale(0); - opacity: 0; - -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); - animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); -} -.zoom-down-leave { - -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); - animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); -} -.zoom-left-enter, -.zoom-left-appear { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.zoom-left-leave { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.zoom-left-enter.zoom-left-enter-active, -.zoom-left-appear.zoom-left-appear-active { - -webkit-animation-name: antZoomLeftIn; - animation-name: antZoomLeftIn; - -webkit-animation-play-state: running; - animation-play-state: running; -} -.zoom-left-leave.zoom-left-leave-active { - -webkit-animation-name: antZoomLeftOut; - animation-name: antZoomLeftOut; - -webkit-animation-play-state: running; - animation-play-state: running; - pointer-events: none; -} -.zoom-left-enter, -.zoom-left-appear { - -webkit-transform: scale(0); - transform: scale(0); - opacity: 0; - -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); - animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); -} -.zoom-left-leave { - -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); - animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); -} -.zoom-right-enter, -.zoom-right-appear { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.zoom-right-leave { - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.zoom-right-enter.zoom-right-enter-active, -.zoom-right-appear.zoom-right-appear-active { - -webkit-animation-name: antZoomRightIn; - animation-name: antZoomRightIn; - -webkit-animation-play-state: running; - animation-play-state: running; -} -.zoom-right-leave.zoom-right-leave-active { - -webkit-animation-name: antZoomRightOut; - animation-name: antZoomRightOut; - -webkit-animation-play-state: running; - animation-play-state: running; - pointer-events: none; -} -.zoom-right-enter, -.zoom-right-appear { - -webkit-transform: scale(0); - transform: scale(0); - opacity: 0; - -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); - animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); -} -.zoom-right-leave { - -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); - animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); -} -@-webkit-keyframes antZoomIn { - 0% { - -webkit-transform: scale(0.2); - transform: scale(0.2); - opacity: 0; - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - } -} -@keyframes antZoomIn { - 0% { - -webkit-transform: scale(0.2); - transform: scale(0.2); - opacity: 0; - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - } -} -@-webkit-keyframes antZoomOut { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - } - 100% { - -webkit-transform: scale(0.2); - transform: scale(0.2); - opacity: 0; - } -} -@keyframes antZoomOut { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - } - 100% { - -webkit-transform: scale(0.2); - transform: scale(0.2); - opacity: 0; - } -} -@-webkit-keyframes antZoomBigIn { - 0% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - opacity: 0; - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - } -} -@keyframes antZoomBigIn { - 0% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - opacity: 0; - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - } -} -@-webkit-keyframes antZoomBigOut { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - } - 100% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - opacity: 0; - } -} -@keyframes antZoomBigOut { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - } - 100% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - opacity: 0; - } -} -@-webkit-keyframes antZoomUpIn { - 0% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - -webkit-transform-origin: 50% 0%; - transform-origin: 50% 0%; - opacity: 0; - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - -webkit-transform-origin: 50% 0%; - transform-origin: 50% 0%; - } -} -@keyframes antZoomUpIn { - 0% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - -webkit-transform-origin: 50% 0%; - transform-origin: 50% 0%; - opacity: 0; - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - -webkit-transform-origin: 50% 0%; - transform-origin: 50% 0%; - } -} -@-webkit-keyframes antZoomUpOut { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - -webkit-transform-origin: 50% 0%; - transform-origin: 50% 0%; - } - 100% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - -webkit-transform-origin: 50% 0%; - transform-origin: 50% 0%; - opacity: 0; - } -} -@keyframes antZoomUpOut { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - -webkit-transform-origin: 50% 0%; - transform-origin: 50% 0%; - } - 100% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - -webkit-transform-origin: 50% 0%; - transform-origin: 50% 0%; - opacity: 0; - } -} -@-webkit-keyframes antZoomLeftIn { - 0% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - -webkit-transform-origin: 0% 50%; - transform-origin: 0% 50%; - opacity: 0; - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - -webkit-transform-origin: 0% 50%; - transform-origin: 0% 50%; - } -} -@keyframes antZoomLeftIn { - 0% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - -webkit-transform-origin: 0% 50%; - transform-origin: 0% 50%; - opacity: 0; - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - -webkit-transform-origin: 0% 50%; - transform-origin: 0% 50%; - } -} -@-webkit-keyframes antZoomLeftOut { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - -webkit-transform-origin: 0% 50%; - transform-origin: 0% 50%; - } - 100% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - -webkit-transform-origin: 0% 50%; - transform-origin: 0% 50%; - opacity: 0; - } -} -@keyframes antZoomLeftOut { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - -webkit-transform-origin: 0% 50%; - transform-origin: 0% 50%; - } - 100% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - -webkit-transform-origin: 0% 50%; - transform-origin: 0% 50%; - opacity: 0; - } -} -@-webkit-keyframes antZoomRightIn { - 0% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - -webkit-transform-origin: 100% 50%; - transform-origin: 100% 50%; - opacity: 0; - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - -webkit-transform-origin: 100% 50%; - transform-origin: 100% 50%; - } -} -@keyframes antZoomRightIn { - 0% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - -webkit-transform-origin: 100% 50%; - transform-origin: 100% 50%; - opacity: 0; - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - -webkit-transform-origin: 100% 50%; - transform-origin: 100% 50%; - } -} -@-webkit-keyframes antZoomRightOut { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - -webkit-transform-origin: 100% 50%; - transform-origin: 100% 50%; - } - 100% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - -webkit-transform-origin: 100% 50%; - transform-origin: 100% 50%; - opacity: 0; - } -} -@keyframes antZoomRightOut { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - -webkit-transform-origin: 100% 50%; - transform-origin: 100% 50%; - } - 100% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - -webkit-transform-origin: 100% 50%; - transform-origin: 100% 50%; - opacity: 0; - } -} -@-webkit-keyframes antZoomDownIn { - 0% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - -webkit-transform-origin: 50% 100%; - transform-origin: 50% 100%; - opacity: 0; - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - -webkit-transform-origin: 50% 100%; - transform-origin: 50% 100%; - } -} -@keyframes antZoomDownIn { - 0% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - -webkit-transform-origin: 50% 100%; - transform-origin: 50% 100%; - opacity: 0; - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - -webkit-transform-origin: 50% 100%; - transform-origin: 50% 100%; - } -} -@-webkit-keyframes antZoomDownOut { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - -webkit-transform-origin: 50% 100%; - transform-origin: 50% 100%; - } - 100% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - -webkit-transform-origin: 50% 100%; - transform-origin: 50% 100%; - opacity: 0; - } -} -@keyframes antZoomDownOut { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - -webkit-transform-origin: 50% 100%; - transform-origin: 50% 100%; - } - 100% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - -webkit-transform-origin: 50% 100%; - transform-origin: 50% 100%; - opacity: 0; - } -} -.ant-motion-collapse-legacy { - overflow: hidden; -} -.ant-motion-collapse-legacy-active { - -webkit-transition: height 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.15s cubic-bezier(0.645, 0.045, 0.355, 1) !important; - transition: height 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.15s cubic-bezier(0.645, 0.045, 0.355, 1) !important; -} -.ant-motion-collapse { - overflow: hidden; - -webkit-transition: height 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.15s cubic-bezier(0.645, 0.045, 0.355, 1) !important; - transition: height 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.15s cubic-bezier(0.645, 0.045, 0.355, 1) !important; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-affix { - position: fixed; - z-index: 10; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-alert { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - max-height: 1000vh; - padding: 8px 15px 8px 37px; - word-wrap: break-word; - border-radius: 2px; -} -.ant-alert.ant-alert-no-icon { - padding: 8px 15px; -} -.ant-alert.ant-alert-no-icon .ant-alert-close-icon { - top: 12.0005px; -} -.ant-alert.ant-alert-closable { - padding-right: 30px; -} -.ant-alert-icon { - position: absolute; - top: 12.0005px; - left: 16px; -} -.ant-alert-description { - display: none; - font-size: 14px; - line-height: 22px; -} -.ant-alert-success { - background-color: #f6ffed; - border: 1px solid #b7eb8f; -} -.ant-alert-success .ant-alert-icon { - color: #52c41a; -} -.ant-alert-info { - background-color: #e6f7ff; - border: 1px solid #91d5ff; -} -.ant-alert-info .ant-alert-icon { - color: #1890ff; -} -.ant-alert-warning { - background-color: #fffbe6; - border: 1px solid #ffe58f; -} -.ant-alert-warning .ant-alert-icon { - color: #faad14; -} -.ant-alert-error { - background-color: #fff2f0; - border: 1px solid #ffccc7; -} -.ant-alert-error .ant-alert-icon { - color: #ff4d4f; -} -.ant-alert-error .ant-alert-description > pre { - margin: 0; - padding: 0; -} -.ant-alert-close-icon { - position: absolute; - top: 12.0005px; - right: 16px; - padding: 0; - overflow: hidden; - font-size: 12px; - line-height: 12px; - background-color: transparent; - border: none; - outline: none; - cursor: pointer; -} -.ant-alert-close-icon .anticon-close { - color: rgba(0, 0, 0, 0.45); - -webkit-transition: color 0.3s; - transition: color 0.3s; -} -.ant-alert-close-icon .anticon-close:hover { - color: rgba(0, 0, 0, 0.75); -} -.ant-alert-close-text { - color: rgba(0, 0, 0, 0.45); - -webkit-transition: color 0.3s; - transition: color 0.3s; -} -.ant-alert-close-text:hover { - color: rgba(0, 0, 0, 0.75); -} -.ant-alert-with-description { - position: relative; - padding: 15px 15px 15px 63px; - color: rgba(0, 0, 0, 0.65); - line-height: 1.5715; - border-radius: 2px; -} -.ant-alert-with-description.ant-alert-no-icon { - padding: 15px 15px; -} -.ant-alert-with-description .ant-alert-icon { - position: absolute; - top: 15px; - left: 24px; - font-size: 24px; -} -.ant-alert-with-description .ant-alert-close-icon { - position: absolute; - top: 16px; - right: 16px; - font-size: 14px; - cursor: pointer; -} -.ant-alert-with-description .ant-alert-message { - display: block; - margin-bottom: 4px; - color: rgba(0, 0, 0, 0.85); - font-size: 16px; -} -.ant-alert-message { - color: rgba(0, 0, 0, 0.85); -} -.ant-alert-with-description .ant-alert-description { - display: block; -} -.ant-alert.ant-alert-closing { - max-height: 0; - margin: 0; - padding-top: 0; - padding-bottom: 0; - -webkit-transform-origin: 50% 0; - transform-origin: 50% 0; - -webkit-transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); - transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); -} -.ant-alert-slide-up-leave { - -webkit-animation: antAlertSlideUpOut 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); - animation: antAlertSlideUpOut 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); - -webkit-animation-fill-mode: both; - animation-fill-mode: both; -} -.ant-alert-banner { - margin-bottom: 0; - border: 0; - border-radius: 0; -} -@-webkit-keyframes antAlertSlideUpIn { - 0% { - -webkit-transform: scaleY(0); - transform: scaleY(0); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 0; - } - 100% { - -webkit-transform: scaleY(1); - transform: scaleY(1); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 1; - } -} -@keyframes antAlertSlideUpIn { - 0% { - -webkit-transform: scaleY(0); - transform: scaleY(0); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 0; - } - 100% { - -webkit-transform: scaleY(1); - transform: scaleY(1); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 1; - } -} -@-webkit-keyframes antAlertSlideUpOut { - 0% { - -webkit-transform: scaleY(1); - transform: scaleY(1); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 1; - } - 100% { - -webkit-transform: scaleY(0); - transform: scaleY(0); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 0; - } -} -@keyframes antAlertSlideUpOut { - 0% { - -webkit-transform: scaleY(1); - transform: scaleY(1); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 1; - } - 100% { - -webkit-transform: scaleY(0); - transform: scaleY(0); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; - opacity: 0; - } -} -.ant-alert.ant-alert-rtl { - padding: 8px 37px 8px 15px; - direction: rtl; -} -.ant-alert-rtl.ant-alert.ant-alert-no-icon { - padding: 8px 15px; -} -.ant-alert.ant-alert-rtl.ant-alert.ant-alert-closable { - padding-right: 37px; - padding-left: 30px; -} -.ant-alert.ant-alert-rtl.ant-alert.ant-alert-no-icon.ant-alert-closable { - padding-right: 15px; - padding-left: 30px; -} -.ant-alert-rtl .ant-alert-icon { - right: 16px; - left: auto; -} -.ant-alert-rtl .ant-alert-close-icon { - right: auto; - left: 16px; -} -.ant-alert.ant-alert-rtl.ant-alert-with-description, -.ant-alert.ant-alert-rtl.ant-alert-with-description.ant-alert-closable { - padding: 15px 63px 15px 15px; -} -.ant-alert.ant-alert-rtl.ant-alert-with-description.ant-alert-no-icon { - padding: 15px; -} -.ant-alert-rtl.ant-alert-with-description .ant-alert-icon { - right: 24px; - left: auto; -} -.ant-alert-rtl.ant-alert-with-description .ant-alert-close-icon { - right: auto; - left: 16px; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-anchor { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - padding-left: 2px; -} -.ant-anchor-wrapper { - margin-left: -4px; - padding-left: 4px; - overflow: auto; - background-color: #fff; -} -.ant-anchor-ink { - position: absolute; - top: 0; - left: 0; - height: 100%; -} -.ant-anchor-ink::before { - position: relative; - display: block; - width: 2px; - height: 100%; - margin: 0 auto; - background-color: #f0f0f0; - content: ' '; -} -.ant-anchor-ink-ball { - position: absolute; - left: 50%; - display: none; - width: 8px; - height: 8px; - background-color: #fff; - border: 2px solid #1890ff; - border-radius: 8px; - -webkit-transform: translateX(-50%); - transform: translateX(-50%); - -webkit-transition: top 0.3s ease-in-out; - transition: top 0.3s ease-in-out; -} -.ant-anchor-ink-ball.visible { - display: inline-block; -} -.ant-anchor.fixed .ant-anchor-ink .ant-anchor-ink-ball { - display: none; -} -.ant-anchor-link { - padding: 7px 0 7px 16px; - line-height: 1.143; -} -.ant-anchor-link-title { - position: relative; - display: block; - margin-bottom: 6px; - overflow: hidden; - color: rgba(0, 0, 0, 0.65); - white-space: nowrap; - text-overflow: ellipsis; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-anchor-link-title:only-child { - margin-bottom: 0; -} -.ant-anchor-link-active > .ant-anchor-link-title { - color: #1890ff; -} -.ant-anchor-link .ant-anchor-link { - padding-top: 5px; - padding-bottom: 5px; -} -.ant-anchor-rtl { - direction: rtl; -} -.ant-anchor-rtl.ant-anchor-wrapper { - margin-right: -4px; - margin-left: 0; - padding-right: 4px; - padding-left: 0; -} -.ant-anchor-rtl .ant-anchor-ink { - right: 0; - left: auto; -} -.ant-anchor-rtl .ant-anchor-ink-ball { - right: 50%; - left: 0; - -webkit-transform: translateX(50%); - transform: translateX(50%); -} -.ant-anchor-rtl .ant-anchor-link { - padding: 7px 16px 7px 0; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-select-auto-complete { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; -} -.ant-select-auto-complete .ant-select-clear { - right: 13px; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-select-single .ant-select-selector { - display: -webkit-box; - display: -ms-flexbox; - display: flex; -} -.ant-select-single .ant-select-selector .ant-select-selection-search { - position: absolute; - top: 0; - right: 11px; - bottom: 0; - left: 11px; -} -.ant-select-single .ant-select-selector .ant-select-selection-search-input { - width: 100%; -} -.ant-select-single .ant-select-selector .ant-select-selection-item, -.ant-select-single .ant-select-selector .ant-select-selection-placeholder { - padding: 0; - line-height: 30px; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -@supports (-moz-appearance: meterbar) { - .ant-select-single .ant-select-selector .ant-select-selection-item, - .ant-select-single .ant-select-selector .ant-select-selection-placeholder { - line-height: 30px; - } -} -.ant-select-single .ant-select-selector .ant-select-selection-item { - position: relative; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.ant-select-single .ant-select-selector .ant-select-selection-placeholder { - pointer-events: none; -} -.ant-select-single .ant-select-selector::after, -.ant-select-single .ant-select-selector .ant-select-selection-item::after, -.ant-select-single .ant-select-selector .ant-select-selection-placeholder::after { - display: inline-block; - width: 0; - visibility: hidden; - content: '\a0'; -} -.ant-select-single.ant-select-show-arrow .ant-select-selection-search { - right: 25px; -} -.ant-select-single.ant-select-show-arrow .ant-select-selection-item, -.ant-select-single.ant-select-show-arrow .ant-select-selection-placeholder { - padding-right: 18px; -} -.ant-select-single.ant-select-open .ant-select-selection-item { - opacity: 0.4; -} -.ant-select-single:not(.ant-select-customize-input) .ant-select-selector { - position: relative; - background-color: #fff; - border: 1px solid #d9d9d9; - border-radius: 2px; - -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - width: 100%; - height: 32px; - padding: 0 11px; -} -.ant-select-single:not(.ant-select-customize-input) .ant-select-selector input { - cursor: pointer; -} -.ant-select-show-search.ant-select-single:not(.ant-select-customize-input) .ant-select-selector { - cursor: text; -} -.ant-select-show-search.ant-select-single:not(.ant-select-customize-input) .ant-select-selector input { - cursor: auto; -} -.ant-select-focused.ant-select-single:not(.ant-select-customize-input) .ant-select-selector { - border-color: #40a9ff; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); - box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); -} -.ant-select-disabled.ant-select-single:not(.ant-select-customize-input) .ant-select-selector { - color: rgba(0, 0, 0, 0.25); - background: #f5f5f5; - cursor: not-allowed; -} -.ant-select-disabled.ant-select-single:not(.ant-select-customize-input) .ant-select-selector input { - cursor: not-allowed; -} -.ant-select-single:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input { - margin: 0; - padding: 0; - background: transparent; - border: none; - outline: none; -} -.ant-select-single:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input { - height: 30px; -} -.ant-select-single:not(.ant-select-customize-input) .ant-select-selector::after { - line-height: 30px; -} -.ant-select-single.ant-select-customize-input .ant-select-selector::after { - display: none; -} -.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-search { - position: static; - width: 100%; -} -.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-placeholder { - position: absolute; - right: 0; - left: 0; - padding: 0 11px; -} -.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-placeholder::after { - display: none; -} -.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector { - height: 40px; -} -.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector::after, -.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-item, -.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-placeholder { - line-height: 38px; -} -.ant-select-single.ant-select-lg:not(.ant-select-customize-input):not(.ant-select-customize-input) .ant-select-selection-search-input { - height: 38px; -} -.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector { - height: 24px; -} -.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector::after, -.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-item, -.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-placeholder { - line-height: 22px; -} -.ant-select-single.ant-select-sm:not(.ant-select-customize-input):not(.ant-select-customize-input) .ant-select-selection-search-input { - height: 22px; -} -.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selection-search { - right: 7px; - left: 7px; -} -.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector { - padding: 0 7px; -} -.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-search { - right: 28px; -} -.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-item, -.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-placeholder { - padding-right: 21px; -} -.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector { - padding: 0 11px; -} -/** - * Do not merge `height` & `line-height` under style with `selection` & `search`, - * since chrome may update to redesign with its align logic. - */ -.ant-select-multiple .ant-select-selector { - position: relative; - background-color: #fff; - border: 1px solid #d9d9d9; - border-radius: 2px; - -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - padding: 1px 4px; -} -.ant-select-multiple .ant-select-selector input { - cursor: pointer; -} -.ant-select-show-search.ant-select-multiple .ant-select-selector { - cursor: text; -} -.ant-select-show-search.ant-select-multiple .ant-select-selector input { - cursor: auto; -} -.ant-select-focused.ant-select-multiple .ant-select-selector { - border-color: #40a9ff; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); - box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); -} -.ant-select-disabled.ant-select-multiple .ant-select-selector { - color: rgba(0, 0, 0, 0.25); - background: #f5f5f5; - cursor: not-allowed; -} -.ant-select-disabled.ant-select-multiple .ant-select-selector input { - cursor: not-allowed; -} -.ant-select-multiple .ant-select-selector .ant-select-selection-search-input { - margin: 0; - padding: 0; - background: transparent; - border: none; - outline: none; -} -.ant-select-show-search.ant-select-multiple .ant-select-selector { - cursor: text; -} -.ant-select-multiple .ant-select-selector::after { - display: inline-block; - width: 0; - margin: 2px 0; - line-height: 24px; - content: '\a0'; -} -.ant-select-multiple.ant-select-allow-clear .ant-select-selector { - padding-right: 24px; -} -.ant-select-multiple .ant-select-selection-item { - position: relative; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - -webkit-box-sizing: border-box; - box-sizing: border-box; - max-width: 100%; - height: 24px; - margin-top: 2px; - margin-right: 4px; - margin-bottom: 2px; - padding: 0 4px 0 8px; - line-height: 22px; - background: #f5f5f5; - border: 1px solid #f0f0f0; - border-radius: 2px; - cursor: default; - -webkit-transition: font-size 0.3s, line-height 0.3s, height 0.3s; - transition: font-size 0.3s, line-height 0.3s, height 0.3s; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.ant-select-multiple .ant-select-selection-item-content { - display: inline-block; - margin-right: 4px; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} -.ant-select-multiple .ant-select-selection-item-remove { - color: inherit; - font-style: normal; - line-height: 0; - text-align: center; - text-transform: none; - vertical-align: -0.125em; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - color: rgba(0, 0, 0, 0.45); - font-weight: bold; - font-size: 12px; - line-height: inherit; - cursor: pointer; - display: inline-block; - font-size: 10px; -} -.ant-select-multiple .ant-select-selection-item-remove > * { - line-height: 1; -} -.ant-select-multiple .ant-select-selection-item-remove svg { - display: inline-block; -} -.ant-select-multiple .ant-select-selection-item-remove::before { - display: none; -} -.ant-select-multiple .ant-select-selection-item-remove .ant-select-multiple .ant-select-selection-item-remove-icon { - display: block; -} -.ant-select-multiple .ant-select-selection-item-remove > .anticon { - vertical-align: -0.2em; -} -.ant-select-multiple .ant-select-selection-item-remove:hover { - color: rgba(0, 0, 0, 0.75); -} -.ant-select-multiple .ant-select-selection-search { - position: relative; - margin-left: 0.5px; -} -.ant-select-multiple .ant-select-selection-search-input, -.ant-select-multiple .ant-select-selection-search-mirror { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; - line-height: 1.5715; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-select-multiple .ant-select-selection-search-input { - width: 100%; - min-width: 3px; -} -.ant-select-multiple .ant-select-selection-search-mirror { - position: absolute; - top: 0; - left: 0; - z-index: 999; - white-space: nowrap; - visibility: hidden; -} -.ant-select-multiple .ant-select-selection-search:first-child .ant-select-selection-search-input { - margin-left: 6.5px; -} -.ant-select-multiple .ant-select-selection-placeholder { - position: absolute; - top: 50%; - right: 11px; - left: 11px; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-select-multiple.ant-select-lg .ant-select-selector::after { - line-height: 32px; -} -.ant-select-multiple.ant-select-lg .ant-select-selection-item { - height: 32px; - line-height: 30px; -} -.ant-select-multiple.ant-select-lg .ant-select-selection-search { - height: 33px; - line-height: 33px; -} -.ant-select-multiple.ant-select-lg .ant-select-selection-search-input, -.ant-select-multiple.ant-select-lg .ant-select-selection-search-mirror { - height: 32px; - line-height: 30px; -} -.ant-select-multiple.ant-select-sm .ant-select-selector::after { - line-height: 16px; -} -.ant-select-multiple.ant-select-sm .ant-select-selection-item { - height: 16px; - line-height: 14px; -} -.ant-select-multiple.ant-select-sm .ant-select-selection-search { - height: 17px; - line-height: 17px; -} -.ant-select-multiple.ant-select-sm .ant-select-selection-search-input, -.ant-select-multiple.ant-select-sm .ant-select-selection-search-mirror { - height: 16px; - line-height: 14px; -} -.ant-select-multiple.ant-select-sm .ant-select-selection-placeholder { - left: 7px; -} -.ant-select-multiple.ant-select-sm .ant-select-selection-search:first-child .ant-select-selection-search-input { - margin-left: 3px; -} -.ant-select-multiple.ant-select-lg .ant-select-selection-item { - height: 32px; - line-height: 32px; -} -.ant-select-disabled .ant-select-selection-item-remove { - display: none; -} -/* Reset search input style */ -.ant-select { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - display: inline-block; - cursor: pointer; -} -.ant-select:not(.ant-select-disabled):hover .ant-select-selector { - border-color: #40a9ff; - border-right-width: 1px !important; -} -.ant-select-selection-item { - -webkit-box-flex: 1; - -ms-flex: 1; - flex: 1; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} -@media all and (-ms-high-contrast: none) { - .ant-select-selection-item *::-ms-backdrop, - .ant-select-selection-item { - -ms-flex: auto; - flex: auto; - } -} -.ant-select-selection-placeholder { - -webkit-box-flex: 1; - -ms-flex: 1; - flex: 1; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - opacity: 0.4; -} -@media all and (-ms-high-contrast: none) { - .ant-select-selection-placeholder *::-ms-backdrop, - .ant-select-selection-placeholder { - -ms-flex: auto; - flex: auto; - } -} -.ant-select-arrow { - display: inline-block; - color: inherit; - font-style: normal; - line-height: 0; - text-transform: none; - vertical-align: -0.125em; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - position: absolute; - top: 53%; - right: 11px; - width: 12px; - height: 12px; - margin-top: -6px; - color: rgba(0, 0, 0, 0.25); - font-size: 12px; - line-height: 1; - text-align: center; - pointer-events: none; -} -.ant-select-arrow > * { - line-height: 1; -} -.ant-select-arrow svg { - display: inline-block; -} -.ant-select-arrow::before { - display: none; -} -.ant-select-arrow .ant-select-arrow-icon { - display: block; -} -.ant-select-arrow .anticon { - vertical-align: top; - -webkit-transition: -webkit-transform 0.3s; - transition: -webkit-transform 0.3s; - transition: transform 0.3s; - transition: transform 0.3s, -webkit-transform 0.3s; -} -.ant-select-arrow .anticon > svg { - vertical-align: top; -} -.ant-select-arrow .anticon:not(.ant-select-suffix) { - pointer-events: auto; -} -.ant-select-clear { - position: absolute; - top: 50%; - right: 11px; - z-index: 1; - display: inline-block; - width: 12px; - height: 12px; - margin-top: -6px; - color: rgba(0, 0, 0, 0.25); - font-size: 12px; - font-style: normal; - line-height: 1; - text-align: center; - text-transform: none; - background: #fff; - cursor: pointer; - opacity: 0; - -webkit-transition: color 0.3s ease, opacity 0.15s ease; - transition: color 0.3s ease, opacity 0.15s ease; - text-rendering: auto; -} -.ant-select-clear::before { - display: block; -} -.ant-select-clear:hover { - color: rgba(0, 0, 0, 0.45); -} -.ant-select:hover .ant-select-clear { - opacity: 1; -} -.ant-select-dropdown { - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: absolute; - top: -9999px; - left: -9999px; - z-index: 1050; - -webkit-box-sizing: border-box; - box-sizing: border-box; - padding: 4px 0; - overflow: hidden; - font-size: 14px; - font-variant: initial; - background-color: #fff; - border-radius: 2px; - outline: none; - -webkit-box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); -} -.ant-select-dropdown.slide-up-enter.slide-up-enter-active.ant-select-dropdown-placement-bottomLeft, -.ant-select-dropdown.slide-up-appear.slide-up-appear-active.ant-select-dropdown-placement-bottomLeft { - -webkit-animation-name: antSlideUpIn; - animation-name: antSlideUpIn; -} -.ant-select-dropdown.slide-up-enter.slide-up-enter-active.ant-select-dropdown-placement-topLeft, -.ant-select-dropdown.slide-up-appear.slide-up-appear-active.ant-select-dropdown-placement-topLeft { - -webkit-animation-name: antSlideDownIn; - animation-name: antSlideDownIn; -} -.ant-select-dropdown.slide-up-leave.slide-up-leave-active.ant-select-dropdown-placement-bottomLeft { - -webkit-animation-name: antSlideUpOut; - animation-name: antSlideUpOut; -} -.ant-select-dropdown.slide-up-leave.slide-up-leave-active.ant-select-dropdown-placement-topLeft { - -webkit-animation-name: antSlideDownOut; - animation-name: antSlideDownOut; -} -.ant-select-dropdown-hidden { - display: none; -} -.ant-select-dropdown-empty { - color: rgba(0, 0, 0, 0.25); -} -.ant-select-item-empty { - position: relative; - display: block; - min-height: 32px; - padding: 5px 12px; - color: rgba(0, 0, 0, 0.65); - font-weight: normal; - font-size: 14px; - line-height: 22px; - color: rgba(0, 0, 0, 0.25); -} -.ant-select-item { - position: relative; - display: block; - min-height: 32px; - padding: 5px 12px; - color: rgba(0, 0, 0, 0.65); - font-weight: normal; - font-size: 14px; - line-height: 22px; - cursor: pointer; - -webkit-transition: background 0.3s ease; - transition: background 0.3s ease; -} -.ant-select-item-group { - color: rgba(0, 0, 0, 0.45); - font-size: 12px; - cursor: default; -} -.ant-select-item-option { - display: -webkit-box; - display: -ms-flexbox; - display: flex; -} -.ant-select-item-option-content { - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} -.ant-select-item-option-state { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; -} -.ant-select-item-option-active:not(.ant-select-item-option-disabled) { - background-color: #f5f5f5; -} -.ant-select-item-option-selected:not(.ant-select-item-option-disabled) { - color: rgba(0, 0, 0, 0.65); - font-weight: 600; - background-color: #e6f7ff; -} -.ant-select-item-option-selected:not(.ant-select-item-option-disabled) .ant-select-item-option-state { - color: #1890ff; -} -.ant-select-item-option-disabled { - color: rgba(0, 0, 0, 0.25); - cursor: not-allowed; -} -.ant-select-item-option-grouped { - padding-left: 24px; -} -.ant-select-lg { - font-size: 16px; -} -.ant-select-borderless .ant-select-selector { - background-color: transparent !important; - border-color: transparent !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; -} -.ant-select-rtl { - direction: rtl; -} -.ant-select-rtl .ant-select-arrow { - right: initial; - left: 11px; -} -.ant-select-rtl .ant-select-clear { - right: initial; - left: 11px; -} -.ant-select-dropdown-rtl { - direction: rtl; -} -.ant-select-dropdown-rtl .ant-select-item-option-grouped { - padding-right: 24px; - padding-left: 12px; -} -.ant-select-rtl.ant-select-multiple.ant-select-allow-clear .ant-select-selector { - padding-right: 4px; - padding-left: 24px; -} -.ant-select-rtl.ant-select-multiple .ant-select-selection-item { - margin-right: 0; - margin-left: 4px; - padding: 0 8px 0 4px; - text-align: right; -} -.ant-select-rtl.ant-select-multiple .ant-select-selection-item-content { - margin-right: 0; - margin-left: 4px; - text-align: right; -} -.ant-select-rtl.ant-select-multiple .ant-select-selection-search { - margin-right: 0.5px; - margin-left: 4px; -} -.ant-select-rtl.ant-select-multiple .ant-select-selection-search-mirror { - right: 0; - left: auto; -} -.ant-select-rtl.ant-select-multiple .ant-select-selection-placeholder { - right: 11px; - left: auto; -} -.ant-select-rtl.ant-select-multiple.ant-select-sm .ant-select-selection-placeholder { - right: 7px; -} -.ant-select-rtl.ant-select-single .ant-select-selector .ant-select-selection-item, -.ant-select-rtl.ant-select-single .ant-select-selector .ant-select-selection-placeholder { - right: 0; - left: 9px; - text-align: right; -} -.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-search { - right: 11px; - left: 25px; -} -.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-item, -.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-placeholder { - padding-right: 0; - padding-left: 18px; -} -.ant-select-rtl.ant-select-single:not(.ant-select-customize-input) .ant-select-selector { - padding: 0 11px; -} -.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-search { - right: 0; -} -.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-item, -.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-placeholder { - padding-right: 0; - padding-left: 21px; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-empty { - margin: 0 8px; - font-size: 14px; - line-height: 1.5715; - text-align: center; -} -.ant-empty-image { - height: 100px; - margin-bottom: 8px; -} -.ant-empty-image img { - height: 100%; -} -.ant-empty-image svg { - height: 100%; - margin: auto; -} -.ant-empty-description { - margin: 0; -} -.ant-empty-footer { - margin-top: 16px; -} -.ant-empty-normal { - margin: 32px 0; - color: rgba(0, 0, 0, 0.25); -} -.ant-empty-normal .ant-empty-image { - height: 40px; -} -.ant-empty-small { - margin: 8px 0; - color: rgba(0, 0, 0, 0.25); -} -.ant-empty-small .ant-empty-image { - height: 35px; -} -.ant-empty-img-default-ellipse { - fill-opacity: 0.8; - fill: #f5f5f5; -} -.ant-empty-img-default-path-1 { - fill: #aeb8c2; -} -.ant-empty-img-default-path-2 { - fill: url(#linearGradient-1); -} -.ant-empty-img-default-path-3 { - fill: #f5f5f7; -} -.ant-empty-img-default-path-4 { - fill: #dce0e6; -} -.ant-empty-img-default-path-5 { - fill: #dce0e6; -} -.ant-empty-img-default-g { - fill: #fff; -} -.ant-empty-img-simple-ellipse { - fill: #f5f5f5; -} -.ant-empty-img-simple-g { - stroke: #d9d9d9; -} -.ant-empty-img-simple-path { - fill: #fafafa; -} -.ant-empty-rtl { - direction: rtl; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-avatar { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - display: inline-block; - overflow: hidden; - color: #fff; - white-space: nowrap; - text-align: center; - vertical-align: middle; - background: #ccc; - width: 32px; - height: 32px; - line-height: 32px; - border-radius: 50%; -} -.ant-avatar-image { - background: transparent; -} -.ant-avatar-string { - position: absolute; - left: 50%; - -webkit-transform-origin: 0 center; - transform-origin: 0 center; -} -.ant-avatar.ant-avatar-icon { - font-size: 18px; -} -.ant-avatar.ant-avatar-icon > .anticon { - margin: 0; -} -.ant-avatar-lg { - width: 40px; - height: 40px; - line-height: 40px; - border-radius: 50%; -} -.ant-avatar-lg-string { - position: absolute; - left: 50%; - -webkit-transform-origin: 0 center; - transform-origin: 0 center; -} -.ant-avatar-lg.ant-avatar-icon { - font-size: 24px; -} -.ant-avatar-lg.ant-avatar-icon > .anticon { - margin: 0; -} -.ant-avatar-sm { - width: 24px; - height: 24px; - line-height: 24px; - border-radius: 50%; -} -.ant-avatar-sm-string { - position: absolute; - left: 50%; - -webkit-transform-origin: 0 center; - transform-origin: 0 center; -} -.ant-avatar-sm.ant-avatar-icon { - font-size: 14px; -} -.ant-avatar-sm.ant-avatar-icon > .anticon { - margin: 0; -} -.ant-avatar-square { - border-radius: 2px; -} -.ant-avatar > img { - display: block; - width: 100%; - height: 100%; - -o-object-fit: cover; - object-fit: cover; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-back-top { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: fixed; - right: 100px; - bottom: 50px; - z-index: 10; - width: 40px; - height: 40px; - cursor: pointer; -} -.ant-back-top:empty { - display: none; -} -.ant-back-top-rtl { - right: auto; - left: 100px; - direction: rtl; -} -.ant-back-top-content { - width: 40px; - height: 40px; - overflow: hidden; - color: #fff; - text-align: center; - background-color: rgba(0, 0, 0, 0.45); - border-radius: 20px; - -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); -} -.ant-back-top-content:hover { - background-color: rgba(0, 0, 0, 0.65); - -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); -} -.ant-back-top-icon { - font-size: 24px; - line-height: 40px; -} -@media screen and (max-width: 768px) { - .ant-back-top { - right: 60px; - } -} -@media screen and (max-width: 480px) { - .ant-back-top { - right: 20px; - } -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-badge { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - display: inline-block; - color: unset; - line-height: 1; -} -.ant-badge-count { - z-index: auto; - min-width: 20px; - height: 20px; - padding: 0 6px; - color: #fff; - font-weight: normal; - font-size: 12px; - line-height: 20px; - white-space: nowrap; - text-align: center; - background: #ff4d4f; - border-radius: 10px; - -webkit-box-shadow: 0 0 0 1px #fff; - box-shadow: 0 0 0 1px #fff; -} -.ant-badge-count a, -.ant-badge-count a:hover { - color: #fff; -} -.ant-badge-multiple-words { - padding: 0 8px; -} -.ant-badge-dot { - z-index: auto; - width: 6px; - height: 6px; - background: #ff4d4f; - border-radius: 100%; - -webkit-box-shadow: 0 0 0 1px #fff; - box-shadow: 0 0 0 1px #fff; -} -.ant-badge-count, -.ant-badge-dot, -.ant-badge .ant-scroll-number-custom-component { - position: absolute; - top: 0; - right: 0; - -webkit-transform: translate(50%, -50%); - transform: translate(50%, -50%); - -webkit-transform-origin: 100% 0%; - transform-origin: 100% 0%; -} -.ant-badge-status { - line-height: inherit; - vertical-align: baseline; -} -.ant-badge-status-dot { - position: relative; - top: -1px; - display: inline-block; - width: 6px; - height: 6px; - vertical-align: middle; - border-radius: 50%; -} -.ant-badge-status-success { - background-color: #52c41a; -} -.ant-badge-status-processing { - position: relative; - background-color: #1890ff; -} -.ant-badge-status-processing::after { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - border: 1px solid #1890ff; - border-radius: 50%; - -webkit-animation: antStatusProcessing 1.2s infinite ease-in-out; - animation: antStatusProcessing 1.2s infinite ease-in-out; - content: ''; -} -.ant-badge-status-default { - background-color: #d9d9d9; -} -.ant-badge-status-error { - background-color: #ff4d4f; -} -.ant-badge-status-warning { - background-color: #faad14; -} -.ant-badge-status-pink { - background: #eb2f96; -} -.ant-badge-status-magenta { - background: #eb2f96; -} -.ant-badge-status-red { - background: #f5222d; -} -.ant-badge-status-volcano { - background: #fa541c; -} -.ant-badge-status-orange { - background: #fa8c16; -} -.ant-badge-status-yellow { - background: #fadb14; -} -.ant-badge-status-gold { - background: #faad14; -} -.ant-badge-status-cyan { - background: #13c2c2; -} -.ant-badge-status-lime { - background: #a0d911; -} -.ant-badge-status-green { - background: #52c41a; -} -.ant-badge-status-blue { - background: #1890ff; -} -.ant-badge-status-geekblue { - background: #2f54eb; -} -.ant-badge-status-purple { - background: #722ed1; -} -.ant-badge-status-text { - margin-left: 8px; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; -} -.ant-badge-zoom-appear, -.ant-badge-zoom-enter { - -webkit-animation: antZoomBadgeIn 0.3s cubic-bezier(0.12, 0.4, 0.29, 1.46); - animation: antZoomBadgeIn 0.3s cubic-bezier(0.12, 0.4, 0.29, 1.46); - -webkit-animation-fill-mode: both; - animation-fill-mode: both; -} -.ant-badge-zoom-leave { - -webkit-animation: antZoomBadgeOut 0.3s cubic-bezier(0.71, -0.46, 0.88, 0.6); - animation: antZoomBadgeOut 0.3s cubic-bezier(0.71, -0.46, 0.88, 0.6); - -webkit-animation-fill-mode: both; - animation-fill-mode: both; -} -.ant-badge-not-a-wrapper:not(.ant-badge-status) { - vertical-align: middle; -} -.ant-badge-not-a-wrapper .ant-scroll-number { - position: relative; - top: auto; - display: block; -} -.ant-badge-not-a-wrapper .ant-badge-count { - -webkit-transform: none; - transform: none; -} -@-webkit-keyframes antStatusProcessing { - 0% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - opacity: 0.5; - } - 100% { - -webkit-transform: scale(2.4); - transform: scale(2.4); - opacity: 0; - } -} -@keyframes antStatusProcessing { - 0% { - -webkit-transform: scale(0.8); - transform: scale(0.8); - opacity: 0.5; - } - 100% { - -webkit-transform: scale(2.4); - transform: scale(2.4); - opacity: 0; - } -} -.ant-scroll-number { - overflow: hidden; -} -.ant-scroll-number-only { - display: inline-block; - height: 20px; - -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); -} -.ant-scroll-number-only > p.ant-scroll-number-only-unit { - height: 20px; - margin: 0; -} -.ant-scroll-number-symbol { - vertical-align: top; -} -@-webkit-keyframes antZoomBadgeIn { - 0% { - -webkit-transform: scale(0) translate(50%, -50%); - transform: scale(0) translate(50%, -50%); - opacity: 0; - } - 100% { - -webkit-transform: scale(1) translate(50%, -50%); - transform: scale(1) translate(50%, -50%); - } -} -@keyframes antZoomBadgeIn { - 0% { - -webkit-transform: scale(0) translate(50%, -50%); - transform: scale(0) translate(50%, -50%); - opacity: 0; - } - 100% { - -webkit-transform: scale(1) translate(50%, -50%); - transform: scale(1) translate(50%, -50%); - } -} -@-webkit-keyframes antZoomBadgeOut { - 0% { - -webkit-transform: scale(1) translate(50%, -50%); - transform: scale(1) translate(50%, -50%); - } - 100% { - -webkit-transform: scale(0) translate(50%, -50%); - transform: scale(0) translate(50%, -50%); - opacity: 0; - } -} -@keyframes antZoomBadgeOut { - 0% { - -webkit-transform: scale(1) translate(50%, -50%); - transform: scale(1) translate(50%, -50%); - } - 100% { - -webkit-transform: scale(0) translate(50%, -50%); - transform: scale(0) translate(50%, -50%); - opacity: 0; - } -} -.ant-badge-rtl { - direction: rtl; -} -.ant-badge-rtl .ant-badge-count, -.ant-badge-rtl .ant-badge-dot, -.ant-badge-rtl .ant-badge .ant-scroll-number-custom-component { - right: auto; - left: 0; - direction: ltr; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; -} -.ant-badge-rtl.ant-badge .ant-scroll-number-custom-component { - right: auto; - left: 0; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - -webkit-transform-origin: 0% 0%; - transform-origin: 0% 0%; -} -.ant-badge-rtl .ant-badge-status-text { - margin-right: 8px; - margin-left: 0; -} -.ant-badge-rtl .ant-badge-zoom-appear, -.ant-badge-rtl .ant-badge-zoom-enter { - -webkit-animation-name: antZoomBadgeInRtl; - animation-name: antZoomBadgeInRtl; -} -.ant-badge-rtl .ant-badge-zoom-leave { - -webkit-animation-name: antZoomBadgeOutRtl; - animation-name: antZoomBadgeOutRtl; -} -.ant-badge-not-a-wrapper .ant-badge-count { - -webkit-transform: none; - transform: none; -} -@-webkit-keyframes antZoomBadgeInRtl { - 0% { - -webkit-transform: scale(0) translate(-50%, -50%); - transform: scale(0) translate(-50%, -50%); - opacity: 0; - } - 100% { - -webkit-transform: scale(1) translate(-50%, -50%); - transform: scale(1) translate(-50%, -50%); - } -} -@keyframes antZoomBadgeInRtl { - 0% { - -webkit-transform: scale(0) translate(-50%, -50%); - transform: scale(0) translate(-50%, -50%); - opacity: 0; - } - 100% { - -webkit-transform: scale(1) translate(-50%, -50%); - transform: scale(1) translate(-50%, -50%); - } -} -@-webkit-keyframes antZoomBadgeOutRtl { - 0% { - -webkit-transform: scale(1) translate(-50%, -50%); - transform: scale(1) translate(-50%, -50%); - } - 100% { - -webkit-transform: scale(0) translate(-50%, -50%); - transform: scale(0) translate(-50%, -50%); - opacity: 0; - } -} -@keyframes antZoomBadgeOutRtl { - 0% { - -webkit-transform: scale(1) translate(-50%, -50%); - transform: scale(1) translate(-50%, -50%); - } - 100% { - -webkit-transform: scale(0) translate(-50%, -50%); - transform: scale(0) translate(-50%, -50%); - opacity: 0; - } -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-breadcrumb { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - color: rgba(0, 0, 0, 0.45); - font-size: 14px; -} -.ant-breadcrumb .anticon { - font-size: 14px; -} -.ant-breadcrumb a { - color: rgba(0, 0, 0, 0.45); - -webkit-transition: color 0.3s; - transition: color 0.3s; -} -.ant-breadcrumb a:hover { - color: #40a9ff; -} -.ant-breadcrumb > span:last-child { - color: rgba(0, 0, 0, 0.65); -} -.ant-breadcrumb > span:last-child a { - color: rgba(0, 0, 0, 0.65); -} -.ant-breadcrumb > span:last-child .ant-breadcrumb-separator { - display: none; -} -.ant-breadcrumb-separator { - margin: 0 8px; - color: rgba(0, 0, 0, 0.45); -} -.ant-breadcrumb-link > .anticon + span, -.ant-breadcrumb-link > .anticon + a { - margin-left: 4px; -} -.ant-breadcrumb-overlay-link > .anticon { - margin-left: 4px; -} -.ant-breadcrumb-rtl { - direction: rtl; -} -.ant-breadcrumb-rtl::before { - display: table; - content: ''; -} -.ant-breadcrumb-rtl::after { - display: table; - clear: both; - content: ''; -} -.ant-breadcrumb-rtl > span { - float: right; -} -.ant-breadcrumb-rtl .ant-breadcrumb-link > .anticon + span, -.ant-breadcrumb-rtl .ant-breadcrumb-link > .anticon + a { - margin-right: 4px; - margin-left: 0; -} -.ant-breadcrumb-rtl .ant-breadcrumb-overlay-link > .anticon { - margin-right: 4px; - margin-left: 0; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-menu-item-danger.ant-menu-item { - color: #ff4d4f; -} -.ant-menu-item-danger.ant-menu-item:hover, -.ant-menu-item-danger.ant-menu-item-active { - color: #ff4d4f; -} -.ant-menu-item-danger.ant-menu-item:active { - background: #fff1f0; -} -.ant-menu-item-danger.ant-menu-item-selected { - color: #ff4d4f; -} -.ant-menu-item-danger.ant-menu-item-selected > a, -.ant-menu-item-danger.ant-menu-item-selected > a:hover { - color: #ff4d4f; -} -.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-danger.ant-menu-item-selected { - background-color: #fff1f0; -} -.ant-menu-inline .ant-menu-item-danger.ant-menu-item::after { - border-right-color: #ff4d4f; -} -.ant-menu-dark .ant-menu-item-danger.ant-menu-item, -.ant-menu-dark .ant-menu-item-danger.ant-menu-item:hover, -.ant-menu-dark .ant-menu-item-danger.ant-menu-item > a { - color: #ff4d4f; -} -.ant-menu-dark.ant-menu-dark:not(.ant-menu-horizontal) .ant-menu-item-danger.ant-menu-item-selected { - color: #fff; - background-color: #ff4d4f; -} -.ant-menu { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - font-variant: tabular-nums; - line-height: 1.5715; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - margin-bottom: 0; - padding-left: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - line-height: 0; - text-align: left; - list-style: none; - background: #fff; - outline: none; - -webkit-box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - -webkit-transition: background 0.3s, width 0.3s cubic-bezier(0.2, 0, 0, 1) 0s; - transition: background 0.3s, width 0.3s cubic-bezier(0.2, 0, 0, 1) 0s; -} -.ant-menu::before { - display: table; - content: ''; -} -.ant-menu::after { - display: table; - clear: both; - content: ''; -} -.ant-menu ul, -.ant-menu ol { - margin: 0; - padding: 0; - list-style: none; -} -.ant-menu-hidden { - display: none; -} -.ant-menu-item-group-title { - height: 1.5715; - padding: 8px 16px; - color: rgba(0, 0, 0, 0.45); - font-size: 14px; - line-height: 1.5715; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-menu-submenu, -.ant-menu-submenu-inline { - -webkit-transition: border-color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.15s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: border-color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.15s cubic-bezier(0.645, 0.045, 0.355, 1); -} -.ant-menu-submenu-selected { - color: #1890ff; -} -.ant-menu-item:active, -.ant-menu-submenu-title:active { - background: #e6f7ff; -} -.ant-menu-submenu .ant-menu-sub { - cursor: initial; - -webkit-transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); -} -.ant-menu-item a { - color: rgba(0, 0, 0, 0.65); -} -.ant-menu-item a:hover { - color: #1890ff; -} -.ant-menu-item a::before { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background-color: transparent; - content: ''; -} -.ant-menu-item > .ant-badge a { - color: rgba(0, 0, 0, 0.65); -} -.ant-menu-item > .ant-badge a:hover { - color: #1890ff; -} -.ant-menu-item-divider { - height: 1px; - overflow: hidden; - line-height: 0; - background-color: #f0f0f0; -} -.ant-menu-item:hover, -.ant-menu-item-active, -.ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open, -.ant-menu-submenu-active, -.ant-menu-submenu-title:hover { - color: #1890ff; -} -.ant-menu-horizontal .ant-menu-item, -.ant-menu-horizontal .ant-menu-submenu { - margin-top: -1px; -} -.ant-menu-horizontal > .ant-menu-item:hover, -.ant-menu-horizontal > .ant-menu-item-active, -.ant-menu-horizontal > .ant-menu-submenu .ant-menu-submenu-title:hover { - background-color: transparent; -} -.ant-menu-item-selected { - color: #1890ff; -} -.ant-menu-item-selected a, -.ant-menu-item-selected a:hover { - color: #1890ff; -} -.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected { - background-color: #e6f7ff; -} -.ant-menu-inline, -.ant-menu-vertical, -.ant-menu-vertical-left { - border-right: 1px solid #f0f0f0; -} -.ant-menu-vertical-right { - border-left: 1px solid #f0f0f0; -} -.ant-menu-vertical.ant-menu-sub, -.ant-menu-vertical-left.ant-menu-sub, -.ant-menu-vertical-right.ant-menu-sub { - min-width: 160px; - max-height: calc(100vh - 100px); - padding: 0; - overflow: hidden; - border-right: 0; - -webkit-transform-origin: 0 0; - transform-origin: 0 0; -} -.ant-menu-vertical.ant-menu-sub:not(.zoom-big-enter-active):not(.zoom-big-leave-active), -.ant-menu-vertical-left.ant-menu-sub:not(.zoom-big-enter-active):not(.zoom-big-leave-active), -.ant-menu-vertical-right.ant-menu-sub:not(.zoom-big-enter-active):not(.zoom-big-leave-active) { - overflow-x: hidden; - overflow-y: auto; -} -.ant-menu-vertical.ant-menu-sub .ant-menu-item, -.ant-menu-vertical-left.ant-menu-sub .ant-menu-item, -.ant-menu-vertical-right.ant-menu-sub .ant-menu-item { - left: 0; - margin-left: 0; - border-right: 0; -} -.ant-menu-vertical.ant-menu-sub .ant-menu-item::after, -.ant-menu-vertical-left.ant-menu-sub .ant-menu-item::after, -.ant-menu-vertical-right.ant-menu-sub .ant-menu-item::after { - border-right: 0; -} -.ant-menu-vertical.ant-menu-sub > .ant-menu-item, -.ant-menu-vertical-left.ant-menu-sub > .ant-menu-item, -.ant-menu-vertical-right.ant-menu-sub > .ant-menu-item, -.ant-menu-vertical.ant-menu-sub > .ant-menu-submenu, -.ant-menu-vertical-left.ant-menu-sub > .ant-menu-submenu, -.ant-menu-vertical-right.ant-menu-sub > .ant-menu-submenu { - -webkit-transform-origin: 0 0; - transform-origin: 0 0; -} -.ant-menu-horizontal.ant-menu-sub { - min-width: 114px; -} -.ant-menu-item, -.ant-menu-submenu-title { - position: relative; - display: block; - margin: 0; - padding: 0 20px; - white-space: nowrap; - cursor: pointer; - -webkit-transition: color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), border-color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.15s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), border-color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.15s cubic-bezier(0.645, 0.045, 0.355, 1); -} -.ant-menu-item .anticon, -.ant-menu-submenu-title .anticon { - min-width: 14px; - margin-right: 10px; - font-size: 14px; - -webkit-transition: font-size 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), margin 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: font-size 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), margin 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); -} -.ant-menu-item .anticon + span, -.ant-menu-submenu-title .anticon + span { - opacity: 1; - -webkit-transition: opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), width 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), width 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); -} -.ant-menu-item.ant-menu-item-only-child > .anticon, -.ant-menu-submenu-title.ant-menu-item-only-child > .anticon { - margin-right: 0; -} -.ant-menu > .ant-menu-item-divider { - height: 1px; - margin: 1px 0; - padding: 0; - overflow: hidden; - line-height: 0; - background-color: #f0f0f0; -} -.ant-menu-submenu-popup { - position: absolute; - z-index: 1050; - border-radius: 2px; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-menu-submenu-popup::before { - position: absolute; - top: -7px; - right: 0; - bottom: 0; - left: 0; - z-index: -1; - width: 100%; - height: 100%; - opacity: 0.0001; - content: ' '; -} -.ant-menu-submenu-placement-rightTop::before { - top: 0; - left: -7px; -} -.ant-menu-submenu > .ant-menu { - background-color: #fff; - border-radius: 2px; -} -.ant-menu-submenu > .ant-menu-submenu-title::after { - -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); -} -.ant-menu-submenu-popup > .ant-menu { - background-color: #fff; -} -.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow, -.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow, -.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow, -.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow { - position: absolute; - top: 50%; - right: 16px; - width: 10px; - -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); -} -.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow::before, -.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow::before, -.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow::before, -.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow::before, -.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow::after, -.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow::after, -.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow::after, -.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow::after { - position: absolute; - width: 6px; - height: 1.5px; - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.65)), to(rgba(0, 0, 0, 0.65))); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.65), rgba(0, 0, 0, 0.65)); - border-radius: 2px; - -webkit-transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), top 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), top 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), top 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), top 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - content: ''; -} -.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow::before, -.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow::before, -.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow::before, -.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow::before { - -webkit-transform: rotate(45deg) translateY(-2px); - transform: rotate(45deg) translateY(-2px); -} -.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow::after, -.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow::after, -.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow::after, -.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow::after { - -webkit-transform: rotate(-45deg) translateY(2px); - transform: rotate(-45deg) translateY(2px); -} -.ant-menu-submenu-vertical > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow::after, -.ant-menu-submenu-vertical-left > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow::after, -.ant-menu-submenu-vertical-right > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow::after, -.ant-menu-submenu-inline > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow::after, -.ant-menu-submenu-vertical > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow::before, -.ant-menu-submenu-vertical-left > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow::before, -.ant-menu-submenu-vertical-right > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow::before, -.ant-menu-submenu-inline > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow::before { - background: -webkit-gradient(linear, left top, right top, from(#1890ff), to(#1890ff)); - background: linear-gradient(to right, #1890ff, #1890ff); -} -.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow::before, -.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow::before, -.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow::before { - -webkit-transform: rotate(45deg) translateY(-2px); - transform: rotate(45deg) translateY(-2px); -} -.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow::after, -.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow::after, -.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow::after { - -webkit-transform: rotate(-45deg) translateY(2px); - transform: rotate(-45deg) translateY(2px); -} -.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow::before { - -webkit-transform: rotate(-45deg) translateX(2px); - transform: rotate(-45deg) translateX(2px); -} -.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow::after { - -webkit-transform: rotate(45deg) translateX(-2px); - transform: rotate(45deg) translateX(-2px); -} -.ant-menu-submenu-open.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow { - -webkit-transform: translateY(-2px); - transform: translateY(-2px); -} -.ant-menu-submenu-open.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow::after { - -webkit-transform: rotate(-45deg) translateX(-2px); - transform: rotate(-45deg) translateX(-2px); -} -.ant-menu-submenu-open.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow::before { - -webkit-transform: rotate(45deg) translateX(2px); - transform: rotate(45deg) translateX(2px); -} -.ant-menu-vertical .ant-menu-submenu-selected, -.ant-menu-vertical-left .ant-menu-submenu-selected, -.ant-menu-vertical-right .ant-menu-submenu-selected { - color: #1890ff; -} -.ant-menu-horizontal { - line-height: 46px; - white-space: nowrap; - border: 0; - border-bottom: 1px solid #f0f0f0; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-menu-horizontal > .ant-menu-item, -.ant-menu-horizontal > .ant-menu-submenu { - position: relative; - top: 1px; - display: inline-block; - vertical-align: bottom; - border-bottom: 2px solid transparent; -} -.ant-menu-horizontal > .ant-menu-item:hover, -.ant-menu-horizontal > .ant-menu-submenu:hover, -.ant-menu-horizontal > .ant-menu-item-active, -.ant-menu-horizontal > .ant-menu-submenu-active, -.ant-menu-horizontal > .ant-menu-item-open, -.ant-menu-horizontal > .ant-menu-submenu-open, -.ant-menu-horizontal > .ant-menu-item-selected, -.ant-menu-horizontal > .ant-menu-submenu-selected { - color: #1890ff; - border-bottom: 2px solid #1890ff; -} -.ant-menu-horizontal > .ant-menu-item a { - color: rgba(0, 0, 0, 0.65); -} -.ant-menu-horizontal > .ant-menu-item a:hover { - color: #1890ff; -} -.ant-menu-horizontal > .ant-menu-item a::before { - bottom: -2px; -} -.ant-menu-horizontal > .ant-menu-item-selected a { - color: #1890ff; -} -.ant-menu-horizontal::after { - display: block; - clear: both; - height: 0; - content: '\20'; -} -.ant-menu-vertical .ant-menu-item, -.ant-menu-vertical-left .ant-menu-item, -.ant-menu-vertical-right .ant-menu-item, -.ant-menu-inline .ant-menu-item { - position: relative; -} -.ant-menu-vertical .ant-menu-item::after, -.ant-menu-vertical-left .ant-menu-item::after, -.ant-menu-vertical-right .ant-menu-item::after, -.ant-menu-inline .ant-menu-item::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - border-right: 3px solid #1890ff; - -webkit-transform: scaleY(0.0001); - transform: scaleY(0.0001); - opacity: 0; - -webkit-transition: opacity 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), -webkit-transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1); - transition: opacity 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), -webkit-transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1); - transition: transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), opacity 0.15s cubic-bezier(0.215, 0.61, 0.355, 1); - transition: transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), opacity 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), -webkit-transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1); - content: ''; -} -.ant-menu-vertical .ant-menu-item, -.ant-menu-vertical-left .ant-menu-item, -.ant-menu-vertical-right .ant-menu-item, -.ant-menu-inline .ant-menu-item, -.ant-menu-vertical .ant-menu-submenu-title, -.ant-menu-vertical-left .ant-menu-submenu-title, -.ant-menu-vertical-right .ant-menu-submenu-title, -.ant-menu-inline .ant-menu-submenu-title { - height: 40px; - margin-top: 4px; - margin-bottom: 4px; - padding: 0 16px; - overflow: hidden; - line-height: 40px; - text-overflow: ellipsis; -} -.ant-menu-vertical .ant-menu-submenu, -.ant-menu-vertical-left .ant-menu-submenu, -.ant-menu-vertical-right .ant-menu-submenu, -.ant-menu-inline .ant-menu-submenu { - padding-bottom: 0.02px; -} -.ant-menu-vertical .ant-menu-item:not(:last-child), -.ant-menu-vertical-left .ant-menu-item:not(:last-child), -.ant-menu-vertical-right .ant-menu-item:not(:last-child), -.ant-menu-inline .ant-menu-item:not(:last-child) { - margin-bottom: 8px; -} -.ant-menu-vertical > .ant-menu-item, -.ant-menu-vertical-left > .ant-menu-item, -.ant-menu-vertical-right > .ant-menu-item, -.ant-menu-inline > .ant-menu-item, -.ant-menu-vertical > .ant-menu-submenu > .ant-menu-submenu-title, -.ant-menu-vertical-left > .ant-menu-submenu > .ant-menu-submenu-title, -.ant-menu-vertical-right > .ant-menu-submenu > .ant-menu-submenu-title, -.ant-menu-inline > .ant-menu-submenu > .ant-menu-submenu-title { - height: 40px; - line-height: 40px; -} -.ant-menu-vertical .ant-menu-submenu-title { - padding-right: 34px; -} -.ant-menu-inline { - width: 100%; -} -.ant-menu-inline .ant-menu-selected::after, -.ant-menu-inline .ant-menu-item-selected::after { - -webkit-transform: scaleY(1); - transform: scaleY(1); - opacity: 1; - -webkit-transition: opacity 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: opacity 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.15s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1); -} -.ant-menu-inline .ant-menu-item, -.ant-menu-inline .ant-menu-submenu-title { - width: calc(100% + 1px); -} -.ant-menu-inline .ant-menu-submenu-title { - padding-right: 34px; -} -.ant-menu-inline-collapsed { - width: 80px; -} -.ant-menu-inline-collapsed > .ant-menu-item, -.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item, -.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title, -.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title { - left: 0; - padding: 0 32px; - text-overflow: clip; -} -.ant-menu-inline-collapsed > .ant-menu-item .ant-menu-submenu-arrow, -.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item .ant-menu-submenu-arrow, -.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title .ant-menu-submenu-arrow, -.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title .ant-menu-submenu-arrow { - display: none; -} -.ant-menu-inline-collapsed > .ant-menu-item .anticon, -.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item .anticon, -.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title .anticon, -.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title .anticon { - margin: 0; - font-size: 16px; - line-height: 40px; -} -.ant-menu-inline-collapsed > .ant-menu-item .anticon + span, -.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item .anticon + span, -.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title .anticon + span, -.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title .anticon + span { - display: inline-block; - max-width: 0; - opacity: 0; -} -.ant-menu-inline-collapsed .anticon { - display: inline-block; -} -.ant-menu-inline-collapsed-tooltip { - pointer-events: none; -} -.ant-menu-inline-collapsed-tooltip .anticon { - display: none; -} -.ant-menu-inline-collapsed-tooltip a { - color: rgba(255, 255, 255, 0.85); -} -.ant-menu-inline-collapsed .ant-menu-item-group-title { - padding-right: 4px; - padding-left: 4px; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} -.ant-menu-item-group-list { - margin: 0; - padding: 0; -} -.ant-menu-item-group-list .ant-menu-item, -.ant-menu-item-group-list .ant-menu-submenu-title { - padding: 0 16px 0 28px; -} -.ant-menu-root.ant-menu-vertical, -.ant-menu-root.ant-menu-vertical-left, -.ant-menu-root.ant-menu-vertical-right, -.ant-menu-root.ant-menu-inline { - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-menu-root.ant-menu-inline-collapsed .ant-menu-item > .ant-menu-inline-collapsed-noicon, -.ant-menu-root.ant-menu-inline-collapsed .ant-menu-submenu .ant-menu-submenu-title > .ant-menu-inline-collapsed-noicon { - font-size: 16px; - text-align: center; -} -.ant-menu-sub.ant-menu-inline { - padding: 0; - border: 0; - border-radius: 0; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-menu-sub.ant-menu-inline > .ant-menu-item, -.ant-menu-sub.ant-menu-inline > .ant-menu-submenu > .ant-menu-submenu-title { - height: 40px; - line-height: 40px; - list-style-position: inside; - list-style-type: disc; -} -.ant-menu-sub.ant-menu-inline .ant-menu-item-group-title { - padding-left: 32px; -} -.ant-menu-item-disabled, -.ant-menu-submenu-disabled { - color: rgba(0, 0, 0, 0.25) !important; - background: none; - border-color: transparent !important; - cursor: not-allowed; -} -.ant-menu-item-disabled a, -.ant-menu-submenu-disabled a { - color: rgba(0, 0, 0, 0.25) !important; - pointer-events: none; -} -.ant-menu-item-disabled > .ant-menu-submenu-title, -.ant-menu-submenu-disabled > .ant-menu-submenu-title { - color: rgba(0, 0, 0, 0.25) !important; - cursor: not-allowed; -} -.ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before, -.ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before, -.ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after, -.ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after { - background: rgba(0, 0, 0, 0.25) !important; -} -.ant-layout-header .ant-menu { - line-height: inherit; -} -.ant-menu.ant-menu-dark, -.ant-menu-dark .ant-menu-sub, -.ant-menu.ant-menu-dark .ant-menu-sub { - color: rgba(255, 255, 255, 0.65); - background: #001529; -} -.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow, -.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow, -.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow { - opacity: 0.45; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow::after, -.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow::after, -.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow::after, -.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow::before, -.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow::before, -.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow::before { - background: #fff; -} -.ant-menu-dark.ant-menu-submenu-popup { - background: transparent; -} -.ant-menu-dark .ant-menu-inline.ant-menu-sub { - background: #000c17; -} -.ant-menu-dark.ant-menu-horizontal { - border-bottom: 0; -} -.ant-menu-dark.ant-menu-horizontal > .ant-menu-item, -.ant-menu-dark.ant-menu-horizontal > .ant-menu-submenu { - top: 0; - margin-top: 0; - border-color: #001529; - border-bottom: 0; -} -.ant-menu-dark.ant-menu-horizontal > .ant-menu-item > a::before { - bottom: 0; -} -.ant-menu-dark .ant-menu-item, -.ant-menu-dark .ant-menu-item-group-title, -.ant-menu-dark .ant-menu-item > a, -.ant-menu-dark .ant-menu-item > span > a { - color: rgba(255, 255, 255, 0.65); -} -.ant-menu-dark.ant-menu-inline, -.ant-menu-dark.ant-menu-vertical, -.ant-menu-dark.ant-menu-vertical-left, -.ant-menu-dark.ant-menu-vertical-right { - border-right: 0; -} -.ant-menu-dark.ant-menu-inline .ant-menu-item, -.ant-menu-dark.ant-menu-vertical .ant-menu-item, -.ant-menu-dark.ant-menu-vertical-left .ant-menu-item, -.ant-menu-dark.ant-menu-vertical-right .ant-menu-item { - left: 0; - margin-left: 0; - border-right: 0; -} -.ant-menu-dark.ant-menu-inline .ant-menu-item::after, -.ant-menu-dark.ant-menu-vertical .ant-menu-item::after, -.ant-menu-dark.ant-menu-vertical-left .ant-menu-item::after, -.ant-menu-dark.ant-menu-vertical-right .ant-menu-item::after { - border-right: 0; -} -.ant-menu-dark.ant-menu-inline .ant-menu-item, -.ant-menu-dark.ant-menu-inline .ant-menu-submenu-title { - width: 100%; -} -.ant-menu-dark .ant-menu-item:hover, -.ant-menu-dark .ant-menu-item-active, -.ant-menu-dark .ant-menu-submenu-active, -.ant-menu-dark .ant-menu-submenu-open, -.ant-menu-dark .ant-menu-submenu-selected, -.ant-menu-dark .ant-menu-submenu-title:hover { - color: #fff; - background-color: transparent; -} -.ant-menu-dark .ant-menu-item:hover > a, -.ant-menu-dark .ant-menu-item-active > a, -.ant-menu-dark .ant-menu-submenu-active > a, -.ant-menu-dark .ant-menu-submenu-open > a, -.ant-menu-dark .ant-menu-submenu-selected > a, -.ant-menu-dark .ant-menu-submenu-title:hover > a, -.ant-menu-dark .ant-menu-item:hover > span > a, -.ant-menu-dark .ant-menu-item-active > span > a, -.ant-menu-dark .ant-menu-submenu-active > span > a, -.ant-menu-dark .ant-menu-submenu-open > span > a, -.ant-menu-dark .ant-menu-submenu-selected > span > a, -.ant-menu-dark .ant-menu-submenu-title:hover > span > a { - color: #fff; -} -.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow, -.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow, -.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow, -.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow, -.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow, -.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow, -.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow, -.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow, -.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow, -.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow, -.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow, -.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow { - opacity: 1; -} -.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after, -.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after, -.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after, -.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after, -.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after, -.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after, -.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow::after, -.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow::after, -.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow::after, -.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow::after, -.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow::after, -.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow::after, -.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before, -.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before, -.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before, -.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before, -.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before, -.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before, -.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow::before, -.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow::before, -.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow::before, -.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow::before, -.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow::before, -.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow::before { - background: #fff; -} -.ant-menu-dark .ant-menu-item:hover { - background-color: transparent; -} -.ant-menu-dark.ant-menu-dark:not(.ant-menu-horizontal) .ant-menu-item-selected { - background-color: #1890ff; -} -.ant-menu-dark .ant-menu-item-selected { - color: #fff; - border-right: 0; -} -.ant-menu-dark .ant-menu-item-selected::after { - border-right: 0; -} -.ant-menu-dark .ant-menu-item-selected > a, -.ant-menu-dark .ant-menu-item-selected > span > a, -.ant-menu-dark .ant-menu-item-selected > a:hover, -.ant-menu-dark .ant-menu-item-selected > span > a:hover { - color: #fff; -} -.ant-menu-dark .ant-menu-item-selected .anticon { - color: #fff; -} -.ant-menu-dark .ant-menu-item-selected .anticon + span { - color: #fff; -} -.ant-menu.ant-menu-dark .ant-menu-item-selected, -.ant-menu-submenu-popup.ant-menu-dark .ant-menu-item-selected { - background-color: #1890ff; -} -.ant-menu-dark .ant-menu-item-disabled, -.ant-menu-dark .ant-menu-submenu-disabled, -.ant-menu-dark .ant-menu-item-disabled > a, -.ant-menu-dark .ant-menu-submenu-disabled > a, -.ant-menu-dark .ant-menu-item-disabled > span > a, -.ant-menu-dark .ant-menu-submenu-disabled > span > a { - color: rgba(255, 255, 255, 0.35) !important; - opacity: 0.8; -} -.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title, -.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title { - color: rgba(255, 255, 255, 0.35) !important; -} -.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before, -.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::before, -.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after, -.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow::after { - background: rgba(255, 255, 255, 0.35) !important; -} -.ant-menu-rtl { - direction: rtl; - text-align: right; -} -.ant-menu-rtl .ant-menu-item-group-title { - text-align: right; -} -.ant-menu-rtl.ant-menu-inline, -.ant-menu-rtl.ant-menu-vertical { - border-right: none; - border-left: 1px solid #f0f0f0; -} -.ant-menu-rtl.ant-menu-dark.ant-menu-inline, -.ant-menu-rtl.ant-menu-dark.ant-menu-vertical { - border-left: none; -} -.ant-menu-rtl.ant-menu-vertical.ant-menu-sub, -.ant-menu-rtl.ant-menu-vertical-left.ant-menu-sub, -.ant-menu-rtl.ant-menu-vertical-right.ant-menu-sub { - -webkit-transform-origin: top right; - transform-origin: top right; -} -.ant-menu-rtl.ant-menu-vertical.ant-menu-sub > .ant-menu-item, -.ant-menu-rtl.ant-menu-vertical-left.ant-menu-sub > .ant-menu-item, -.ant-menu-rtl.ant-menu-vertical-right.ant-menu-sub > .ant-menu-item, -.ant-menu-rtl.ant-menu-vertical.ant-menu-sub > .ant-menu-submenu, -.ant-menu-rtl.ant-menu-vertical-left.ant-menu-sub > .ant-menu-submenu, -.ant-menu-rtl.ant-menu-vertical-right.ant-menu-sub > .ant-menu-submenu { - -webkit-transform-origin: top right; - transform-origin: top right; -} -.ant-menu-rtl .ant-menu-item .anticon, -.ant-menu-rtl .ant-menu-submenu-title .anticon { - margin-right: auto; - margin-left: 10px; -} -.ant-menu-rtl .ant-menu-item.ant-menu-item-only-child > .anticon, -.ant-menu-rtl .ant-menu-submenu-title.ant-menu-item-only-child > .anticon { - margin-left: 0; -} -.ant-menu-rtl .ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow, -.ant-menu-rtl .ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow, -.ant-menu-rtl .ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow, -.ant-menu-rtl .ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow { - right: auto; - left: 16px; -} -.ant-menu-rtl .ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow::before, -.ant-menu-rtl .ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow::before, -.ant-menu-rtl .ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow::before { - -webkit-transform: rotate(-45deg) translateY(-2px); - transform: rotate(-45deg) translateY(-2px); -} -.ant-menu-rtl .ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow::after, -.ant-menu-rtl .ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow::after, -.ant-menu-rtl .ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow::after { - -webkit-transform: rotate(45deg) translateY(2px); - transform: rotate(45deg) translateY(2px); -} -.ant-menu-rtl.ant-menu-vertical .ant-menu-item::after, -.ant-menu-rtl.ant-menu-vertical-left .ant-menu-item::after, -.ant-menu-rtl.ant-menu-vertical-right .ant-menu-item::after, -.ant-menu-rtl.ant-menu-inline .ant-menu-item::after { - right: auto; - left: 0; -} -.ant-menu-rtl.ant-menu-vertical .ant-menu-item, -.ant-menu-rtl.ant-menu-vertical-left .ant-menu-item, -.ant-menu-rtl.ant-menu-vertical-right .ant-menu-item, -.ant-menu-rtl.ant-menu-inline .ant-menu-item, -.ant-menu-rtl.ant-menu-vertical .ant-menu-submenu-title, -.ant-menu-rtl.ant-menu-vertical-left .ant-menu-submenu-title, -.ant-menu-rtl.ant-menu-vertical-right .ant-menu-submenu-title, -.ant-menu-rtl.ant-menu-inline .ant-menu-submenu-title { - text-align: right; -} -.ant-menu-rtl.ant-menu-inline .ant-menu-submenu-title { - padding-right: 0; - padding-left: 34px; -} -.ant-menu-rtl.ant-menu-vertical .ant-menu-submenu-title { - padding-right: 16px; - padding-left: 34px; -} -.ant-menu-rtl.ant-menu-inline-collapsed.ant-menu-vertical .ant-menu-submenu-title { - padding: 0 32px; -} -.ant-menu-rtl .ant-menu-item-group-list .ant-menu-item, -.ant-menu-rtl .ant-menu-item-group-list .ant-menu-submenu-title { - padding: 0 28px 0 16px; -} -.ant-menu-sub.ant-menu-inline { - border: 0; -} -.ant-menu-rtl.ant-menu-sub.ant-menu-inline .ant-menu-item-group-title { - padding-right: 32px; - padding-left: 0; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-tooltip { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: absolute; - z-index: 1070; - display: block; - max-width: 250px; - visibility: visible; -} -.ant-tooltip-hidden { - display: none; -} -.ant-tooltip-placement-top, -.ant-tooltip-placement-topLeft, -.ant-tooltip-placement-topRight { - padding-bottom: 8px; -} -.ant-tooltip-placement-right, -.ant-tooltip-placement-rightTop, -.ant-tooltip-placement-rightBottom { - padding-left: 8px; -} -.ant-tooltip-placement-bottom, -.ant-tooltip-placement-bottomLeft, -.ant-tooltip-placement-bottomRight { - padding-top: 8px; -} -.ant-tooltip-placement-left, -.ant-tooltip-placement-leftTop, -.ant-tooltip-placement-leftBottom { - padding-right: 8px; -} -.ant-tooltip-inner { - min-width: 30px; - min-height: 32px; - padding: 6px 8px; - color: #fff; - text-align: left; - text-decoration: none; - word-wrap: break-word; - background-color: rgba(0, 0, 0, 0.75); - border-radius: 2px; - -webkit-box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); -} -.ant-tooltip-arrow { - position: absolute; - display: block; - width: 13.07106781px; - height: 13.07106781px; - overflow: hidden; - background: transparent; - pointer-events: none; -} -.ant-tooltip-arrow-content { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - display: block; - width: 5px; - height: 5px; - margin: auto; - background-color: rgba(0, 0, 0, 0.75); - content: ''; - pointer-events: auto; -} -.ant-tooltip-placement-top .ant-tooltip-arrow, -.ant-tooltip-placement-topLeft .ant-tooltip-arrow, -.ant-tooltip-placement-topRight .ant-tooltip-arrow { - bottom: -5.07106781px; -} -.ant-tooltip-placement-top .ant-tooltip-arrow-content, -.ant-tooltip-placement-topLeft .ant-tooltip-arrow-content, -.ant-tooltip-placement-topRight .ant-tooltip-arrow-content { - -webkit-box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07); - box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07); - -webkit-transform: translateY(-6.53553391px) rotate(45deg); - transform: translateY(-6.53553391px) rotate(45deg); -} -.ant-tooltip-placement-top .ant-tooltip-arrow { - left: 50%; - -webkit-transform: translateX(-50%); - transform: translateX(-50%); -} -.ant-tooltip-placement-topLeft .ant-tooltip-arrow { - left: 13px; -} -.ant-tooltip-placement-topRight .ant-tooltip-arrow { - right: 13px; -} -.ant-tooltip-placement-right .ant-tooltip-arrow, -.ant-tooltip-placement-rightTop .ant-tooltip-arrow, -.ant-tooltip-placement-rightBottom .ant-tooltip-arrow { - left: -5.07106781px; -} -.ant-tooltip-placement-right .ant-tooltip-arrow-content, -.ant-tooltip-placement-rightTop .ant-tooltip-arrow-content, -.ant-tooltip-placement-rightBottom .ant-tooltip-arrow-content { - -webkit-box-shadow: -3px 3px 7px rgba(0, 0, 0, 0.07); - box-shadow: -3px 3px 7px rgba(0, 0, 0, 0.07); - -webkit-transform: translateX(6.53553391px) rotate(45deg); - transform: translateX(6.53553391px) rotate(45deg); -} -.ant-tooltip-placement-right .ant-tooltip-arrow { - top: 50%; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); -} -.ant-tooltip-placement-rightTop .ant-tooltip-arrow { - top: 5px; -} -.ant-tooltip-placement-rightBottom .ant-tooltip-arrow { - bottom: 5px; -} -.ant-tooltip-placement-left .ant-tooltip-arrow, -.ant-tooltip-placement-leftTop .ant-tooltip-arrow, -.ant-tooltip-placement-leftBottom .ant-tooltip-arrow { - right: -5.07106781px; -} -.ant-tooltip-placement-left .ant-tooltip-arrow-content, -.ant-tooltip-placement-leftTop .ant-tooltip-arrow-content, -.ant-tooltip-placement-leftBottom .ant-tooltip-arrow-content { - -webkit-box-shadow: 3px -3px 7px rgba(0, 0, 0, 0.07); - box-shadow: 3px -3px 7px rgba(0, 0, 0, 0.07); - -webkit-transform: translateX(-6.53553391px) rotate(45deg); - transform: translateX(-6.53553391px) rotate(45deg); -} -.ant-tooltip-placement-left .ant-tooltip-arrow { - top: 50%; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); -} -.ant-tooltip-placement-leftTop .ant-tooltip-arrow { - top: 5px; -} -.ant-tooltip-placement-leftBottom .ant-tooltip-arrow { - bottom: 5px; -} -.ant-tooltip-placement-bottom .ant-tooltip-arrow, -.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow, -.ant-tooltip-placement-bottomRight .ant-tooltip-arrow { - top: -5.07106781px; -} -.ant-tooltip-placement-bottom .ant-tooltip-arrow-content, -.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow-content, -.ant-tooltip-placement-bottomRight .ant-tooltip-arrow-content { - -webkit-box-shadow: -3px -3px 7px rgba(0, 0, 0, 0.07); - box-shadow: -3px -3px 7px rgba(0, 0, 0, 0.07); - -webkit-transform: translateY(6.53553391px) rotate(45deg); - transform: translateY(6.53553391px) rotate(45deg); -} -.ant-tooltip-placement-bottom .ant-tooltip-arrow { - left: 50%; - -webkit-transform: translateX(-50%); - transform: translateX(-50%); -} -.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow { - left: 13px; -} -.ant-tooltip-placement-bottomRight .ant-tooltip-arrow { - right: 13px; -} -.ant-tooltip-pink .ant-tooltip-inner { - background-color: #eb2f96; -} -.ant-tooltip-pink .ant-tooltip-arrow-content { - background-color: #eb2f96; -} -.ant-tooltip-magenta .ant-tooltip-inner { - background-color: #eb2f96; -} -.ant-tooltip-magenta .ant-tooltip-arrow-content { - background-color: #eb2f96; -} -.ant-tooltip-red .ant-tooltip-inner { - background-color: #f5222d; -} -.ant-tooltip-red .ant-tooltip-arrow-content { - background-color: #f5222d; -} -.ant-tooltip-volcano .ant-tooltip-inner { - background-color: #fa541c; -} -.ant-tooltip-volcano .ant-tooltip-arrow-content { - background-color: #fa541c; -} -.ant-tooltip-orange .ant-tooltip-inner { - background-color: #fa8c16; -} -.ant-tooltip-orange .ant-tooltip-arrow-content { - background-color: #fa8c16; -} -.ant-tooltip-yellow .ant-tooltip-inner { - background-color: #fadb14; -} -.ant-tooltip-yellow .ant-tooltip-arrow-content { - background-color: #fadb14; -} -.ant-tooltip-gold .ant-tooltip-inner { - background-color: #faad14; -} -.ant-tooltip-gold .ant-tooltip-arrow-content { - background-color: #faad14; -} -.ant-tooltip-cyan .ant-tooltip-inner { - background-color: #13c2c2; -} -.ant-tooltip-cyan .ant-tooltip-arrow-content { - background-color: #13c2c2; -} -.ant-tooltip-lime .ant-tooltip-inner { - background-color: #a0d911; -} -.ant-tooltip-lime .ant-tooltip-arrow-content { - background-color: #a0d911; -} -.ant-tooltip-green .ant-tooltip-inner { - background-color: #52c41a; -} -.ant-tooltip-green .ant-tooltip-arrow-content { - background-color: #52c41a; -} -.ant-tooltip-blue .ant-tooltip-inner { - background-color: #1890ff; -} -.ant-tooltip-blue .ant-tooltip-arrow-content { - background-color: #1890ff; -} -.ant-tooltip-geekblue .ant-tooltip-inner { - background-color: #2f54eb; -} -.ant-tooltip-geekblue .ant-tooltip-arrow-content { - background-color: #2f54eb; -} -.ant-tooltip-purple .ant-tooltip-inner { - background-color: #722ed1; -} -.ant-tooltip-purple .ant-tooltip-arrow-content { - background-color: #722ed1; -} -.ant-tooltip-rtl { - direction: rtl; -} -.ant-tooltip-rtl .ant-tooltip-inner { - text-align: right; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-dropdown-menu-item.ant-dropdown-menu-item-danger { - color: #ff4d4f; -} -.ant-dropdown-menu-item.ant-dropdown-menu-item-danger:hover { - color: #fff; - background-color: #ff4d4f; -} -.ant-dropdown { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: absolute; - top: -9999px; - left: -9999px; - z-index: 1050; - display: block; -} -.ant-dropdown::before { - position: absolute; - top: -7px; - right: 0; - bottom: -7px; - left: -7px; - z-index: -9999; - opacity: 0.0001; - content: ' '; -} -.ant-dropdown-wrap { - position: relative; -} -.ant-dropdown-wrap .ant-btn > .anticon-down { - display: inline-block; - font-size: 10px; -} -.ant-dropdown-wrap .anticon-down::before { - -webkit-transition: -webkit-transform 0.2s; - transition: -webkit-transform 0.2s; - transition: transform 0.2s; - transition: transform 0.2s, -webkit-transform 0.2s; -} -.ant-dropdown-wrap-open .anticon-down::before { - -webkit-transform: rotate(180deg); - transform: rotate(180deg); -} -.ant-dropdown-hidden, -.ant-dropdown-menu-hidden { - display: none; -} -.ant-dropdown-show-arrow.ant-dropdown-placement-topCenter, -.ant-dropdown-show-arrow.ant-dropdown-placement-topLeft, -.ant-dropdown-show-arrow.ant-dropdown-placement-topRight { - padding-bottom: 10px; -} -.ant-dropdown-show-arrow.ant-dropdown-placement-bottomCenter, -.ant-dropdown-show-arrow.ant-dropdown-placement-bottomLeft, -.ant-dropdown-show-arrow.ant-dropdown-placement-bottomRight { - padding-top: 10px; -} -.ant-dropdown-arrow { - position: absolute; - z-index: 1; - display: block; - width: 8.48528137px; - height: 8.48528137px; - background: transparent; - border-style: solid; - border-width: 4.24264069px; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); -} -.ant-dropdown-placement-topCenter > .ant-dropdown-arrow, -.ant-dropdown-placement-topLeft > .ant-dropdown-arrow, -.ant-dropdown-placement-topRight > .ant-dropdown-arrow { - bottom: 6.2px; - border-top-color: transparent; - border-right-color: #fff; - border-bottom-color: #fff; - border-left-color: transparent; - -webkit-box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07); - box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07); -} -.ant-dropdown-placement-topCenter > .ant-dropdown-arrow { - left: 50%; - -webkit-transform: translateX(-50%) rotate(45deg); - transform: translateX(-50%) rotate(45deg); -} -.ant-dropdown-placement-topLeft > .ant-dropdown-arrow { - left: 16px; -} -.ant-dropdown-placement-topRight > .ant-dropdown-arrow { - right: 16px; -} -.ant-dropdown-placement-bottomCenter > .ant-dropdown-arrow, -.ant-dropdown-placement-bottomLeft > .ant-dropdown-arrow, -.ant-dropdown-placement-bottomRight > .ant-dropdown-arrow { - top: 6px; - border-top-color: #fff; - border-right-color: transparent; - border-bottom-color: transparent; - border-left-color: #fff; - -webkit-box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.06); - box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.06); -} -.ant-dropdown-placement-bottomCenter > .ant-dropdown-arrow { - left: 50%; - -webkit-transform: translateX(-50%) rotate(45deg); - transform: translateX(-50%) rotate(45deg); -} -.ant-dropdown-placement-bottomLeft > .ant-dropdown-arrow { - left: 16px; -} -.ant-dropdown-placement-bottomRight > .ant-dropdown-arrow { - right: 16px; -} -.ant-dropdown-menu { - position: relative; - margin: 0; - padding: 4px 0; - text-align: left; - list-style-type: none; - background-color: #fff; - background-clip: padding-box; - border-radius: 2px; - outline: none; - -webkit-box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); -} -.ant-dropdown-menu-item-group-title { - padding: 5px 12px; - color: rgba(0, 0, 0, 0.45); - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-dropdown-menu-submenu-popup { - position: absolute; - z-index: 1050; - background: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-dropdown-menu-submenu-popup > .ant-dropdown-menu { - -webkit-transform-origin: 0 0; - transform-origin: 0 0; -} -.ant-dropdown-menu-submenu-popup ul, -.ant-dropdown-menu-submenu-popup li { - list-style: none; -} -.ant-dropdown-menu-submenu-popup ul { - margin-right: 0.3em; - margin-left: 0.3em; -} -.ant-dropdown-menu-item, -.ant-dropdown-menu-submenu-title { - clear: both; - margin: 0; - padding: 5px 12px; - color: rgba(0, 0, 0, 0.65); - font-weight: normal; - font-size: 14px; - line-height: 22px; - white-space: nowrap; - cursor: pointer; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-dropdown-menu-item > .anticon:first-child, -.ant-dropdown-menu-submenu-title > .anticon:first-child, -.ant-dropdown-menu-item > span > .anticon:first-child, -.ant-dropdown-menu-submenu-title > span > .anticon:first-child { - min-width: 12px; - margin-right: 8px; - font-size: 12px; -} -.ant-dropdown-menu-item > a, -.ant-dropdown-menu-submenu-title > a { - display: block; - margin: -5px -12px; - padding: 5px 12px; - color: rgba(0, 0, 0, 0.65); - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-dropdown-menu-item > a:hover, -.ant-dropdown-menu-submenu-title > a:hover { - color: rgba(0, 0, 0, 0.65); -} -.ant-dropdown-menu-item > .anticon + span > a, -.ant-dropdown-menu-submenu-title > .anticon + span > a { - color: rgba(0, 0, 0, 0.65); - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-dropdown-menu-item > .anticon + span > a:hover, -.ant-dropdown-menu-submenu-title > .anticon + span > a:hover { - color: rgba(0, 0, 0, 0.65); -} -.ant-dropdown-menu-item-selected, -.ant-dropdown-menu-submenu-title-selected, -.ant-dropdown-menu-item-selected > a, -.ant-dropdown-menu-submenu-title-selected > a { - color: #1890ff; - background-color: #e6f7ff; -} -.ant-dropdown-menu-item:hover, -.ant-dropdown-menu-submenu-title:hover { - background-color: #f5f5f5; -} -.ant-dropdown-menu-item-disabled, -.ant-dropdown-menu-submenu-title-disabled { - color: rgba(0, 0, 0, 0.25); - cursor: not-allowed; -} -.ant-dropdown-menu-item-disabled:hover, -.ant-dropdown-menu-submenu-title-disabled:hover { - color: rgba(0, 0, 0, 0.25); - background-color: #fff; - cursor: not-allowed; -} -.ant-dropdown-menu-item-divider, -.ant-dropdown-menu-submenu-title-divider { - height: 1px; - margin: 4px 0; - overflow: hidden; - line-height: 0; - background-color: #f0f0f0; -} -.ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow, -.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow { - position: absolute; - right: 8px; -} -.ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow-icon, -.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon { - margin-right: 0 !important; - color: rgba(0, 0, 0, 0.45); - font-style: normal; - display: inline-block; - font-size: 10px; -} -.ant-dropdown-menu-item-group-list { - margin: 0 8px; - padding: 0; - list-style: none; -} -.ant-dropdown-menu-submenu-title { - padding-right: 24px; -} -.ant-dropdown-menu-submenu-vertical { - position: relative; -} -.ant-dropdown-menu-submenu-vertical > .ant-dropdown-menu { - position: absolute; - top: 0; - left: 100%; - min-width: 100%; - margin-left: 4px; - -webkit-transform-origin: 0 0; - transform-origin: 0 0; -} -.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title, -.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon { - color: rgba(0, 0, 0, 0.25); - background-color: #fff; - cursor: not-allowed; -} -.ant-dropdown-menu-submenu-selected .ant-dropdown-menu-submenu-title { - color: #1890ff; -} -.ant-dropdown.slide-down-enter.slide-down-enter-active.ant-dropdown-placement-bottomLeft, -.ant-dropdown.slide-down-appear.slide-down-appear-active.ant-dropdown-placement-bottomLeft, -.ant-dropdown.slide-down-enter.slide-down-enter-active.ant-dropdown-placement-bottomCenter, -.ant-dropdown.slide-down-appear.slide-down-appear-active.ant-dropdown-placement-bottomCenter, -.ant-dropdown.slide-down-enter.slide-down-enter-active.ant-dropdown-placement-bottomRight, -.ant-dropdown.slide-down-appear.slide-down-appear-active.ant-dropdown-placement-bottomRight { - -webkit-animation-name: antSlideUpIn; - animation-name: antSlideUpIn; -} -.ant-dropdown.slide-up-enter.slide-up-enter-active.ant-dropdown-placement-topLeft, -.ant-dropdown.slide-up-appear.slide-up-appear-active.ant-dropdown-placement-topLeft, -.ant-dropdown.slide-up-enter.slide-up-enter-active.ant-dropdown-placement-topCenter, -.ant-dropdown.slide-up-appear.slide-up-appear-active.ant-dropdown-placement-topCenter, -.ant-dropdown.slide-up-enter.slide-up-enter-active.ant-dropdown-placement-topRight, -.ant-dropdown.slide-up-appear.slide-up-appear-active.ant-dropdown-placement-topRight { - -webkit-animation-name: antSlideDownIn; - animation-name: antSlideDownIn; -} -.ant-dropdown.slide-down-leave.slide-down-leave-active.ant-dropdown-placement-bottomLeft, -.ant-dropdown.slide-down-leave.slide-down-leave-active.ant-dropdown-placement-bottomCenter, -.ant-dropdown.slide-down-leave.slide-down-leave-active.ant-dropdown-placement-bottomRight { - -webkit-animation-name: antSlideUpOut; - animation-name: antSlideUpOut; -} -.ant-dropdown.slide-up-leave.slide-up-leave-active.ant-dropdown-placement-topLeft, -.ant-dropdown.slide-up-leave.slide-up-leave-active.ant-dropdown-placement-topCenter, -.ant-dropdown.slide-up-leave.slide-up-leave-active.ant-dropdown-placement-topRight { - -webkit-animation-name: antSlideDownOut; - animation-name: antSlideDownOut; -} -.ant-dropdown-trigger > .anticon.anticon-down, -.ant-dropdown-link > .anticon.anticon-down, -.ant-dropdown-button > .anticon.anticon-down { - vertical-align: baseline; - display: inline-block; - font-size: 10px; -} -.ant-dropdown-button { - white-space: nowrap; -} -.ant-dropdown-button.ant-btn-group > .ant-btn:last-child:not(:first-child):not(.ant-btn-icon-only) { - padding-right: 8px; - padding-left: 8px; -} -.ant-dropdown-menu-dark, -.ant-dropdown-menu-dark .ant-dropdown-menu { - background: #001529; -} -.ant-dropdown-menu-dark .ant-dropdown-menu-item, -.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title, -.ant-dropdown-menu-dark .ant-dropdown-menu-item > a, -.ant-dropdown-menu-dark .ant-dropdown-menu-item > .anticon + span > a { - color: rgba(255, 255, 255, 0.65); -} -.ant-dropdown-menu-dark .ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow::after, -.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow::after, -.ant-dropdown-menu-dark .ant-dropdown-menu-item > a .ant-dropdown-menu-submenu-arrow::after, -.ant-dropdown-menu-dark .ant-dropdown-menu-item > .anticon + span > a .ant-dropdown-menu-submenu-arrow::after { - color: rgba(255, 255, 255, 0.65); -} -.ant-dropdown-menu-dark .ant-dropdown-menu-item:hover, -.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title:hover, -.ant-dropdown-menu-dark .ant-dropdown-menu-item > a:hover, -.ant-dropdown-menu-dark .ant-dropdown-menu-item > .anticon + span > a:hover { - color: #fff; - background: transparent; -} -.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected, -.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected:hover, -.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected > a { - color: #fff; - background: #1890ff; -} -.ant-dropdown-rtl { - direction: rtl; -} -.ant-dropdown-rtl.ant-dropdown::before { - right: -7px; - left: 0; -} -.ant-dropdown-menu-rtl { - direction: rtl; - text-align: right; -} -.ant-dropdown-rtl .ant-dropdown-menu-item-group-title { - direction: rtl; - text-align: right; -} -.ant-dropdown-rtl .ant-dropdown-menu-submenu-popup ul, -.ant-dropdown-rtl .ant-dropdown-menu-submenu-popup li { - text-align: right; -} -.ant-dropdown-rtl .ant-dropdown-menu-item, -.ant-dropdown-rtl .ant-dropdown-menu-submenu-title { - text-align: right; -} -.ant-dropdown-rtl .ant-dropdown-menu-item > .anticon:first-child, -.ant-dropdown-rtl .ant-dropdown-menu-submenu-title > .anticon:first-child, -.ant-dropdown-rtl .ant-dropdown-menu-item > span > .anticon:first-child, -.ant-dropdown-rtl .ant-dropdown-menu-submenu-title > span > .anticon:first-child { - margin-right: 0; - margin-left: 8px; -} -.ant-dropdown-rtl .ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow, -.ant-dropdown-rtl .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow { - right: auto; - left: 8px; -} -.ant-dropdown-rtl .ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow-icon, -.ant-dropdown-rtl .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon { - margin-left: 0 !important; - -webkit-transform: scaleX(-1); - transform: scaleX(-1); -} -.ant-dropdown-rtl .ant-dropdown-menu-submenu-title { - padding-right: 12px; - padding-left: 24px; -} -.ant-dropdown-rtl .ant-dropdown-menu-submenu-vertical > .ant-dropdown-menu { - right: 100%; - left: 0; - margin-right: 4px; - margin-left: 0; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-btn { - line-height: 1.5715; - position: relative; - display: inline-block; - font-weight: 400; - white-space: nowrap; - text-align: center; - background-image: none; - border: 1px solid transparent; - -webkit-box-shadow: 0 2px 0 rgba(0, 0, 0, 0.015); - box-shadow: 0 2px 0 rgba(0, 0, 0, 0.015); - cursor: pointer; - -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - -ms-touch-action: manipulation; - touch-action: manipulation; - height: 32px; - padding: 4px 15px; - font-size: 14px; - border-radius: 2px; - color: rgba(0, 0, 0, 0.65); - background: #fff; - border-color: #d9d9d9; -} -.ant-btn > .anticon { - line-height: 1; -} -.ant-btn, -.ant-btn:active, -.ant-btn:focus { - outline: 0; -} -.ant-btn:not([disabled]):hover { - text-decoration: none; -} -.ant-btn:not([disabled]):active { - outline: 0; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn[disabled] { - cursor: not-allowed; -} -.ant-btn[disabled] > * { - pointer-events: none; -} -.ant-btn-lg { - height: 40px; - padding: 6.4px 15px; - font-size: 16px; - border-radius: 2px; -} -.ant-btn-sm { - height: 24px; - padding: 0px 7px; - font-size: 14px; - border-radius: 2px; -} -.ant-btn > a:only-child { - color: currentColor; -} -.ant-btn > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn:hover, -.ant-btn:focus { - color: #40a9ff; - background: #fff; - border-color: #40a9ff; -} -.ant-btn:hover > a:only-child, -.ant-btn:focus > a:only-child { - color: currentColor; -} -.ant-btn:hover > a:only-child::after, -.ant-btn:focus > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn:active { - color: #096dd9; - background: #fff; - border-color: #096dd9; -} -.ant-btn:active > a:only-child { - color: currentColor; -} -.ant-btn:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn[disabled], -.ant-btn[disabled]:hover, -.ant-btn[disabled]:focus, -.ant-btn[disabled]:active { - color: rgba(0, 0, 0, 0.25); - background: #f5f5f5; - border-color: #d9d9d9; - text-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn[disabled] > a:only-child, -.ant-btn[disabled]:hover > a:only-child, -.ant-btn[disabled]:focus > a:only-child, -.ant-btn[disabled]:active > a:only-child { - color: currentColor; -} -.ant-btn[disabled] > a:only-child::after, -.ant-btn[disabled]:hover > a:only-child::after, -.ant-btn[disabled]:focus > a:only-child::after, -.ant-btn[disabled]:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn:hover, -.ant-btn:focus, -.ant-btn:active { - text-decoration: none; - background: #fff; -} -.ant-btn > span { - display: inline-block; -} -.ant-btn-primary { - color: #fff; - background: #1890ff; - border-color: #1890ff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12); - -webkit-box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045); - box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045); -} -.ant-btn-primary > a:only-child { - color: currentColor; -} -.ant-btn-primary > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-primary:hover, -.ant-btn-primary:focus { - color: #fff; - background: #40a9ff; - border-color: #40a9ff; -} -.ant-btn-primary:hover > a:only-child, -.ant-btn-primary:focus > a:only-child { - color: currentColor; -} -.ant-btn-primary:hover > a:only-child::after, -.ant-btn-primary:focus > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-primary:active { - color: #fff; - background: #096dd9; - border-color: #096dd9; -} -.ant-btn-primary:active > a:only-child { - color: currentColor; -} -.ant-btn-primary:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-primary[disabled], -.ant-btn-primary[disabled]:hover, -.ant-btn-primary[disabled]:focus, -.ant-btn-primary[disabled]:active { - color: rgba(0, 0, 0, 0.25); - background: #f5f5f5; - border-color: #d9d9d9; - text-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-primary[disabled] > a:only-child, -.ant-btn-primary[disabled]:hover > a:only-child, -.ant-btn-primary[disabled]:focus > a:only-child, -.ant-btn-primary[disabled]:active > a:only-child { - color: currentColor; -} -.ant-btn-primary[disabled] > a:only-child::after, -.ant-btn-primary[disabled]:hover > a:only-child::after, -.ant-btn-primary[disabled]:focus > a:only-child::after, -.ant-btn-primary[disabled]:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child) { - border-right-color: #40a9ff; - border-left-color: #40a9ff; -} -.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child):disabled { - border-color: #d9d9d9; -} -.ant-btn-group .ant-btn-primary:first-child:not(:last-child) { - border-right-color: #40a9ff; -} -.ant-btn-group .ant-btn-primary:first-child:not(:last-child)[disabled] { - border-right-color: #d9d9d9; -} -.ant-btn-group .ant-btn-primary:last-child:not(:first-child), -.ant-btn-group .ant-btn-primary + .ant-btn-primary { - border-left-color: #40a9ff; -} -.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled], -.ant-btn-group .ant-btn-primary + .ant-btn-primary[disabled] { - border-left-color: #d9d9d9; -} -.ant-btn-ghost { - color: rgba(0, 0, 0, 0.65); - background: transparent; - border-color: #d9d9d9; -} -.ant-btn-ghost > a:only-child { - color: currentColor; -} -.ant-btn-ghost > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-ghost:hover, -.ant-btn-ghost:focus { - color: #40a9ff; - background: transparent; - border-color: #40a9ff; -} -.ant-btn-ghost:hover > a:only-child, -.ant-btn-ghost:focus > a:only-child { - color: currentColor; -} -.ant-btn-ghost:hover > a:only-child::after, -.ant-btn-ghost:focus > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-ghost:active { - color: #096dd9; - background: transparent; - border-color: #096dd9; -} -.ant-btn-ghost:active > a:only-child { - color: currentColor; -} -.ant-btn-ghost:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-ghost[disabled], -.ant-btn-ghost[disabled]:hover, -.ant-btn-ghost[disabled]:focus, -.ant-btn-ghost[disabled]:active { - color: rgba(0, 0, 0, 0.25); - background: #f5f5f5; - border-color: #d9d9d9; - text-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-ghost[disabled] > a:only-child, -.ant-btn-ghost[disabled]:hover > a:only-child, -.ant-btn-ghost[disabled]:focus > a:only-child, -.ant-btn-ghost[disabled]:active > a:only-child { - color: currentColor; -} -.ant-btn-ghost[disabled] > a:only-child::after, -.ant-btn-ghost[disabled]:hover > a:only-child::after, -.ant-btn-ghost[disabled]:focus > a:only-child::after, -.ant-btn-ghost[disabled]:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dashed { - color: rgba(0, 0, 0, 0.65); - background: #fff; - border-color: #d9d9d9; - border-style: dashed; -} -.ant-btn-dashed > a:only-child { - color: currentColor; -} -.ant-btn-dashed > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dashed:hover, -.ant-btn-dashed:focus { - color: #40a9ff; - background: #fff; - border-color: #40a9ff; -} -.ant-btn-dashed:hover > a:only-child, -.ant-btn-dashed:focus > a:only-child { - color: currentColor; -} -.ant-btn-dashed:hover > a:only-child::after, -.ant-btn-dashed:focus > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dashed:active { - color: #096dd9; - background: #fff; - border-color: #096dd9; -} -.ant-btn-dashed:active > a:only-child { - color: currentColor; -} -.ant-btn-dashed:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dashed[disabled], -.ant-btn-dashed[disabled]:hover, -.ant-btn-dashed[disabled]:focus, -.ant-btn-dashed[disabled]:active { - color: rgba(0, 0, 0, 0.25); - background: #f5f5f5; - border-color: #d9d9d9; - text-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-dashed[disabled] > a:only-child, -.ant-btn-dashed[disabled]:hover > a:only-child, -.ant-btn-dashed[disabled]:focus > a:only-child, -.ant-btn-dashed[disabled]:active > a:only-child { - color: currentColor; -} -.ant-btn-dashed[disabled] > a:only-child::after, -.ant-btn-dashed[disabled]:hover > a:only-child::after, -.ant-btn-dashed[disabled]:focus > a:only-child::after, -.ant-btn-dashed[disabled]:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-danger { - color: #fff; - background: #ff4d4f; - border-color: #ff4d4f; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12); - -webkit-box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045); - box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045); -} -.ant-btn-danger > a:only-child { - color: currentColor; -} -.ant-btn-danger > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-danger:hover, -.ant-btn-danger:focus { - color: #fff; - background: #ff7875; - border-color: #ff7875; -} -.ant-btn-danger:hover > a:only-child, -.ant-btn-danger:focus > a:only-child { - color: currentColor; -} -.ant-btn-danger:hover > a:only-child::after, -.ant-btn-danger:focus > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-danger:active { - color: #fff; - background: #d9363e; - border-color: #d9363e; -} -.ant-btn-danger:active > a:only-child { - color: currentColor; -} -.ant-btn-danger:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-danger[disabled], -.ant-btn-danger[disabled]:hover, -.ant-btn-danger[disabled]:focus, -.ant-btn-danger[disabled]:active { - color: rgba(0, 0, 0, 0.25); - background: #f5f5f5; - border-color: #d9d9d9; - text-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-danger[disabled] > a:only-child, -.ant-btn-danger[disabled]:hover > a:only-child, -.ant-btn-danger[disabled]:focus > a:only-child, -.ant-btn-danger[disabled]:active > a:only-child { - color: currentColor; -} -.ant-btn-danger[disabled] > a:only-child::after, -.ant-btn-danger[disabled]:hover > a:only-child::after, -.ant-btn-danger[disabled]:focus > a:only-child::after, -.ant-btn-danger[disabled]:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-link { - color: #1890ff; - background: transparent; - border-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-link > a:only-child { - color: currentColor; -} -.ant-btn-link > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-link:hover, -.ant-btn-link:focus { - color: #40a9ff; - background: transparent; - border-color: #40a9ff; -} -.ant-btn-link:hover > a:only-child, -.ant-btn-link:focus > a:only-child { - color: currentColor; -} -.ant-btn-link:hover > a:only-child::after, -.ant-btn-link:focus > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-link:active { - color: #096dd9; - background: transparent; - border-color: #096dd9; -} -.ant-btn-link:active > a:only-child { - color: currentColor; -} -.ant-btn-link:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-link[disabled], -.ant-btn-link[disabled]:hover, -.ant-btn-link[disabled]:focus, -.ant-btn-link[disabled]:active { - color: rgba(0, 0, 0, 0.25); - background: #f5f5f5; - border-color: #d9d9d9; - text-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-link[disabled] > a:only-child, -.ant-btn-link[disabled]:hover > a:only-child, -.ant-btn-link[disabled]:focus > a:only-child, -.ant-btn-link[disabled]:active > a:only-child { - color: currentColor; -} -.ant-btn-link[disabled] > a:only-child::after, -.ant-btn-link[disabled]:hover > a:only-child::after, -.ant-btn-link[disabled]:focus > a:only-child::after, -.ant-btn-link[disabled]:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-link:hover { - background: transparent; -} -.ant-btn-link:hover, -.ant-btn-link:focus, -.ant-btn-link:active { - border-color: transparent; -} -.ant-btn-link[disabled], -.ant-btn-link[disabled]:hover, -.ant-btn-link[disabled]:focus, -.ant-btn-link[disabled]:active { - color: rgba(0, 0, 0, 0.25); - background: transparent; - border-color: transparent; - text-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-link[disabled] > a:only-child, -.ant-btn-link[disabled]:hover > a:only-child, -.ant-btn-link[disabled]:focus > a:only-child, -.ant-btn-link[disabled]:active > a:only-child { - color: currentColor; -} -.ant-btn-link[disabled] > a:only-child::after, -.ant-btn-link[disabled]:hover > a:only-child::after, -.ant-btn-link[disabled]:focus > a:only-child::after, -.ant-btn-link[disabled]:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-text { - color: rgba(0, 0, 0, 0.65); - background: transparent; - border-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-text > a:only-child { - color: currentColor; -} -.ant-btn-text > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-text:hover, -.ant-btn-text:focus { - color: #40a9ff; - background: transparent; - border-color: #40a9ff; -} -.ant-btn-text:hover > a:only-child, -.ant-btn-text:focus > a:only-child { - color: currentColor; -} -.ant-btn-text:hover > a:only-child::after, -.ant-btn-text:focus > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-text:active { - color: #096dd9; - background: transparent; - border-color: #096dd9; -} -.ant-btn-text:active > a:only-child { - color: currentColor; -} -.ant-btn-text:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-text[disabled], -.ant-btn-text[disabled]:hover, -.ant-btn-text[disabled]:focus, -.ant-btn-text[disabled]:active { - color: rgba(0, 0, 0, 0.25); - background: #f5f5f5; - border-color: #d9d9d9; - text-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-text[disabled] > a:only-child, -.ant-btn-text[disabled]:hover > a:only-child, -.ant-btn-text[disabled]:focus > a:only-child, -.ant-btn-text[disabled]:active > a:only-child { - color: currentColor; -} -.ant-btn-text[disabled] > a:only-child::after, -.ant-btn-text[disabled]:hover > a:only-child::after, -.ant-btn-text[disabled]:focus > a:only-child::after, -.ant-btn-text[disabled]:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-text:hover, -.ant-btn-text:focus { - color: rgba(0, 0, 0, 0.65); - background: rgba(0, 0, 0, 0.018); - border-color: transparent; -} -.ant-btn-text:active { - color: rgba(0, 0, 0, 0.65); - background: rgba(0, 0, 0, 0.028); - border-color: transparent; -} -.ant-btn-text[disabled], -.ant-btn-text[disabled]:hover, -.ant-btn-text[disabled]:focus, -.ant-btn-text[disabled]:active { - color: rgba(0, 0, 0, 0.25); - background: transparent; - border-color: transparent; - text-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-text[disabled] > a:only-child, -.ant-btn-text[disabled]:hover > a:only-child, -.ant-btn-text[disabled]:focus > a:only-child, -.ant-btn-text[disabled]:active > a:only-child { - color: currentColor; -} -.ant-btn-text[disabled] > a:only-child::after, -.ant-btn-text[disabled]:hover > a:only-child::after, -.ant-btn-text[disabled]:focus > a:only-child::after, -.ant-btn-text[disabled]:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous { - color: #ff4d4f; - background: #fff; - border-color: #ff4d4f; -} -.ant-btn-dangerous > a:only-child { - color: currentColor; -} -.ant-btn-dangerous > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous:hover, -.ant-btn-dangerous:focus { - color: #ff7875; - background: #fff; - border-color: #ff7875; -} -.ant-btn-dangerous:hover > a:only-child, -.ant-btn-dangerous:focus > a:only-child { - color: currentColor; -} -.ant-btn-dangerous:hover > a:only-child::after, -.ant-btn-dangerous:focus > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous:active { - color: #d9363e; - background: #fff; - border-color: #d9363e; -} -.ant-btn-dangerous:active > a:only-child { - color: currentColor; -} -.ant-btn-dangerous:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous[disabled], -.ant-btn-dangerous[disabled]:hover, -.ant-btn-dangerous[disabled]:focus, -.ant-btn-dangerous[disabled]:active { - color: rgba(0, 0, 0, 0.25); - background: #f5f5f5; - border-color: #d9d9d9; - text-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-dangerous[disabled] > a:only-child, -.ant-btn-dangerous[disabled]:hover > a:only-child, -.ant-btn-dangerous[disabled]:focus > a:only-child, -.ant-btn-dangerous[disabled]:active > a:only-child { - color: currentColor; -} -.ant-btn-dangerous[disabled] > a:only-child::after, -.ant-btn-dangerous[disabled]:hover > a:only-child::after, -.ant-btn-dangerous[disabled]:focus > a:only-child::after, -.ant-btn-dangerous[disabled]:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous.ant-btn-primary { - color: #fff; - background: #ff4d4f; - border-color: #ff4d4f; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12); - -webkit-box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045); - box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045); -} -.ant-btn-dangerous.ant-btn-primary > a:only-child { - color: currentColor; -} -.ant-btn-dangerous.ant-btn-primary > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous.ant-btn-primary:hover, -.ant-btn-dangerous.ant-btn-primary:focus { - color: #fff; - background: #ff7875; - border-color: #ff7875; -} -.ant-btn-dangerous.ant-btn-primary:hover > a:only-child, -.ant-btn-dangerous.ant-btn-primary:focus > a:only-child { - color: currentColor; -} -.ant-btn-dangerous.ant-btn-primary:hover > a:only-child::after, -.ant-btn-dangerous.ant-btn-primary:focus > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous.ant-btn-primary:active { - color: #fff; - background: #d9363e; - border-color: #d9363e; -} -.ant-btn-dangerous.ant-btn-primary:active > a:only-child { - color: currentColor; -} -.ant-btn-dangerous.ant-btn-primary:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous.ant-btn-primary[disabled], -.ant-btn-dangerous.ant-btn-primary[disabled]:hover, -.ant-btn-dangerous.ant-btn-primary[disabled]:focus, -.ant-btn-dangerous.ant-btn-primary[disabled]:active { - color: rgba(0, 0, 0, 0.25); - background: #f5f5f5; - border-color: #d9d9d9; - text-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-dangerous.ant-btn-primary[disabled] > a:only-child, -.ant-btn-dangerous.ant-btn-primary[disabled]:hover > a:only-child, -.ant-btn-dangerous.ant-btn-primary[disabled]:focus > a:only-child, -.ant-btn-dangerous.ant-btn-primary[disabled]:active > a:only-child { - color: currentColor; -} -.ant-btn-dangerous.ant-btn-primary[disabled] > a:only-child::after, -.ant-btn-dangerous.ant-btn-primary[disabled]:hover > a:only-child::after, -.ant-btn-dangerous.ant-btn-primary[disabled]:focus > a:only-child::after, -.ant-btn-dangerous.ant-btn-primary[disabled]:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous.ant-btn-link { - color: #ff4d4f; - background: transparent; - border-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-dangerous.ant-btn-link > a:only-child { - color: currentColor; -} -.ant-btn-dangerous.ant-btn-link > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous.ant-btn-link:hover, -.ant-btn-dangerous.ant-btn-link:focus { - color: #40a9ff; - background: transparent; - border-color: #40a9ff; -} -.ant-btn-dangerous.ant-btn-link:hover > a:only-child, -.ant-btn-dangerous.ant-btn-link:focus > a:only-child { - color: currentColor; -} -.ant-btn-dangerous.ant-btn-link:hover > a:only-child::after, -.ant-btn-dangerous.ant-btn-link:focus > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous.ant-btn-link:active { - color: #096dd9; - background: transparent; - border-color: #096dd9; -} -.ant-btn-dangerous.ant-btn-link:active > a:only-child { - color: currentColor; -} -.ant-btn-dangerous.ant-btn-link:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous.ant-btn-link[disabled], -.ant-btn-dangerous.ant-btn-link[disabled]:hover, -.ant-btn-dangerous.ant-btn-link[disabled]:focus, -.ant-btn-dangerous.ant-btn-link[disabled]:active { - color: rgba(0, 0, 0, 0.25); - background: #f5f5f5; - border-color: #d9d9d9; - text-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-dangerous.ant-btn-link[disabled] > a:only-child, -.ant-btn-dangerous.ant-btn-link[disabled]:hover > a:only-child, -.ant-btn-dangerous.ant-btn-link[disabled]:focus > a:only-child, -.ant-btn-dangerous.ant-btn-link[disabled]:active > a:only-child { - color: currentColor; -} -.ant-btn-dangerous.ant-btn-link[disabled] > a:only-child::after, -.ant-btn-dangerous.ant-btn-link[disabled]:hover > a:only-child::after, -.ant-btn-dangerous.ant-btn-link[disabled]:focus > a:only-child::after, -.ant-btn-dangerous.ant-btn-link[disabled]:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous.ant-btn-link:hover, -.ant-btn-dangerous.ant-btn-link:focus { - color: #ff7875; - background: transparent; - border-color: transparent; -} -.ant-btn-dangerous.ant-btn-link:hover > a:only-child, -.ant-btn-dangerous.ant-btn-link:focus > a:only-child { - color: currentColor; -} -.ant-btn-dangerous.ant-btn-link:hover > a:only-child::after, -.ant-btn-dangerous.ant-btn-link:focus > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous.ant-btn-link:active { - color: #d9363e; - background: transparent; - border-color: transparent; -} -.ant-btn-dangerous.ant-btn-link:active > a:only-child { - color: currentColor; -} -.ant-btn-dangerous.ant-btn-link:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous.ant-btn-link[disabled], -.ant-btn-dangerous.ant-btn-link[disabled]:hover, -.ant-btn-dangerous.ant-btn-link[disabled]:focus, -.ant-btn-dangerous.ant-btn-link[disabled]:active { - color: rgba(0, 0, 0, 0.25); - background: transparent; - border-color: transparent; - text-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-dangerous.ant-btn-link[disabled] > a:only-child, -.ant-btn-dangerous.ant-btn-link[disabled]:hover > a:only-child, -.ant-btn-dangerous.ant-btn-link[disabled]:focus > a:only-child, -.ant-btn-dangerous.ant-btn-link[disabled]:active > a:only-child { - color: currentColor; -} -.ant-btn-dangerous.ant-btn-link[disabled] > a:only-child::after, -.ant-btn-dangerous.ant-btn-link[disabled]:hover > a:only-child::after, -.ant-btn-dangerous.ant-btn-link[disabled]:focus > a:only-child::after, -.ant-btn-dangerous.ant-btn-link[disabled]:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous.ant-btn-text { - color: #ff4d4f; - background: transparent; - border-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-dangerous.ant-btn-text > a:only-child { - color: currentColor; -} -.ant-btn-dangerous.ant-btn-text > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous.ant-btn-text:hover, -.ant-btn-dangerous.ant-btn-text:focus { - color: #40a9ff; - background: transparent; - border-color: #40a9ff; -} -.ant-btn-dangerous.ant-btn-text:hover > a:only-child, -.ant-btn-dangerous.ant-btn-text:focus > a:only-child { - color: currentColor; -} -.ant-btn-dangerous.ant-btn-text:hover > a:only-child::after, -.ant-btn-dangerous.ant-btn-text:focus > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous.ant-btn-text:active { - color: #096dd9; - background: transparent; - border-color: #096dd9; -} -.ant-btn-dangerous.ant-btn-text:active > a:only-child { - color: currentColor; -} -.ant-btn-dangerous.ant-btn-text:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous.ant-btn-text[disabled], -.ant-btn-dangerous.ant-btn-text[disabled]:hover, -.ant-btn-dangerous.ant-btn-text[disabled]:focus, -.ant-btn-dangerous.ant-btn-text[disabled]:active { - color: rgba(0, 0, 0, 0.25); - background: #f5f5f5; - border-color: #d9d9d9; - text-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-dangerous.ant-btn-text[disabled] > a:only-child, -.ant-btn-dangerous.ant-btn-text[disabled]:hover > a:only-child, -.ant-btn-dangerous.ant-btn-text[disabled]:focus > a:only-child, -.ant-btn-dangerous.ant-btn-text[disabled]:active > a:only-child { - color: currentColor; -} -.ant-btn-dangerous.ant-btn-text[disabled] > a:only-child::after, -.ant-btn-dangerous.ant-btn-text[disabled]:hover > a:only-child::after, -.ant-btn-dangerous.ant-btn-text[disabled]:focus > a:only-child::after, -.ant-btn-dangerous.ant-btn-text[disabled]:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous.ant-btn-text:hover, -.ant-btn-dangerous.ant-btn-text:focus { - color: #ff7875; - background: rgba(0, 0, 0, 0.018); - border-color: transparent; -} -.ant-btn-dangerous.ant-btn-text:hover > a:only-child, -.ant-btn-dangerous.ant-btn-text:focus > a:only-child { - color: currentColor; -} -.ant-btn-dangerous.ant-btn-text:hover > a:only-child::after, -.ant-btn-dangerous.ant-btn-text:focus > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous.ant-btn-text:active { - color: #d9363e; - background: rgba(0, 0, 0, 0.028); - border-color: transparent; -} -.ant-btn-dangerous.ant-btn-text:active > a:only-child { - color: currentColor; -} -.ant-btn-dangerous.ant-btn-text:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-dangerous.ant-btn-text[disabled], -.ant-btn-dangerous.ant-btn-text[disabled]:hover, -.ant-btn-dangerous.ant-btn-text[disabled]:focus, -.ant-btn-dangerous.ant-btn-text[disabled]:active { - color: rgba(0, 0, 0, 0.25); - background: transparent; - border-color: transparent; - text-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-dangerous.ant-btn-text[disabled] > a:only-child, -.ant-btn-dangerous.ant-btn-text[disabled]:hover > a:only-child, -.ant-btn-dangerous.ant-btn-text[disabled]:focus > a:only-child, -.ant-btn-dangerous.ant-btn-text[disabled]:active > a:only-child { - color: currentColor; -} -.ant-btn-dangerous.ant-btn-text[disabled] > a:only-child::after, -.ant-btn-dangerous.ant-btn-text[disabled]:hover > a:only-child::after, -.ant-btn-dangerous.ant-btn-text[disabled]:focus > a:only-child::after, -.ant-btn-dangerous.ant-btn-text[disabled]:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-icon-only { - width: 32px; - height: 32px; - padding: 2.4px 0; - font-size: 16px; - border-radius: 2px; - vertical-align: -0.5px; -} -.ant-btn-icon-only > * { - font-size: 16px; -} -.ant-btn-icon-only.ant-btn-lg { - width: 40px; - height: 40px; - padding: 4.9px 0; - font-size: 18px; - border-radius: 2px; -} -.ant-btn-icon-only.ant-btn-lg > * { - font-size: 18px; -} -.ant-btn-icon-only.ant-btn-sm { - width: 24px; - height: 24px; - padding: 0px 0; - font-size: 14px; - border-radius: 2px; -} -.ant-btn-icon-only.ant-btn-sm > * { - font-size: 14px; -} -.ant-btn-round { - height: 32px; - padding: 4px 16px; - font-size: 14px; - border-radius: 32px; -} -.ant-btn-round.ant-btn-lg { - height: 40px; - padding: 6.4px 20px; - font-size: 16px; - border-radius: 40px; -} -.ant-btn-round.ant-btn-sm { - height: 24px; - padding: 0px 12px; - font-size: 14px; - border-radius: 24px; -} -.ant-btn-round.ant-btn-icon-only { - width: auto; -} -.ant-btn-circle, -.ant-btn-circle-outline { - min-width: 32px; - padding-right: 0; - padding-left: 0; - text-align: center; - border-radius: 50%; -} -.ant-btn-circle.ant-btn-lg, -.ant-btn-circle-outline.ant-btn-lg { - min-width: 40px; - border-radius: 50%; -} -.ant-btn-circle.ant-btn-sm, -.ant-btn-circle-outline.ant-btn-sm { - min-width: 24px; - border-radius: 50%; -} -.ant-btn::before { - position: absolute; - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; - z-index: 1; - display: none; - background: #fff; - border-radius: inherit; - opacity: 0.35; - -webkit-transition: opacity 0.2s; - transition: opacity 0.2s; - content: ''; - pointer-events: none; -} -.ant-btn .anticon { - -webkit-transition: margin-left 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: margin-left 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); -} -.ant-btn .anticon.anticon-plus > svg, -.ant-btn .anticon.anticon-minus > svg { - shape-rendering: optimizeSpeed; -} -.ant-btn.ant-btn-loading { - position: relative; -} -.ant-btn.ant-btn-loading:not([disabled]) { - pointer-events: none; -} -.ant-btn.ant-btn-loading::before { - display: block; -} -.ant-btn > .ant-btn-loading-icon { - -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); -} -.ant-btn > .ant-btn-loading-icon .anticon { - padding-right: 8px; -} -.ant-btn > .ant-btn-loading-icon:only-child .anticon { - padding-right: 0; -} -.ant-btn-group { - position: relative; - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; -} -.ant-btn-group > .ant-btn, -.ant-btn-group > span > .ant-btn { - position: relative; -} -.ant-btn-group > .ant-btn:hover, -.ant-btn-group > span > .ant-btn:hover, -.ant-btn-group > .ant-btn:focus, -.ant-btn-group > span > .ant-btn:focus, -.ant-btn-group > .ant-btn:active, -.ant-btn-group > span > .ant-btn:active { - z-index: 2; -} -.ant-btn-group > .ant-btn[disabled], -.ant-btn-group > span > .ant-btn[disabled] { - z-index: 0; -} -.ant-btn-group .ant-btn-icon-only { - font-size: 14px; -} -.ant-btn-group-lg > .ant-btn, -.ant-btn-group-lg > span > .ant-btn { - height: 40px; - padding: 6.4px 15px; - font-size: 16px; - border-radius: 0; -} -.ant-btn-group-lg .ant-btn.ant-btn-icon-only { - width: 40px; - height: 40px; - padding-right: 0; - padding-left: 0; -} -.ant-btn-group-sm > .ant-btn, -.ant-btn-group-sm > span > .ant-btn { - height: 24px; - padding: 0px 7px; - font-size: 14px; - border-radius: 0; -} -.ant-btn-group-sm > .ant-btn > .anticon, -.ant-btn-group-sm > span > .ant-btn > .anticon { - font-size: 14px; -} -.ant-btn-group-sm .ant-btn.ant-btn-icon-only { - width: 24px; - height: 24px; - padding-right: 0; - padding-left: 0; -} -.ant-btn-group .ant-btn + .ant-btn, -.ant-btn + .ant-btn-group, -.ant-btn-group span + .ant-btn, -.ant-btn-group .ant-btn + span, -.ant-btn-group > span + span, -.ant-btn-group + .ant-btn, -.ant-btn-group + .ant-btn-group { - margin-left: -1px; -} -.ant-btn-group .ant-btn-primary + .ant-btn:not(.ant-btn-primary):not([disabled]) { - border-left-color: transparent; -} -.ant-btn-group .ant-btn { - border-radius: 0; -} -.ant-btn-group > .ant-btn:first-child, -.ant-btn-group > span:first-child > .ant-btn { - margin-left: 0; -} -.ant-btn-group > .ant-btn:only-child { - border-radius: 2px; -} -.ant-btn-group > span:only-child > .ant-btn { - border-radius: 2px; -} -.ant-btn-group > .ant-btn:first-child:not(:last-child), -.ant-btn-group > span:first-child:not(:last-child) > .ant-btn { - border-top-left-radius: 2px; - border-bottom-left-radius: 2px; -} -.ant-btn-group > .ant-btn:last-child:not(:first-child), -.ant-btn-group > span:last-child:not(:first-child) > .ant-btn { - border-top-right-radius: 2px; - border-bottom-right-radius: 2px; -} -.ant-btn-group-sm > .ant-btn:only-child { - border-radius: 2px; -} -.ant-btn-group-sm > span:only-child > .ant-btn { - border-radius: 2px; -} -.ant-btn-group-sm > .ant-btn:first-child:not(:last-child), -.ant-btn-group-sm > span:first-child:not(:last-child) > .ant-btn { - border-top-left-radius: 2px; - border-bottom-left-radius: 2px; -} -.ant-btn-group-sm > .ant-btn:last-child:not(:first-child), -.ant-btn-group-sm > span:last-child:not(:first-child) > .ant-btn { - border-top-right-radius: 2px; - border-bottom-right-radius: 2px; -} -.ant-btn-group > .ant-btn-group { - float: left; -} -.ant-btn-group > .ant-btn-group:not(:first-child):not(:last-child) > .ant-btn { - border-radius: 0; -} -.ant-btn-group > .ant-btn-group:first-child:not(:last-child) > .ant-btn:last-child { - padding-right: 8px; - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.ant-btn-group > .ant-btn-group:last-child:not(:first-child) > .ant-btn:first-child { - padding-left: 8px; - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.ant-btn-rtl.ant-btn-group .ant-btn + .ant-btn, -.ant-btn-rtl.ant-btn + .ant-btn-group, -.ant-btn-rtl.ant-btn-group span + .ant-btn, -.ant-btn-rtl.ant-btn-group .ant-btn + span, -.ant-btn-rtl.ant-btn-group > span + span, -.ant-btn-rtl.ant-btn-group + .ant-btn, -.ant-btn-rtl.ant-btn-group + .ant-btn-group, -.ant-btn-group-rtl.ant-btn-group .ant-btn + .ant-btn, -.ant-btn-group-rtl.ant-btn + .ant-btn-group, -.ant-btn-group-rtl.ant-btn-group span + .ant-btn, -.ant-btn-group-rtl.ant-btn-group .ant-btn + span, -.ant-btn-group-rtl.ant-btn-group > span + span, -.ant-btn-group-rtl.ant-btn-group + .ant-btn, -.ant-btn-group-rtl.ant-btn-group + .ant-btn-group { - margin-right: -1px; - margin-left: auto; -} -.ant-btn-group.ant-btn-group-rtl { - direction: rtl; -} -.ant-btn-group-rtl.ant-btn-group > .ant-btn:first-child:not(:last-child), -.ant-btn-group-rtl.ant-btn-group > span:first-child:not(:last-child) > .ant-btn { - border-top-left-radius: 0; - border-top-right-radius: 2px; - border-bottom-right-radius: 2px; - border-bottom-left-radius: 0; -} -.ant-btn-group-rtl.ant-btn-group > .ant-btn:last-child:not(:first-child), -.ant-btn-group-rtl.ant-btn-group > span:last-child:not(:first-child) > .ant-btn { - border-top-left-radius: 2px; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 2px; -} -.ant-btn-group-rtl.ant-btn-group-sm > .ant-btn:first-child:not(:last-child), -.ant-btn-group-rtl.ant-btn-group-sm > span:first-child:not(:last-child) > .ant-btn { - border-top-left-radius: 0; - border-top-right-radius: 2px; - border-bottom-right-radius: 2px; - border-bottom-left-radius: 0; -} -.ant-btn-group-rtl.ant-btn-group-sm > .ant-btn:last-child:not(:first-child), -.ant-btn-group-rtl.ant-btn-group-sm > span:last-child:not(:first-child) > .ant-btn { - border-top-left-radius: 2px; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 2px; -} -.ant-btn:focus > span, -.ant-btn:active > span { - position: relative; -} -.ant-btn > .anticon + span, -.ant-btn > span + .anticon { - margin-left: 8px; -} -.ant-btn-background-ghost { - color: #fff; - background: transparent !important; - border-color: #fff; -} -.ant-btn-background-ghost.ant-btn-primary { - color: #1890ff; - background: transparent; - border-color: #1890ff; - text-shadow: none; -} -.ant-btn-background-ghost.ant-btn-primary > a:only-child { - color: currentColor; -} -.ant-btn-background-ghost.ant-btn-primary > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-background-ghost.ant-btn-primary:hover, -.ant-btn-background-ghost.ant-btn-primary:focus { - color: #40a9ff; - background: transparent; - border-color: #40a9ff; -} -.ant-btn-background-ghost.ant-btn-primary:hover > a:only-child, -.ant-btn-background-ghost.ant-btn-primary:focus > a:only-child { - color: currentColor; -} -.ant-btn-background-ghost.ant-btn-primary:hover > a:only-child::after, -.ant-btn-background-ghost.ant-btn-primary:focus > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-background-ghost.ant-btn-primary:active { - color: #096dd9; - background: transparent; - border-color: #096dd9; -} -.ant-btn-background-ghost.ant-btn-primary:active > a:only-child { - color: currentColor; -} -.ant-btn-background-ghost.ant-btn-primary:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-background-ghost.ant-btn-primary[disabled], -.ant-btn-background-ghost.ant-btn-primary[disabled]:hover, -.ant-btn-background-ghost.ant-btn-primary[disabled]:focus, -.ant-btn-background-ghost.ant-btn-primary[disabled]:active { - color: rgba(0, 0, 0, 0.25); - background: #f5f5f5; - border-color: #d9d9d9; - text-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-background-ghost.ant-btn-primary[disabled] > a:only-child, -.ant-btn-background-ghost.ant-btn-primary[disabled]:hover > a:only-child, -.ant-btn-background-ghost.ant-btn-primary[disabled]:focus > a:only-child, -.ant-btn-background-ghost.ant-btn-primary[disabled]:active > a:only-child { - color: currentColor; -} -.ant-btn-background-ghost.ant-btn-primary[disabled] > a:only-child::after, -.ant-btn-background-ghost.ant-btn-primary[disabled]:hover > a:only-child::after, -.ant-btn-background-ghost.ant-btn-primary[disabled]:focus > a:only-child::after, -.ant-btn-background-ghost.ant-btn-primary[disabled]:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-background-ghost.ant-btn-danger { - color: #ff4d4f; - background: transparent; - border-color: #ff4d4f; - text-shadow: none; -} -.ant-btn-background-ghost.ant-btn-danger > a:only-child { - color: currentColor; -} -.ant-btn-background-ghost.ant-btn-danger > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-background-ghost.ant-btn-danger:hover, -.ant-btn-background-ghost.ant-btn-danger:focus { - color: #ff7875; - background: transparent; - border-color: #ff7875; -} -.ant-btn-background-ghost.ant-btn-danger:hover > a:only-child, -.ant-btn-background-ghost.ant-btn-danger:focus > a:only-child { - color: currentColor; -} -.ant-btn-background-ghost.ant-btn-danger:hover > a:only-child::after, -.ant-btn-background-ghost.ant-btn-danger:focus > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-background-ghost.ant-btn-danger:active { - color: #d9363e; - background: transparent; - border-color: #d9363e; -} -.ant-btn-background-ghost.ant-btn-danger:active > a:only-child { - color: currentColor; -} -.ant-btn-background-ghost.ant-btn-danger:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-background-ghost.ant-btn-danger[disabled], -.ant-btn-background-ghost.ant-btn-danger[disabled]:hover, -.ant-btn-background-ghost.ant-btn-danger[disabled]:focus, -.ant-btn-background-ghost.ant-btn-danger[disabled]:active { - color: rgba(0, 0, 0, 0.25); - background: #f5f5f5; - border-color: #d9d9d9; - text-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-background-ghost.ant-btn-danger[disabled] > a:only-child, -.ant-btn-background-ghost.ant-btn-danger[disabled]:hover > a:only-child, -.ant-btn-background-ghost.ant-btn-danger[disabled]:focus > a:only-child, -.ant-btn-background-ghost.ant-btn-danger[disabled]:active > a:only-child { - color: currentColor; -} -.ant-btn-background-ghost.ant-btn-danger[disabled] > a:only-child::after, -.ant-btn-background-ghost.ant-btn-danger[disabled]:hover > a:only-child::after, -.ant-btn-background-ghost.ant-btn-danger[disabled]:focus > a:only-child::after, -.ant-btn-background-ghost.ant-btn-danger[disabled]:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-background-ghost.ant-btn-dangerous { - color: #ff4d4f; - background: transparent; - border-color: #ff4d4f; - text-shadow: none; -} -.ant-btn-background-ghost.ant-btn-dangerous > a:only-child { - color: currentColor; -} -.ant-btn-background-ghost.ant-btn-dangerous > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-background-ghost.ant-btn-dangerous:hover, -.ant-btn-background-ghost.ant-btn-dangerous:focus { - color: #ff7875; - background: transparent; - border-color: #ff7875; -} -.ant-btn-background-ghost.ant-btn-dangerous:hover > a:only-child, -.ant-btn-background-ghost.ant-btn-dangerous:focus > a:only-child { - color: currentColor; -} -.ant-btn-background-ghost.ant-btn-dangerous:hover > a:only-child::after, -.ant-btn-background-ghost.ant-btn-dangerous:focus > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-background-ghost.ant-btn-dangerous:active { - color: #d9363e; - background: transparent; - border-color: #d9363e; -} -.ant-btn-background-ghost.ant-btn-dangerous:active > a:only-child { - color: currentColor; -} -.ant-btn-background-ghost.ant-btn-dangerous:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-background-ghost.ant-btn-dangerous[disabled], -.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover, -.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus, -.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active { - color: rgba(0, 0, 0, 0.25); - background: #f5f5f5; - border-color: #d9d9d9; - text-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-background-ghost.ant-btn-dangerous[disabled] > a:only-child, -.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover > a:only-child, -.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus > a:only-child, -.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active > a:only-child { - color: currentColor; -} -.ant-btn-background-ghost.ant-btn-dangerous[disabled] > a:only-child::after, -.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover > a:only-child::after, -.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus > a:only-child::after, -.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link { - color: #ff4d4f; - background: transparent; - border-color: transparent; - text-shadow: none; -} -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link > a:only-child { - color: currentColor; -} -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover, -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus { - color: #ff7875; - background: transparent; - border-color: transparent; -} -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover > a:only-child, -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus > a:only-child { - color: currentColor; -} -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover > a:only-child::after, -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active { - color: #d9363e; - background: transparent; - border-color: transparent; -} -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active > a:only-child { - color: currentColor; -} -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled], -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover, -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus, -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active { - color: rgba(0, 0, 0, 0.25); - background: #f5f5f5; - border-color: #d9d9d9; - text-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled] > a:only-child, -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover > a:only-child, -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus > a:only-child, -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active > a:only-child { - color: currentColor; -} -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled] > a:only-child::after, -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover > a:only-child::after, -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus > a:only-child::after, -.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active > a:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - content: ''; -} -.ant-btn-two-chinese-chars::first-letter { - letter-spacing: 0.34em; -} -.ant-btn-two-chinese-chars > *:not(.anticon) { - margin-right: -0.34em; - letter-spacing: 0.34em; -} -.ant-btn-block { - width: 100%; -} -.ant-btn:empty { - display: inline-block; - width: 0; - visibility: hidden; - content: '\a0'; -} -a.ant-btn { - padding-top: 0.1px; - line-height: 30px; -} -a.ant-btn-lg { - line-height: 38px; -} -a.ant-btn-sm { - line-height: 22px; -} -.ant-btn-rtl { - direction: rtl; -} -.ant-btn-group-rtl.ant-btn-group .ant-btn-primary:last-child:not(:first-child), -.ant-btn-group-rtl.ant-btn-group .ant-btn-primary + .ant-btn-primary { - border-right-color: #40a9ff; - border-left-color: #d9d9d9; -} -.ant-btn-group-rtl.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled], -.ant-btn-group-rtl.ant-btn-group .ant-btn-primary + .ant-btn-primary[disabled] { - border-right-color: #d9d9d9; - border-left-color: #40a9ff; -} -.ant-btn-rtl.ant-btn > .ant-btn-loading-icon .anticon { - padding-right: 0; - padding-left: 8px; -} -.ant-btn > .ant-btn-loading-icon:only-child .anticon { - padding-right: 0; - padding-left: 0; -} -.ant-btn-rtl.ant-btn > .anticon + span, -.ant-btn-rtl.ant-btn > span + .anticon { - margin-right: 8px; - margin-left: 0; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-picker-calendar { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - background: #fff; -} -.ant-picker-calendar-header { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; - padding: 12px 0; -} -.ant-picker-calendar-header .ant-picker-calendar-year-select { - min-width: 80px; -} -.ant-picker-calendar-header .ant-picker-calendar-month-select { - min-width: 70px; - margin-left: 8px; -} -.ant-picker-calendar-header .ant-picker-calendar-mode-switch { - margin-left: 8px; -} -.ant-picker-calendar .ant-picker-panel { - background: #fff; - border: 0; - border-top: 1px solid #f0f0f0; - border-radius: 0; -} -.ant-picker-calendar .ant-picker-panel .ant-picker-month-panel, -.ant-picker-calendar .ant-picker-panel .ant-picker-date-panel { - width: auto; -} -.ant-picker-calendar .ant-picker-panel .ant-picker-body { - padding: 8px 0; -} -.ant-picker-calendar .ant-picker-panel .ant-picker-content { - width: 100%; -} -.ant-picker-calendar-mini { - border-radius: 2px; -} -.ant-picker-calendar-mini .ant-picker-calendar-header { - padding-right: 8px; - padding-left: 8px; -} -.ant-picker-calendar-mini .ant-picker-panel { - border-radius: 0 0 2px 2px; -} -.ant-picker-calendar-mini .ant-picker-content { - height: 256px; -} -.ant-picker-calendar-mini .ant-picker-content th { - height: auto; - padding: 0; - line-height: 18px; -} -.ant-picker-calendar-full .ant-picker-panel { - display: block; - width: 100%; - text-align: right; - background: #fff; - border: 0; -} -.ant-picker-calendar-full .ant-picker-panel .ant-picker-body th, -.ant-picker-calendar-full .ant-picker-panel .ant-picker-body td { - padding: 0; -} -.ant-picker-calendar-full .ant-picker-panel .ant-picker-body th { - height: auto; - padding: 0 12px 5px 0; - line-height: 18px; -} -.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell::before { - display: none; -} -.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell:hover .ant-picker-calendar-date { - background: #f5f5f5; -} -.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell .ant-picker-calendar-date-today::before { - display: none; -} -.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date, -.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date, -.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date-today, -.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date-today { - background: #e6f7ff; -} -.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date .ant-picker-calendar-date-value, -.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date .ant-picker-calendar-date-value, -.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date-today .ant-picker-calendar-date-value, -.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date-today .ant-picker-calendar-date-value { - color: #1890ff; -} -.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date { - display: block; - width: auto; - height: auto; - margin: 0 4px; - padding: 4px 8px 0; - border: 0; - border-top: 2px solid #f0f0f0; - border-radius: 0; - -webkit-transition: background 0.3s; - transition: background 0.3s; -} -.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-value { - line-height: 24px; - -webkit-transition: color 0.3s; - transition: color 0.3s; -} -.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-content { - position: static; - width: auto; - height: 86px; - overflow-y: auto; - color: rgba(0, 0, 0, 0.65); - line-height: 1.5715; - text-align: left; -} -.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today { - border-color: #1890ff; -} -.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today .ant-picker-calendar-date-value { - color: rgba(0, 0, 0, 0.65); -} -@media only screen and (max-width: 480px) { - .ant-picker-calendar-header { - display: block; - } - .ant-picker-calendar-header .ant-picker-calendar-year-select { - width: 50%; - } - .ant-picker-calendar-header .ant-picker-calendar-month-select { - width: calc(50% - 8px); - } - .ant-picker-calendar-header .ant-picker-calendar-mode-switch { - width: 100%; - margin-top: 8px; - margin-left: 0; - } - .ant-picker-calendar-header .ant-picker-calendar-mode-switch > label { - width: 50%; - text-align: center; - } -} -.ant-picker-calendar-rtl { - direction: rtl; -} -.ant-picker-calendar-rtl .ant-picker-calendar-header .ant-picker-calendar-month-select { - margin-right: 8px; - margin-left: 0; -} -.ant-picker-calendar-rtl .ant-picker-calendar-header .ant-picker-calendar-mode-switch { - margin-right: 8px; - margin-left: 0; -} -.ant-picker-calendar-rtl.ant-picker-calendar-full .ant-picker-panel { - text-align: left; -} -.ant-picker-calendar-rtl.ant-picker-calendar-full .ant-picker-panel .ant-picker-body th { - padding: 0 0 5px 12px; -} -.ant-picker-calendar-rtl.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-content { - text-align: right; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-radio-group { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - display: inline-block; - font-size: 0; - line-height: unset; -} -.ant-radio-group .ant-badge-count { - z-index: 1; -} -.ant-radio-group > .ant-badge:not(:first-child) > .ant-radio-button-wrapper { - border-left: none; -} -.ant-radio-wrapper { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - display: inline-block; - margin-right: 8px; - white-space: nowrap; - cursor: pointer; -} -.ant-radio { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - top: 0px; - display: inline-block; - line-height: 1; - white-space: nowrap; - vertical-align: sub; - outline: none; - cursor: pointer; -} -.ant-radio-wrapper:hover .ant-radio, -.ant-radio:hover .ant-radio-inner, -.ant-radio-input:focus + .ant-radio-inner { - border-color: #1890ff; -} -.ant-radio-input:focus + .ant-radio-inner { - -webkit-box-shadow: 0 0 0 3px rgba(24, 144, 255, 0.08); - box-shadow: 0 0 0 3px rgba(24, 144, 255, 0.08); -} -.ant-radio-checked::after { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - border: 1px solid #1890ff; - border-radius: 50%; - visibility: hidden; - -webkit-animation: antRadioEffect 0.36s ease-in-out; - animation: antRadioEffect 0.36s ease-in-out; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - content: ''; -} -.ant-radio:hover::after, -.ant-radio-wrapper:hover .ant-radio::after { - visibility: visible; -} -.ant-radio-inner { - position: relative; - top: 0; - left: 0; - display: block; - width: 16px; - height: 16px; - background-color: #fff; - border-color: #d9d9d9; - border-style: solid; - border-width: 1px; - border-radius: 100px; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-radio-inner::after { - position: absolute; - top: 3px; - left: 3px; - display: table; - width: 8px; - height: 8px; - background-color: #1890ff; - border-top: 0; - border-left: 0; - border-radius: 8px; - -webkit-transform: scale(0); - transform: scale(0); - opacity: 0; - -webkit-transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); - transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); - content: ' '; -} -.ant-radio-input { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - cursor: pointer; - opacity: 0; -} -.ant-radio-checked .ant-radio-inner { - border-color: #1890ff; -} -.ant-radio-checked .ant-radio-inner::after { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - -webkit-transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); - transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); -} -.ant-radio-disabled .ant-radio-inner { - background-color: #f5f5f5; - border-color: #d9d9d9 !important; - cursor: not-allowed; -} -.ant-radio-disabled .ant-radio-inner::after { - background-color: rgba(0, 0, 0, 0.2); -} -.ant-radio-disabled .ant-radio-input { - cursor: not-allowed; -} -.ant-radio-disabled + span { - color: rgba(0, 0, 0, 0.25); - cursor: not-allowed; -} -span.ant-radio + * { - padding-right: 8px; - padding-left: 8px; -} -.ant-radio-button-wrapper { - position: relative; - display: inline-block; - height: 32px; - margin: 0; - padding: 0 15px; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - line-height: 30px; - background: #fff; - border: 1px solid #d9d9d9; - border-top-width: 1.02px; - border-left-width: 0; - cursor: pointer; - -webkit-transition: color 0.3s, background 0.3s, border-color 0.3s, -webkit-box-shadow 0.3s; - transition: color 0.3s, background 0.3s, border-color 0.3s, -webkit-box-shadow 0.3s; - transition: color 0.3s, background 0.3s, border-color 0.3s, box-shadow 0.3s; - transition: color 0.3s, background 0.3s, border-color 0.3s, box-shadow 0.3s, -webkit-box-shadow 0.3s; -} -.ant-radio-button-wrapper a { - color: rgba(0, 0, 0, 0.65); -} -.ant-radio-button-wrapper > .ant-radio-button { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; -} -.ant-radio-group-large .ant-radio-button-wrapper { - height: 40px; - font-size: 16px; - line-height: 38px; -} -.ant-radio-group-small .ant-radio-button-wrapper { - height: 24px; - padding: 0 7px; - line-height: 22px; -} -.ant-radio-button-wrapper:not(:first-child)::before { - position: absolute; - top: -1px; - left: -1px; - display: block; - -webkit-box-sizing: content-box; - box-sizing: content-box; - width: 1px; - height: 100%; - padding: 1px 0; - background-color: #d9d9d9; - -webkit-transition: background-color 0.3s; - transition: background-color 0.3s; - content: ''; -} -.ant-radio-button-wrapper:first-child { - border-left: 1px solid #d9d9d9; - border-radius: 2px 0 0 2px; -} -.ant-radio-button-wrapper:last-child { - border-radius: 0 2px 2px 0; -} -.ant-radio-button-wrapper:first-child:last-child { - border-radius: 2px; -} -.ant-radio-button-wrapper:hover { - position: relative; - color: #1890ff; -} -.ant-radio-button-wrapper:focus-within { - -webkit-box-shadow: 0 0 0 3px rgba(24, 144, 255, 0.08); - box-shadow: 0 0 0 3px rgba(24, 144, 255, 0.08); -} -.ant-radio-button-wrapper .ant-radio-inner, -.ant-radio-button-wrapper input[type='checkbox'], -.ant-radio-button-wrapper input[type='radio'] { - width: 0; - height: 0; - opacity: 0; - pointer-events: none; -} -.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) { - z-index: 1; - color: #1890ff; - background: #fff; - border-color: #1890ff; -} -.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled)::before { - background-color: #1890ff; -} -.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):first-child { - border-color: #1890ff; -} -.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover { - color: #40a9ff; - border-color: #40a9ff; -} -.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover::before { - background-color: #40a9ff; -} -.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active { - color: #096dd9; - border-color: #096dd9; -} -.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active::before { - background-color: #096dd9; -} -.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):focus-within { - -webkit-box-shadow: 0 0 0 3px rgba(24, 144, 255, 0.08); - box-shadow: 0 0 0 3px rgba(24, 144, 255, 0.08); -} -.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) { - color: #fff; - background: #1890ff; - border-color: #1890ff; -} -.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover { - color: #fff; - background: #40a9ff; - border-color: #40a9ff; -} -.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active { - color: #fff; - background: #096dd9; - border-color: #096dd9; -} -.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):focus-within { - -webkit-box-shadow: 0 0 0 3px rgba(24, 144, 255, 0.08); - box-shadow: 0 0 0 3px rgba(24, 144, 255, 0.08); -} -.ant-radio-button-wrapper-disabled { - color: rgba(0, 0, 0, 0.25); - background-color: #f5f5f5; - border-color: #d9d9d9; - cursor: not-allowed; -} -.ant-radio-button-wrapper-disabled:first-child, -.ant-radio-button-wrapper-disabled:hover { - color: rgba(0, 0, 0, 0.25); - background-color: #f5f5f5; - border-color: #d9d9d9; -} -.ant-radio-button-wrapper-disabled:first-child { - border-left-color: #d9d9d9; -} -.ant-radio-button-wrapper-disabled.ant-radio-button-wrapper-checked { - color: #fff; - background-color: #e6e6e6; - border-color: #d9d9d9; - -webkit-box-shadow: none; - box-shadow: none; -} -@-webkit-keyframes antRadioEffect { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 0.5; - } - 100% { - -webkit-transform: scale(1.6); - transform: scale(1.6); - opacity: 0; - } -} -@keyframes antRadioEffect { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 0.5; - } - 100% { - -webkit-transform: scale(1.6); - transform: scale(1.6); - opacity: 0; - } -} -@supports (-moz-appearance: meterbar) and (background-blend-mode: difference, normal) { - .ant-radio { - vertical-align: text-bottom; - } -} -.ant-radio-group.ant-radio-group-rtl { - direction: rtl; -} -.ant-radio-wrapper.ant-radio-wrapper-rtl { - margin-right: 0; - margin-left: 8px; - direction: rtl; -} -.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl { - border-right-width: 0; - border-left-width: 1px; -} -.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:not(:first-child)::before { - right: -1px; - left: 0; -} -.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:first-child { - border-right: 1px solid #d9d9d9; - border-radius: 0 2px 2px 0; -} -.ant-radio-button-wrapper-checked:not([class*=' ant-radio-button-wrapper-disabled']).ant-radio-button-wrapper:first-child { - border-right-color: #40a9ff; -} -.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:last-child { - border-radius: 2px 0 0 2px; -} -.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper-disabled:first-child { - border-right-color: #d9d9d9; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-picker-panel { - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - text-align: center; - background: #fff; - border: 1px solid #f0f0f0; - border-radius: 2px; - outline: none; -} -.ant-picker-panel-focused { - border-color: #1890ff; -} -.ant-picker-decade-panel, -.ant-picker-year-panel, -.ant-picker-quarter-panel, -.ant-picker-month-panel, -.ant-picker-week-panel, -.ant-picker-date-panel, -.ant-picker-time-panel { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - width: 280px; -} -.ant-picker-header { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - padding: 0 8px; - color: rgba(0, 0, 0, 0.85); - border-bottom: 1px solid #f0f0f0; -} -.ant-picker-header > * { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; -} -.ant-picker-header button { - padding: 0; - color: rgba(0, 0, 0, 0.25); - line-height: 40px; - background: transparent; - border: 0; - cursor: pointer; - -webkit-transition: color 0.3s; - transition: color 0.3s; -} -.ant-picker-header > button { - min-width: 1.6em; - font-size: 14px; -} -.ant-picker-header > button:hover { - color: rgba(0, 0, 0, 0.65); -} -.ant-picker-header-view { - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; - font-weight: 500; - line-height: 40px; -} -.ant-picker-header-view button { - color: inherit; - font-weight: inherit; -} -.ant-picker-header-view button:not(:first-child) { - margin-left: 8px; -} -.ant-picker-header-view button:hover { - color: #1890ff; -} -.ant-picker-prev-icon, -.ant-picker-next-icon, -.ant-picker-super-prev-icon, -.ant-picker-super-next-icon { - position: relative; - display: inline-block; - width: 7px; - height: 7px; -} -.ant-picker-prev-icon::before, -.ant-picker-next-icon::before, -.ant-picker-super-prev-icon::before, -.ant-picker-super-next-icon::before { - position: absolute; - top: 0; - left: 0; - display: inline-block; - width: 7px; - height: 7px; - border: 0 solid currentColor; - border-width: 1.5px 0 0 1.5px; - content: ''; -} -.ant-picker-super-prev-icon::after, -.ant-picker-super-next-icon::after { - position: absolute; - top: 4px; - left: 4px; - display: inline-block; - width: 7px; - height: 7px; - border: 0 solid currentColor; - border-width: 1.5px 0 0 1.5px; - content: ''; -} -.ant-picker-prev-icon, -.ant-picker-super-prev-icon { - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); -} -.ant-picker-next-icon, -.ant-picker-super-next-icon { - -webkit-transform: rotate(135deg); - transform: rotate(135deg); -} -.ant-picker-content { - width: 100%; - table-layout: fixed; - border-collapse: collapse; -} -.ant-picker-content th, -.ant-picker-content td { - position: relative; - min-width: 24px; - font-weight: 400; -} -.ant-picker-content th { - height: 30px; - color: rgba(0, 0, 0, 0.65); - line-height: 30px; -} -.ant-picker-cell { - padding: 3px 0; - color: rgba(0, 0, 0, 0.25); - cursor: pointer; -} -.ant-picker-cell-in-view { - color: rgba(0, 0, 0, 0.65); -} -.ant-picker-cell-disabled { - cursor: not-allowed; -} -.ant-picker-cell::before { - position: absolute; - top: 50%; - right: 0; - left: 0; - z-index: 1; - height: 24px; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); - content: ''; -} -.ant-picker-cell .ant-picker-cell-inner { - position: relative; - z-index: 2; - display: inline-block; - min-width: 24px; - height: 24px; - line-height: 24px; - border-radius: 2px; - -webkit-transition: background 0.3s, border 0.3s; - transition: background 0.3s, border 0.3s; -} -.ant-picker-cell:hover:not(.ant-picker-cell-in-view) .ant-picker-cell-inner, -.ant-picker-cell:hover:not(.ant-picker-cell-selected):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end):not(.ant-picker-cell-range-hover-start):not(.ant-picker-cell-range-hover-end) .ant-picker-cell-inner { - background: #f5f5f5; -} -.ant-picker-cell-in-view.ant-picker-cell-today .ant-picker-cell-inner::before { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - border: 1px solid #1890ff; - border-radius: 2px; - content: ''; -} -.ant-picker-cell-in-view.ant-picker-cell-in-range { - position: relative; -} -.ant-picker-cell-in-view.ant-picker-cell-in-range::before { - background: #e6f7ff; -} -.ant-picker-cell-in-view.ant-picker-cell-selected .ant-picker-cell-inner, -.ant-picker-cell-in-view.ant-picker-cell-range-start .ant-picker-cell-inner, -.ant-picker-cell-in-view.ant-picker-cell-range-end .ant-picker-cell-inner { - color: #fff; - background: #1890ff; -} -.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single)::before, -.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single)::before { - background: #e6f7ff; -} -.ant-picker-cell-in-view.ant-picker-cell-range-start::before { - left: 50%; -} -.ant-picker-cell-in-view.ant-picker-cell-range-end::before { - right: 50%; -} -.ant-picker-cell-in-view.ant-picker-cell-range-hover-start:not(.ant-picker-cell-in-range):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end)::after, -.ant-picker-cell-in-view.ant-picker-cell-range-hover-end:not(.ant-picker-cell-in-range):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end)::after, -.ant-picker-cell-in-view.ant-picker-cell-range-hover-start.ant-picker-cell-range-start-single::after, -.ant-picker-cell-in-view.ant-picker-cell-range-hover-end.ant-picker-cell-range-end-single::after, -.ant-picker-cell-in-view.ant-picker-cell-range-hover:not(.ant-picker-cell-in-range)::after { - position: absolute; - top: 50%; - z-index: 0; - height: 24px; - border-top: 1px dashed #7ec1ff; - border-bottom: 1px dashed #7ec1ff; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); - content: ''; -} -.ant-picker-cell-range-hover-start::after, -.ant-picker-cell-range-hover-end::after, -.ant-picker-cell-range-hover::after { - right: 0; - left: 2px; -} -.ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover::before, -.ant-picker-cell-in-view.ant-picker-cell-range-start.ant-picker-cell-range-hover::before, -.ant-picker-cell-in-view.ant-picker-cell-range-end.ant-picker-cell-range-hover::before, -.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single).ant-picker-cell-range-hover-start::before, -.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single).ant-picker-cell-range-hover-end::before, -.ant-picker-panel > :not(.ant-picker-date-panel) .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start::before, -.ant-picker-panel > :not(.ant-picker-date-panel) .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end::before { - background: #cbe6ff; -} -.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single):not(.ant-picker-cell-range-end) .ant-picker-cell-inner { - border-radius: 2px 0 0 2px; -} -.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single):not(.ant-picker-cell-range-start) .ant-picker-cell-inner { - border-radius: 0 2px 2px 0; -} -.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner::after, -.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner::after { - position: absolute; - top: 0; - bottom: 0; - z-index: -1; - background: #cbe6ff; - content: ''; -} -.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner::after { - right: -7px; - left: 0; -} -.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner::after { - right: 0; - left: -7px; -} -.ant-picker-cell-range-hover.ant-picker-cell-range-start::after { - right: 50%; -} -.ant-picker-cell-range-hover.ant-picker-cell-range-end::after { - left: 50%; -} -tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover:first-child::after, -tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-end:first-child::after, -.ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover-edge-start-near-range)::after, -.ant-picker-cell-in-view.ant-picker-cell-range-hover-start::after { - left: 6px; - border-left: 1px dashed #7ec1ff; - border-top-left-radius: 2px; - border-bottom-left-radius: 2px; -} -tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover:last-child::after, -tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::after, -.ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-end:not(.ant-picker-cell-range-hover-edge-end-near-range)::after, -.ant-picker-cell-in-view.ant-picker-cell-range-hover-end::after { - right: 6px; - border-right: 1px dashed #7ec1ff; - border-top-right-radius: 2px; - border-bottom-right-radius: 2px; -} -.ant-picker-cell-disabled { - pointer-events: none; -} -.ant-picker-cell-disabled .ant-picker-cell-inner { - color: rgba(0, 0, 0, 0.25); - background: transparent; -} -.ant-picker-cell-disabled::before { - background: #f5f5f5; -} -.ant-picker-cell-disabled.ant-picker-cell-today .ant-picker-cell-inner::before { - border-color: rgba(0, 0, 0, 0.25); -} -.ant-picker-decade-panel .ant-picker-content, -.ant-picker-year-panel .ant-picker-content, -.ant-picker-quarter-panel .ant-picker-content, -.ant-picker-month-panel .ant-picker-content { - height: 264px; -} -.ant-picker-decade-panel .ant-picker-cell-inner, -.ant-picker-year-panel .ant-picker-cell-inner, -.ant-picker-quarter-panel .ant-picker-cell-inner, -.ant-picker-month-panel .ant-picker-cell-inner { - padding: 0 8px; -} -.ant-picker-decade-panel .ant-picker-cell-disabled .ant-picker-cell-inner, -.ant-picker-year-panel .ant-picker-cell-disabled .ant-picker-cell-inner, -.ant-picker-quarter-panel .ant-picker-cell-disabled .ant-picker-cell-inner, -.ant-picker-month-panel .ant-picker-cell-disabled .ant-picker-cell-inner { - background: #f5f5f5; -} -.ant-picker-quarter-panel .ant-picker-content { - height: 56px; -} -.ant-picker-footer { - width: -webkit-min-content; - width: -moz-min-content; - width: min-content; - min-width: 100%; - line-height: 38px; - text-align: center; - border-bottom: 1px solid transparent; -} -.ant-picker-panel .ant-picker-footer { - border-top: 1px solid #f0f0f0; -} -.ant-picker-footer-extra { - padding: 0 12px; - line-height: 38px; - text-align: left; -} -.ant-picker-footer-extra:not(:last-child) { - border-bottom: 1px solid #f0f0f0; -} -.ant-picker-now { - text-align: left; -} -.ant-picker-today-btn { - color: #1890ff; -} -.ant-picker-today-btn:hover { - color: #40a9ff; -} -.ant-picker-today-btn:active { - color: #096dd9; -} -.ant-picker-today-btn.ant-picker-today-btn-disabled { - color: rgba(0, 0, 0, 0.25); - cursor: not-allowed; -} -.ant-picker-decade-panel .ant-picker-cell-inner { - padding: 0 4px; -} -.ant-picker-decade-panel .ant-picker-cell::before { - display: none; -} -.ant-picker-year-panel .ant-picker-body, -.ant-picker-quarter-panel .ant-picker-body, -.ant-picker-month-panel .ant-picker-body { - padding: 0 8px; -} -.ant-picker-year-panel .ant-picker-cell-inner, -.ant-picker-quarter-panel .ant-picker-cell-inner, -.ant-picker-month-panel .ant-picker-cell-inner { - width: 60px; -} -.ant-picker-year-panel .ant-picker-cell-range-hover-start::after, -.ant-picker-quarter-panel .ant-picker-cell-range-hover-start::after, -.ant-picker-month-panel .ant-picker-cell-range-hover-start::after { - left: 14px; - border-left: 1px dashed #7ec1ff; - border-radius: 2px 0 0 2px; -} -.ant-picker-panel-rtl .ant-picker-year-panel .ant-picker-cell-range-hover-start::after, -.ant-picker-panel-rtl .ant-picker-quarter-panel .ant-picker-cell-range-hover-start::after, -.ant-picker-panel-rtl .ant-picker-month-panel .ant-picker-cell-range-hover-start::after { - right: 14px; - border-right: 1px dashed #7ec1ff; - border-radius: 0 2px 2px 0; -} -.ant-picker-year-panel .ant-picker-cell-range-hover-end::after, -.ant-picker-quarter-panel .ant-picker-cell-range-hover-end::after, -.ant-picker-month-panel .ant-picker-cell-range-hover-end::after { - right: 14px; - border-right: 1px dashed #7ec1ff; - border-radius: 0 2px 2px 0; -} -.ant-picker-panel-rtl .ant-picker-year-panel .ant-picker-cell-range-hover-end::after, -.ant-picker-panel-rtl .ant-picker-quarter-panel .ant-picker-cell-range-hover-end::after, -.ant-picker-panel-rtl .ant-picker-month-panel .ant-picker-cell-range-hover-end::after { - left: 14px; - border-left: 1px dashed #7ec1ff; - border-radius: 2px 0 0 2px; -} -.ant-picker-week-panel .ant-picker-body { - padding: 8px 12px; -} -.ant-picker-week-panel .ant-picker-cell:hover .ant-picker-cell-inner, -.ant-picker-week-panel .ant-picker-cell-selected .ant-picker-cell-inner, -.ant-picker-week-panel .ant-picker-cell .ant-picker-cell-inner { - background: transparent !important; -} -.ant-picker-week-panel-row td { - -webkit-transition: background 0.3s; - transition: background 0.3s; -} -.ant-picker-week-panel-row:hover td { - background: #f5f5f5; -} -.ant-picker-week-panel-row-selected td, -.ant-picker-week-panel-row-selected:hover td { - background: #1890ff; -} -.ant-picker-week-panel-row-selected td.ant-picker-cell-week, -.ant-picker-week-panel-row-selected:hover td.ant-picker-cell-week { - color: rgba(255, 255, 255, 0.5); -} -.ant-picker-week-panel-row-selected td.ant-picker-cell-today .ant-picker-cell-inner::before, -.ant-picker-week-panel-row-selected:hover td.ant-picker-cell-today .ant-picker-cell-inner::before { - border-color: #fff; -} -.ant-picker-week-panel-row-selected td .ant-picker-cell-inner, -.ant-picker-week-panel-row-selected:hover td .ant-picker-cell-inner { - color: #fff; -} -.ant-picker-date-panel .ant-picker-body { - padding: 8px 12px; -} -.ant-picker-date-panel .ant-picker-content { - width: 252px; -} -.ant-picker-date-panel .ant-picker-content th { - width: 36px; -} -.ant-picker-datetime-panel { - display: -webkit-box; - display: -ms-flexbox; - display: flex; -} -.ant-picker-datetime-panel .ant-picker-time-panel { - border-left: 1px solid #f0f0f0; -} -.ant-picker-datetime-panel .ant-picker-date-panel, -.ant-picker-datetime-panel .ant-picker-time-panel { - -webkit-transition: opacity 0.3s; - transition: opacity 0.3s; -} -.ant-picker-datetime-panel-active .ant-picker-date-panel, -.ant-picker-datetime-panel-active .ant-picker-time-panel { - opacity: 0.3; -} -.ant-picker-datetime-panel-active .ant-picker-date-panel-active, -.ant-picker-datetime-panel-active .ant-picker-time-panel-active { - opacity: 1; -} -.ant-picker-time-panel { - width: auto; - min-width: auto; -} -.ant-picker-time-panel .ant-picker-content { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; - height: 224px; -} -.ant-picker-time-panel-column { - -webkit-box-flex: 1; - -ms-flex: 1 0 auto; - flex: 1 0 auto; - width: 56px; - margin: 0; - padding: 0; - overflow-y: hidden; - text-align: left; - list-style: none; - -webkit-transition: background 0.3s; - transition: background 0.3s; -} -.ant-picker-time-panel-column::after { - display: block; - height: 196px; - content: ''; -} -.ant-picker-datetime-panel .ant-picker-time-panel-column::after { - height: 198px; -} -.ant-picker-time-panel-column:not(:first-child) { - border-left: 1px solid #f0f0f0; -} -.ant-picker-time-panel-column-active { - background: rgba(230, 247, 255, 0.2); -} -.ant-picker-time-panel-column:hover { - overflow-y: auto; -} -.ant-picker-time-panel-column > li { - margin: 0; - padding: 0; -} -.ant-picker-time-panel-column > li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner { - display: block; - width: 100%; - height: 28px; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - line-height: 28px; - text-align: center; - border-radius: 0; - cursor: pointer; - -webkit-transition: background 0.3s; - transition: background 0.3s; -} -.ant-picker-time-panel-column > li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner:hover { - background: #f5f5f5; -} -.ant-picker-time-panel-column > li.ant-picker-time-panel-cell-selected .ant-picker-time-panel-cell-inner { - background: #e6f7ff; -} -.ant-picker-time-panel-column > li.ant-picker-time-panel-cell-disabled .ant-picker-time-panel-cell-inner { - color: rgba(0, 0, 0, 0.25); - background: transparent; - cursor: not-allowed; -} -/* stylelint-disable-next-line */ -_:-ms-fullscreen .ant-picker-range-wrapper .ant-picker-month-panel .ant-picker-cell, -:root .ant-picker-range-wrapper .ant-picker-month-panel .ant-picker-cell, -_:-ms-fullscreen .ant-picker-range-wrapper .ant-picker-year-panel .ant-picker-cell, -:root .ant-picker-range-wrapper .ant-picker-year-panel .ant-picker-cell { - padding: 21px 0; -} -.ant-picker { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - padding: 4px 11px 4px; - position: relative; - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - background: #fff; - border: 1px solid #d9d9d9; - border-radius: 2px; - -webkit-transition: border 0.3s, -webkit-box-shadow 0.3s; - transition: border 0.3s, -webkit-box-shadow 0.3s; - transition: border 0.3s, box-shadow 0.3s; - transition: border 0.3s, box-shadow 0.3s, -webkit-box-shadow 0.3s; -} -.ant-picker:hover, -.ant-picker-focused { - border-color: #40a9ff; - border-right-width: 1px !important; -} -.ant-picker-focused { - border-color: #40a9ff; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); - box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); -} -.ant-picker.ant-picker-disabled { - background: #f5f5f5; - border-color: #d9d9d9; - cursor: not-allowed; -} -.ant-picker.ant-picker-disabled .ant-picker-suffix { - color: rgba(0, 0, 0, 0.25); -} -.ant-picker.ant-picker-borderless { - background-color: transparent !important; - border-color: transparent !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; -} -.ant-picker-input { - position: relative; - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - width: 100%; -} -.ant-picker-input > input { - position: relative; - display: inline-block; - width: 100%; - min-width: 0; - padding: 4px 11px; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - line-height: 1.5715; - background-color: #fff; - background-image: none; - border: 1px solid #d9d9d9; - border-radius: 2px; - -webkit-transition: all 0.3s; - transition: all 0.3s; - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; - min-width: 1px; - height: auto; - padding: 0; - background: transparent; - border: 0; -} -.ant-picker-input > input::-moz-placeholder { - opacity: 1; -} -.ant-picker-input > input::-webkit-input-placeholder { - color: #bfbfbf; -} -.ant-picker-input > input:-ms-input-placeholder { - color: #bfbfbf; -} -.ant-picker-input > input::-ms-input-placeholder { - color: #bfbfbf; -} -.ant-picker-input > input::placeholder { - color: #bfbfbf; -} -.ant-picker-input > input:-moz-placeholder-shown { - text-overflow: ellipsis; -} -.ant-picker-input > input:-ms-input-placeholder { - text-overflow: ellipsis; -} -.ant-picker-input > input:placeholder-shown { - text-overflow: ellipsis; -} -.ant-picker-input > input:hover { - border-color: #40a9ff; - border-right-width: 1px !important; -} -.ant-picker-input > input:focus, -.ant-picker-input > input-focused { - border-color: #40a9ff; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); - box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); -} -.ant-picker-input > input-disabled { - color: rgba(0, 0, 0, 0.25); - background-color: #f5f5f5; - cursor: not-allowed; - opacity: 1; -} -.ant-picker-input > input-disabled:hover { - border-color: #d9d9d9; - border-right-width: 1px !important; -} -.ant-picker-input > input[disabled] { - color: rgba(0, 0, 0, 0.25); - background-color: #f5f5f5; - cursor: not-allowed; - opacity: 1; -} -.ant-picker-input > input[disabled]:hover { - border-color: #d9d9d9; - border-right-width: 1px !important; -} -textarea.ant-picker-input > input { - max-width: 100%; - height: auto; - min-height: 32px; - line-height: 1.5715; - vertical-align: bottom; - -webkit-transition: all 0.3s, height 0s; - transition: all 0.3s, height 0s; -} -.ant-picker-input > input-lg { - padding: 6.5px 11px; - font-size: 16px; -} -.ant-picker-input > input-sm { - padding: 0px 7px; -} -.ant-picker-input > input:focus { - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-picker-input > input[disabled] { - background: transparent; -} -.ant-picker-input:hover .ant-picker-clear { - opacity: 1; -} -.ant-picker-large { - padding: 6.5px 11px 6.5px; -} -.ant-picker-large .ant-picker-input > input { - font-size: 16px; -} -.ant-picker-small { - padding: 0px 7px 0px; -} -.ant-picker-suffix { - -ms-flex-item-align: center; - align-self: center; - margin-left: 4px; - color: rgba(0, 0, 0, 0.25); - line-height: 1; - pointer-events: none; -} -.ant-picker-suffix > * { - vertical-align: top; -} -.ant-picker-clear { - position: absolute; - top: 50%; - right: 0; - color: rgba(0, 0, 0, 0.25); - line-height: 1; - background: #fff; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); - cursor: pointer; - opacity: 0; - -webkit-transition: opacity 0.3s, color 0.3s; - transition: opacity 0.3s, color 0.3s; -} -.ant-picker-clear > * { - vertical-align: top; -} -.ant-picker-clear:hover { - color: rgba(0, 0, 0, 0.45); -} -.ant-picker-separator { - position: relative; - display: inline-block; - width: 1em; - height: 16px; - color: rgba(0, 0, 0, 0.25); - font-size: 16px; - vertical-align: top; - cursor: default; -} -.ant-picker-focused .ant-picker-separator { - color: rgba(0, 0, 0, 0.45); -} -.ant-picker-disabled .ant-picker-range-separator .ant-picker-separator { - cursor: not-allowed; -} -.ant-picker-range { - position: relative; - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; -} -.ant-picker-range .ant-picker-clear { - right: 11px; -} -.ant-picker-range:hover .ant-picker-clear { - opacity: 1; -} -.ant-picker-range .ant-picker-active-bar { - bottom: -1px; - height: 2px; - margin-left: 11px; - background: #1890ff; - opacity: 0; - -webkit-transition: all 0.3s ease-out; - transition: all 0.3s ease-out; - pointer-events: none; -} -.ant-picker-range.ant-picker-focused .ant-picker-active-bar { - opacity: 1; -} -.ant-picker-range-separator { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - padding: 0 8px; - line-height: 1; -} -.ant-picker-range.ant-picker-small .ant-picker-clear { - right: 7px; -} -.ant-picker-dropdown { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: absolute; - z-index: 1050; -} -.ant-picker-dropdown-hidden { - display: none; -} -.ant-picker-dropdown-placement-bottomLeft .ant-picker-range-arrow { - top: 1.66666667px; - display: block; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); -} -.ant-picker-dropdown-placement-topLeft .ant-picker-range-arrow { - bottom: 1.66666667px; - display: block; - -webkit-transform: rotate(135deg); - transform: rotate(135deg); -} -.ant-picker-dropdown-range { - padding: 6.66666667px 0; -} -.ant-picker-dropdown-range-hidden { - display: none; -} -.ant-picker-dropdown .ant-picker-panel > .ant-picker-time-panel { - padding-top: 4px; -} -.ant-picker-ranges { - margin-bottom: 0; - padding: 4px 12px; - overflow: hidden; - line-height: 34px; - text-align: left; - list-style: none; -} -.ant-picker-ranges > li { - display: inline-block; -} -.ant-picker-ranges .ant-picker-preset > .ant-tag-blue { - color: #1890ff; - background: #e6f7ff; - border-color: #91d5ff; - cursor: pointer; -} -.ant-picker-ranges .ant-picker-ok { - float: right; - margin-left: 8px; -} -.ant-picker-range-wrapper { - display: -webkit-box; - display: -ms-flexbox; - display: flex; -} -.ant-picker-range-arrow { - position: absolute; - z-index: 1; - display: none; - width: 10px; - height: 10px; - margin-left: 16.5px; - -webkit-box-shadow: 2px -2px 6px rgba(0, 0, 0, 0.06); - box-shadow: 2px -2px 6px rgba(0, 0, 0, 0.06); - -webkit-transition: left 0.3s ease-out; - transition: left 0.3s ease-out; -} -.ant-picker-range-arrow::after { - position: absolute; - top: 1px; - right: 1px; - width: 10px; - height: 10px; - border: 5px solid #f0f0f0; - border-color: #fff #fff transparent transparent; - content: ''; -} -.ant-picker-panel-container { - overflow: hidden; - vertical-align: top; - background: #fff; - border-radius: 2px; - -webkit-box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - -webkit-transition: margin 0.3s; - transition: margin 0.3s; -} -.ant-picker-panel-container .ant-picker-panels { - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - direction: ltr; -} -.ant-picker-panel-container .ant-picker-panel { - vertical-align: top; - background: transparent; - border-width: 0 0 1px 0; - border-radius: 0; -} -.ant-picker-panel-container .ant-picker-panel-focused { - border-color: #f0f0f0; -} -.ant-picker-rtl { - direction: rtl; -} -.ant-picker-rtl .ant-picker-suffix { - margin-right: 4px; - margin-left: 0; -} -.ant-picker-rtl .ant-picker-clear { - right: auto; - left: 0; -} -.ant-picker-rtl .ant-picker-separator { - -webkit-transform: rotate(180deg); - transform: rotate(180deg); -} -.ant-picker-panel-rtl .ant-picker-header-view button:not(:first-child) { - margin-right: 8px; - margin-left: 0; -} -.ant-picker-rtl.ant-picker-range .ant-picker-clear { - right: auto; - left: 11px; -} -.ant-picker-rtl.ant-picker-range .ant-picker-active-bar { - margin-right: 11px; - margin-left: 0; -} -.ant-picker-dropdown-rtl .ant-picker-ranges { - text-align: right; -} -.ant-picker-dropdown-rtl .ant-picker-ranges .ant-picker-ok { - float: left; - margin-right: 8px; - margin-left: 0; -} -.ant-picker-panel-rtl { - direction: rtl; -} -.ant-picker-panel-rtl .ant-picker-prev-icon, -.ant-picker-panel-rtl .ant-picker-super-prev-icon { - -webkit-transform: rotate(135deg); - transform: rotate(135deg); -} -.ant-picker-panel-rtl .ant-picker-next-icon, -.ant-picker-panel-rtl .ant-picker-super-next-icon { - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); -} -.ant-picker-cell .ant-picker-cell-inner { - position: relative; - z-index: 2; - display: inline-block; - min-width: 24px; - height: 24px; - line-height: 24px; - border-radius: 2px; - -webkit-transition: background 0.3s, border 0.3s; - transition: background 0.3s, border 0.3s; -} -.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-start::before { - right: 50%; - left: 0; -} -.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-end::before { - right: 0; - left: 50%; -} -.ant-picker-panel-rtl .ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner::after { - right: 0; - left: -7px; -} -.ant-picker-panel-rtl .ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner::after { - right: -7px; - left: 0; -} -.ant-picker-panel-rtl .ant-picker-cell-range-hover.ant-picker-cell-range-start::after { - right: 0; - left: 50%; -} -.ant-picker-panel-rtl .ant-picker-cell-range-hover.ant-picker-cell-range-end::after { - right: 50%; - left: 0; -} -.ant-picker-panel-rtl tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover:first-child::after, -.ant-picker-panel-rtl tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-end:first-child::after, -.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover-edge-start-near-range)::after, -.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-start::after { - right: 6px; - left: 0; - border-right: 1px dashed #7ec1ff; - border-left: none; - border-top-left-radius: 0; - border-top-right-radius: 2px; - border-bottom-right-radius: 2px; - border-bottom-left-radius: 0; -} -.ant-picker-panel-rtl tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover:last-child::after, -.ant-picker-panel-rtl tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::after, -.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-end:not(.ant-picker-cell-range-hover-edge-end-near-range)::after, -.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-end::after { - right: 0; - left: 6px; - border-right: none; - border-left: 1px dashed #7ec1ff; - border-top-left-radius: 2px; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 2px; -} -.ant-picker-panel-rtl tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::after, -.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-start.ant-picker-cell-in-view.ant-picker-cell-range-hover-end::after { - right: 6px; - border-right: 1px dashed #7ec1ff; - border-top-right-radius: 2px; - border-bottom-right-radius: 2px; -} -.ant-picker-panel-rtl tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-end:first-child::after { - left: 6px; - border-left: 1px dashed #7ec1ff; - border-top-left-radius: 2px; - border-bottom-left-radius: 2px; -} -.ant-picker-panel-rtl .ant-picker-time-panel { - direction: ltr; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-tag { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - display: inline-block; - height: auto; - margin-right: 8px; - padding: 0 7px; - font-size: 12px; - line-height: 20px; - white-space: nowrap; - background: #fafafa; - border: 1px solid #d9d9d9; - border-radius: 2px; - cursor: default; - opacity: 1; - -webkit-transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); - transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); -} -.ant-tag:hover { - opacity: 0.85; -} -.ant-tag, -.ant-tag a, -.ant-tag a:hover { - color: rgba(0, 0, 0, 0.65); -} -.ant-tag > a:first-child:last-child { - display: inline-block; - margin: 0 -8px; - padding: 0 8px; -} -.ant-tag-close-icon { - display: inline-block; - font-size: 10px; - margin-left: 3px; - color: rgba(0, 0, 0, 0.45); - cursor: pointer; - -webkit-transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); - transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); -} -.ant-tag-close-icon:hover { - color: rgba(0, 0, 0, 0.85); -} -.ant-tag-has-color { - border-color: transparent; -} -.ant-tag-has-color, -.ant-tag-has-color a, -.ant-tag-has-color a:hover, -.ant-tag-has-color .anticon-close, -.ant-tag-has-color .anticon-close:hover { - color: #fff; -} -.ant-tag-checkable { - background-color: transparent; - border-color: transparent; - cursor: pointer; -} -.ant-tag-checkable:not(.ant-tag-checkable-checked):hover { - color: #1890ff; -} -.ant-tag-checkable:active, -.ant-tag-checkable-checked { - color: #fff; -} -.ant-tag-checkable-checked { - background-color: #1890ff; -} -.ant-tag-checkable:active { - background-color: #096dd9; -} -.ant-tag-hidden { - display: none; -} -.ant-tag-pink { - color: #eb2f96; - background: #fff0f6; - border-color: #ffadd2; -} -.ant-tag-pink-inverse { - color: #fff; - background: #eb2f96; - border-color: #eb2f96; -} -.ant-tag-magenta { - color: #eb2f96; - background: #fff0f6; - border-color: #ffadd2; -} -.ant-tag-magenta-inverse { - color: #fff; - background: #eb2f96; - border-color: #eb2f96; -} -.ant-tag-red { - color: #f5222d; - background: #fff1f0; - border-color: #ffa39e; -} -.ant-tag-red-inverse { - color: #fff; - background: #f5222d; - border-color: #f5222d; -} -.ant-tag-volcano { - color: #fa541c; - background: #fff2e8; - border-color: #ffbb96; -} -.ant-tag-volcano-inverse { - color: #fff; - background: #fa541c; - border-color: #fa541c; -} -.ant-tag-orange { - color: #fa8c16; - background: #fff7e6; - border-color: #ffd591; -} -.ant-tag-orange-inverse { - color: #fff; - background: #fa8c16; - border-color: #fa8c16; -} -.ant-tag-yellow { - color: #fadb14; - background: #feffe6; - border-color: #fffb8f; -} -.ant-tag-yellow-inverse { - color: #fff; - background: #fadb14; - border-color: #fadb14; -} -.ant-tag-gold { - color: #faad14; - background: #fffbe6; - border-color: #ffe58f; -} -.ant-tag-gold-inverse { - color: #fff; - background: #faad14; - border-color: #faad14; -} -.ant-tag-cyan { - color: #13c2c2; - background: #e6fffb; - border-color: #87e8de; -} -.ant-tag-cyan-inverse { - color: #fff; - background: #13c2c2; - border-color: #13c2c2; -} -.ant-tag-lime { - color: #a0d911; - background: #fcffe6; - border-color: #eaff8f; -} -.ant-tag-lime-inverse { - color: #fff; - background: #a0d911; - border-color: #a0d911; -} -.ant-tag-green { - color: #52c41a; - background: #f6ffed; - border-color: #b7eb8f; -} -.ant-tag-green-inverse { - color: #fff; - background: #52c41a; - border-color: #52c41a; -} -.ant-tag-blue { - color: #1890ff; - background: #e6f7ff; - border-color: #91d5ff; -} -.ant-tag-blue-inverse { - color: #fff; - background: #1890ff; - border-color: #1890ff; -} -.ant-tag-geekblue { - color: #2f54eb; - background: #f0f5ff; - border-color: #adc6ff; -} -.ant-tag-geekblue-inverse { - color: #fff; - background: #2f54eb; - border-color: #2f54eb; -} -.ant-tag-purple { - color: #722ed1; - background: #f9f0ff; - border-color: #d3adf7; -} -.ant-tag-purple-inverse { - color: #fff; - background: #722ed1; - border-color: #722ed1; -} -.ant-tag-success { - color: #52c41a; - background: #f6ffed; - border-color: #b7eb8f; -} -.ant-tag-processing { - color: #1890ff; - background: #e6f7ff; - border-color: #91d5ff; -} -.ant-tag-error { - color: #f5222d; - background: #fff1f0; - border-color: #ffa39e; -} -.ant-tag-warning { - color: #fa8c16; - background: #fff7e6; - border-color: #ffd591; -} -.ant-tag > .anticon + span, -.ant-tag > span + .anticon { - margin-left: 7px; -} -.ant-tag-rtl { - margin-right: 0; - margin-left: 8px; - direction: rtl; - text-align: right; -} -.ant-tag-rtl .ant-tag-close-icon { - margin-right: 3px; - margin-left: 0; -} -.ant-tag-rtl.ant-tag > .anticon + span, -.ant-tag-rtl.ant-tag > span + .anticon { - margin-right: 7px; - margin-left: 0; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-card { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - background: #fff; - border-radius: 2px; -} -.ant-card-rtl { - direction: rtl; -} -.ant-card-hoverable { - cursor: pointer; - -webkit-transition: border-color 0.3s, -webkit-box-shadow 0.3s; - transition: border-color 0.3s, -webkit-box-shadow 0.3s; - transition: box-shadow 0.3s, border-color 0.3s; - transition: box-shadow 0.3s, border-color 0.3s, -webkit-box-shadow 0.3s; -} -.ant-card-hoverable:hover { - border-color: transparent; - -webkit-box-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), 0 3px 6px 0 rgba(0, 0, 0, 0.12), 0 5px 12px 4px rgba(0, 0, 0, 0.09); - box-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), 0 3px 6px 0 rgba(0, 0, 0, 0.12), 0 5px 12px 4px rgba(0, 0, 0, 0.09); -} -.ant-card-bordered { - border: 1px solid #f0f0f0; -} -.ant-card-head { - min-height: 48px; - margin-bottom: -1px; - padding: 0 24px; - color: rgba(0, 0, 0, 0.85); - font-weight: 500; - font-size: 16px; - background: transparent; - border-bottom: 1px solid #f0f0f0; - border-radius: 2px 2px 0 0; -} -.ant-card-head::before { - display: table; - content: ''; -} -.ant-card-head::after { - display: table; - clear: both; - content: ''; -} -.ant-card-head-wrapper { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} -.ant-card-head-title { - display: inline-block; - -webkit-box-flex: 1; - -ms-flex: 1; - flex: 1; - padding: 16px 0; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} -.ant-card-head .ant-tabs { - clear: both; - margin-bottom: -17px; - color: rgba(0, 0, 0, 0.65); - font-weight: normal; - font-size: 14px; -} -.ant-card-head .ant-tabs-bar { - border-bottom: 1px solid #f0f0f0; -} -.ant-card-extra { - float: right; - margin-left: auto; - padding: 16px 0; - color: rgba(0, 0, 0, 0.65); - font-weight: normal; - font-size: 14px; -} -.ant-card-rtl .ant-card-extra { - margin-right: auto; - margin-left: 0; -} -.ant-card-body { - padding: 24px; -} -.ant-card-body::before { - display: table; - content: ''; -} -.ant-card-body::after { - display: table; - clear: both; - content: ''; -} -.ant-card-contain-grid:not(.ant-card-loading) .ant-card-body { - margin: -1px 0 0 -1px; - padding: 0; -} -.ant-card-grid { - float: left; - width: 33.33%; - padding: 24px; - border: 0; - border-radius: 0; - -webkit-box-shadow: 1px 0 0 0 #f0f0f0, 0 1px 0 0 #f0f0f0, 1px 1px 0 0 #f0f0f0, 1px 0 0 0 #f0f0f0 inset, 0 1px 0 0 #f0f0f0 inset; - box-shadow: 1px 0 0 0 #f0f0f0, 0 1px 0 0 #f0f0f0, 1px 1px 0 0 #f0f0f0, 1px 0 0 0 #f0f0f0 inset, 0 1px 0 0 #f0f0f0 inset; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-card-rtl .ant-card-grid { - float: right; -} -.ant-card-grid-hoverable:hover { - position: relative; - z-index: 1; - -webkit-box-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), 0 3px 6px 0 rgba(0, 0, 0, 0.12), 0 5px 12px 4px rgba(0, 0, 0, 0.09); - box-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), 0 3px 6px 0 rgba(0, 0, 0, 0.12), 0 5px 12px 4px rgba(0, 0, 0, 0.09); -} -.ant-card-contain-tabs > .ant-card-head .ant-card-head-title { - min-height: 32px; - padding-bottom: 0; -} -.ant-card-contain-tabs > .ant-card-head .ant-card-extra { - padding-bottom: 0; -} -.ant-card-bordered .ant-card-cover { - margin-right: -1px; - margin-left: -1px; -} -.ant-card-cover > * { - display: block; - width: 100%; -} -.ant-card-cover img { - border-radius: 2px 2px 0 0; -} -.ant-card-actions { - margin: 0; - padding: 0; - list-style: none; - background: #fafafa; - border-top: 1px solid #f0f0f0; -} -.ant-card-actions::before { - display: table; - content: ''; -} -.ant-card-actions::after { - display: table; - clear: both; - content: ''; -} -.ant-card-actions > li { - float: left; - margin: 12px 0; - color: rgba(0, 0, 0, 0.45); - text-align: center; -} -.ant-card-rtl .ant-card-actions > li { - float: right; -} -.ant-card-actions > li > span { - position: relative; - display: block; - min-width: 32px; - font-size: 14px; - line-height: 1.5715; - cursor: pointer; -} -.ant-card-actions > li > span:hover { - color: #1890ff; - -webkit-transition: color 0.3s; - transition: color 0.3s; -} -.ant-card-actions > li > span a:not(.ant-btn), -.ant-card-actions > li > span > .anticon { - display: inline-block; - width: 100%; - color: rgba(0, 0, 0, 0.45); - line-height: 22px; - -webkit-transition: color 0.3s; - transition: color 0.3s; -} -.ant-card-actions > li > span a:not(.ant-btn):hover, -.ant-card-actions > li > span > .anticon:hover { - color: #1890ff; -} -.ant-card-actions > li > span > .anticon { - font-size: 16px; - line-height: 22px; -} -.ant-card-actions > li:not(:last-child) { - border-right: 1px solid #f0f0f0; -} -.ant-card-type-inner .ant-card-head { - padding: 0 24px; - background: #fafafa; -} -.ant-card-type-inner .ant-card-head-title { - padding: 12px 0; - font-size: 14px; -} -.ant-card-type-inner .ant-card-body { - padding: 16px 24px; -} -.ant-card-type-inner .ant-card-extra { - padding: 13.5px 0; -} -.ant-card-meta { - margin: -4px 0; -} -.ant-card-meta::before { - display: table; - content: ''; -} -.ant-card-meta::after { - display: table; - clear: both; - content: ''; -} -.ant-card-meta-avatar { - float: left; - padding-right: 16px; -} -.ant-card-rtl .ant-card-meta-avatar { - float: right; - padding-right: 0; - padding-left: 16px; -} -.ant-card-meta-detail { - overflow: hidden; -} -.ant-card-meta-detail > div:not(:last-child) { - margin-bottom: 8px; -} -.ant-card-meta-title { - overflow: hidden; - color: rgba(0, 0, 0, 0.85); - font-weight: 500; - font-size: 16px; - white-space: nowrap; - text-overflow: ellipsis; -} -.ant-card-meta-description { - color: rgba(0, 0, 0, 0.45); -} -.ant-card-loading { - overflow: hidden; -} -.ant-card-loading .ant-card-body { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.ant-card-loading-content p { - margin: 0; -} -.ant-card-loading-block { - height: 14px; - margin: 4px 0; - background: -webkit-gradient(linear, left top, right top, from(rgba(207, 216, 220, 0.2)), color-stop(rgba(207, 216, 220, 0.4)), to(rgba(207, 216, 220, 0.2))); - background: linear-gradient(90deg, rgba(207, 216, 220, 0.2), rgba(207, 216, 220, 0.4), rgba(207, 216, 220, 0.2)); - background-size: 600% 600%; - border-radius: 2px; - -webkit-animation: card-loading 1.4s ease infinite; - animation: card-loading 1.4s ease infinite; -} -@-webkit-keyframes card-loading { - 0%, - 100% { - background-position: 0 50%; - } - 50% { - background-position: 100% 50%; - } -} -@keyframes card-loading { - 0%, - 100% { - background-position: 0 50%; - } - 50% { - background-position: 100% 50%; - } -} -.ant-card-small > .ant-card-head { - min-height: 36px; - padding: 0 12px; - font-size: 14px; -} -.ant-card-small > .ant-card-head > .ant-card-head-wrapper > .ant-card-head-title { - padding: 8px 0; -} -.ant-card-small > .ant-card-head > .ant-card-head-wrapper > .ant-card-extra { - padding: 8px 0; - font-size: 14px; -} -.ant-card-small > .ant-card-body { - padding: 12px; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-tabs-small > .ant-tabs-nav .ant-tabs-tab { - padding: 8px 0; - font-size: 14px; -} -.ant-tabs-large > .ant-tabs-nav .ant-tabs-tab { - padding: 16px 0; - font-size: 16px; -} -.ant-tabs-card.ant-tabs-small > .ant-tabs-nav .ant-tabs-tab { - padding: 6px 16px; -} -.ant-tabs-card.ant-tabs-large > .ant-tabs-nav .ant-tabs-tab { - padding: 7px 16px 6px; -} -.ant-tabs-rtl { - direction: rtl; -} -.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab { - margin: 0 0 0 32px; -} -.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab:last-of-type { - margin-left: 0; -} -.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .anticon { - margin-right: 0; - margin-left: 12px; -} -.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .ant-tabs-tab-remove { - margin-right: 8px; - margin-left: -4px; -} -.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .ant-tabs-tab-remove .anticon { - margin: 0; -} -.ant-tabs-rtl.ant-tabs-left > .ant-tabs-nav { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1; -} -.ant-tabs-rtl.ant-tabs-left > .ant-tabs-content-holder { - -webkit-box-ordinal-group: 1; - -ms-flex-order: 0; - order: 0; -} -.ant-tabs-rtl.ant-tabs-right > .ant-tabs-nav { - -webkit-box-ordinal-group: 1; - -ms-flex-order: 0; - order: 0; -} -.ant-tabs-rtl.ant-tabs-right > .ant-tabs-content-holder { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1; -} -.ant-tabs-rtl.ant-tabs-card.ant-tabs-top > .ant-tabs-nav button.ant-tabs-tab:not(:last-of-type), -.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom > .ant-tabs-nav button.ant-tabs-tab:not(:last-of-type) { - margin: 0 0 0 2px; -} -.ant-tabs-dropdown-rtl { - direction: rtl; -} -.ant-tabs-dropdown-rtl .ant-tabs-dropdown-menu-item { - text-align: right; -} -.ant-tabs-top, -.ant-tabs-bottom { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; -} -.ant-tabs-top > .ant-tabs-nav, -.ant-tabs-bottom > .ant-tabs-nav, -.ant-tabs-top > div > .ant-tabs-nav, -.ant-tabs-bottom > div > .ant-tabs-nav { - margin: 0 0 16px 0; -} -.ant-tabs-top > .ant-tabs-nav::before, -.ant-tabs-bottom > .ant-tabs-nav::before, -.ant-tabs-top > div > .ant-tabs-nav::before, -.ant-tabs-bottom > div > .ant-tabs-nav::before { - position: absolute; - right: 0; - left: 0; - border-bottom: 1px solid #f0f0f0; - content: ''; -} -.ant-tabs-top > .ant-tabs-nav .ant-tabs-ink-bar, -.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-ink-bar, -.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-ink-bar, -.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-ink-bar { - height: 2px; -} -.ant-tabs-top > .ant-tabs-nav .ant-tabs-ink-bar-animated, -.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-ink-bar-animated, -.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-ink-bar-animated, -.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-ink-bar-animated { - -webkit-transition: width 0.3s, left 0.3s, right 0.3s; - transition: width 0.3s, left 0.3s, right 0.3s; -} -.ant-tabs-top > .ant-tabs-nav .ant-tabs-nav-wrap::before, -.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-nav-wrap::before, -.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-nav-wrap::before, -.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-nav-wrap::before, -.ant-tabs-top > .ant-tabs-nav .ant-tabs-nav-wrap::after, -.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-nav-wrap::after, -.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-nav-wrap::after, -.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-nav-wrap::after { - top: 0; - bottom: 0; - width: 30px; -} -.ant-tabs-top > .ant-tabs-nav .ant-tabs-nav-wrap::before, -.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-nav-wrap::before, -.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-nav-wrap::before, -.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-nav-wrap::before { - left: 0; - -webkit-box-shadow: inset 10px 0 8px -8px rgba(0, 0, 0, 0.08); - box-shadow: inset 10px 0 8px -8px rgba(0, 0, 0, 0.08); -} -.ant-tabs-top > .ant-tabs-nav .ant-tabs-nav-wrap::after, -.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-nav-wrap::after, -.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-nav-wrap::after, -.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-nav-wrap::after { - right: 0; - -webkit-box-shadow: inset -10px 0 8px -8px rgba(0, 0, 0, 0.08); - box-shadow: inset -10px 0 8px -8px rgba(0, 0, 0, 0.08); -} -.ant-tabs-top > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left::before, -.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left::before, -.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left::before, -.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left::before { - opacity: 1; -} -.ant-tabs-top > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right::after, -.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right::after, -.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right::after, -.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right::after { - opacity: 1; -} -.ant-tabs-top > .ant-tabs-nav::before, -.ant-tabs-top > div > .ant-tabs-nav::before { - bottom: 0; -} -.ant-tabs-top > .ant-tabs-nav .ant-tabs-ink-bar, -.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-ink-bar { - bottom: 0; -} -.ant-tabs-bottom > .ant-tabs-nav, -.ant-tabs-bottom > div > .ant-tabs-nav { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1; - margin-top: 16px; - margin-bottom: 0; -} -.ant-tabs-bottom > .ant-tabs-nav::before, -.ant-tabs-bottom > div > .ant-tabs-nav::before { - top: 0; -} -.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-ink-bar, -.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-ink-bar { - top: 0; -} -.ant-tabs-bottom > .ant-tabs-content-holder, -.ant-tabs-bottom > div > .ant-tabs-content-holder { - -webkit-box-ordinal-group: 1; - -ms-flex-order: 0; - order: 0; -} -.ant-tabs-left > .ant-tabs-nav, -.ant-tabs-right > .ant-tabs-nav, -.ant-tabs-left > div > .ant-tabs-nav, -.ant-tabs-right > div > .ant-tabs-nav { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - min-width: 50px; -} -.ant-tabs-left > .ant-tabs-nav .ant-tabs-tab, -.ant-tabs-right > .ant-tabs-nav .ant-tabs-tab, -.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-tab, -.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-tab { - margin: 0 0 16px 0; - padding: 8px 24px; - text-align: center; -} -.ant-tabs-left > .ant-tabs-nav .ant-tabs-tab:last-of-type, -.ant-tabs-right > .ant-tabs-nav .ant-tabs-tab:last-of-type, -.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-tab:last-of-type, -.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-tab:last-of-type { - margin-bottom: 0; -} -.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap, -.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap, -.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap, -.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; -} -.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap::before, -.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap::before, -.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap::before, -.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap::before, -.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap::after, -.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap::after, -.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap::after, -.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap::after { - right: 0; - left: 0; - height: 30px; -} -.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap::before, -.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap::before, -.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap::before, -.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap::before { - top: 0; - -webkit-box-shadow: inset 0 10px 8px -8px rgba(0, 0, 0, 0.08); - box-shadow: inset 0 10px 8px -8px rgba(0, 0, 0, 0.08); -} -.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap::after, -.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap::after, -.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap::after, -.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap::after { - bottom: 0; - -webkit-box-shadow: inset 0 -10px 8px -8px rgba(0, 0, 0, 0.08); - box-shadow: inset 0 -10px 8px -8px rgba(0, 0, 0, 0.08); -} -.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top::before, -.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top::before, -.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top::before, -.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top::before { - opacity: 1; -} -.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom::after, -.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom::after, -.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom::after, -.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom::after { - opacity: 1; -} -.ant-tabs-left > .ant-tabs-nav .ant-tabs-ink-bar, -.ant-tabs-right > .ant-tabs-nav .ant-tabs-ink-bar, -.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-ink-bar, -.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-ink-bar { - width: 2px; -} -.ant-tabs-left > .ant-tabs-nav .ant-tabs-ink-bar-animated, -.ant-tabs-right > .ant-tabs-nav .ant-tabs-ink-bar-animated, -.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-ink-bar-animated, -.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-ink-bar-animated { - -webkit-transition: height 0.3s, top 0.3s; - transition: height 0.3s, top 0.3s; -} -.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-list, -.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-list, -.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-list, -.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-list, -.ant-tabs-left > .ant-tabs-nav .ant-tabs-nav-operations, -.ant-tabs-right > .ant-tabs-nav .ant-tabs-nav-operations, -.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-nav-operations, -.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-nav-operations { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; -} -.ant-tabs-left > .ant-tabs-nav .ant-tabs-ink-bar, -.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-ink-bar { - right: 0; -} -.ant-tabs-left > .ant-tabs-content-holder, -.ant-tabs-left > div > .ant-tabs-content-holder { - margin-left: -1px; - border-left: 1px solid #f0f0f0; -} -.ant-tabs-left > .ant-tabs-content-holder > .ant-tabs-content > .ant-tabs-tabpane, -.ant-tabs-left > div > .ant-tabs-content-holder > .ant-tabs-content > .ant-tabs-tabpane { - padding-left: 24px; -} -.ant-tabs-right > .ant-tabs-nav, -.ant-tabs-right > div > .ant-tabs-nav { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1; -} -.ant-tabs-right > .ant-tabs-nav .ant-tabs-ink-bar, -.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-ink-bar { - left: 0; -} -.ant-tabs-right > .ant-tabs-content-holder, -.ant-tabs-right > div > .ant-tabs-content-holder { - -webkit-box-ordinal-group: 1; - -ms-flex-order: 0; - order: 0; - margin-right: -1px; - border-right: 1px solid #f0f0f0; -} -.ant-tabs-right > .ant-tabs-content-holder > .ant-tabs-content > .ant-tabs-tabpane, -.ant-tabs-right > div > .ant-tabs-content-holder > .ant-tabs-content > .ant-tabs-tabpane { - padding-right: 24px; -} -.ant-tabs-dropdown { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: absolute; - top: -9999px; - left: -9999px; - z-index: 1050; - display: block; -} -.ant-tabs-dropdown-hidden { - display: none; -} -.ant-tabs-dropdown-menu { - max-height: 200px; - margin: 0; - padding: 4px 0; - overflow-x: hidden; - overflow-y: auto; - text-align: left; - list-style-type: none; - background-color: #fff; - background-clip: padding-box; - border-radius: 2px; - outline: none; - -webkit-box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); -} -.ant-tabs-dropdown-menu-item { - min-width: 120px; - margin: 0; - padding: 5px 12px; - overflow: hidden; - color: rgba(0, 0, 0, 0.65); - font-weight: normal; - font-size: 14px; - line-height: 22px; - white-space: nowrap; - text-overflow: ellipsis; - cursor: pointer; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-tabs-dropdown-menu-item:hover { - background: #f5f5f5; -} -.ant-tabs-dropdown-menu-item-disabled, -.ant-tabs-dropdown-menu-item-disabled:hover { - color: rgba(0, 0, 0, 0.25); - background: transparent; - cursor: not-allowed; -} -.ant-tabs-card > .ant-tabs-nav .ant-tabs-tab, -.ant-tabs-card > div > .ant-tabs-nav .ant-tabs-tab { - margin: 0; - padding: 8px 16px; - background: #fafafa; - border: 1px solid #f0f0f0; - -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); -} -.ant-tabs-card > .ant-tabs-nav .ant-tabs-tab-active, -.ant-tabs-card > div > .ant-tabs-nav .ant-tabs-tab-active { - color: #1890ff; - background: #fff; -} -.ant-tabs-card > .ant-tabs-nav .ant-tabs-ink-bar, -.ant-tabs-card > div > .ant-tabs-nav .ant-tabs-ink-bar { - visibility: hidden; -} -.ant-tabs-card.ant-tabs-top > .ant-tabs-nav .ant-tabs-tab:not(:last-of-type), -.ant-tabs-card.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-tab:not(:last-of-type), -.ant-tabs-card.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-tab:not(:last-of-type), -.ant-tabs-card.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-tab:not(:last-of-type) { - margin-right: 2px; -} -.ant-tabs-card.ant-tabs-top > .ant-tabs-nav .ant-tabs-tab, -.ant-tabs-card.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-tab { - border-radius: 2px 2px 0 0; -} -.ant-tabs-card.ant-tabs-top > .ant-tabs-nav .ant-tabs-tab-active, -.ant-tabs-card.ant-tabs-top > div > .ant-tabs-nav .ant-tabs-tab-active { - border-bottom-color: #fff; -} -.ant-tabs-card.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-tab, -.ant-tabs-card.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-tab { - border-radius: 0 0 2px 2px; -} -.ant-tabs-card.ant-tabs-bottom > .ant-tabs-nav .ant-tabs-tab-active, -.ant-tabs-card.ant-tabs-bottom > div > .ant-tabs-nav .ant-tabs-tab-active { - border-top-color: #fff; -} -.ant-tabs-card.ant-tabs-left > .ant-tabs-nav .ant-tabs-tab:not(:last-of-type), -.ant-tabs-card.ant-tabs-right > .ant-tabs-nav .ant-tabs-tab:not(:last-of-type), -.ant-tabs-card.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-tab:not(:last-of-type), -.ant-tabs-card.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-tab:not(:last-of-type) { - margin-bottom: 2px; -} -.ant-tabs-card.ant-tabs-left > .ant-tabs-nav .ant-tabs-tab, -.ant-tabs-card.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-tab { - border-radius: 2px 0 0 2px; -} -.ant-tabs-card.ant-tabs-left > .ant-tabs-nav .ant-tabs-tab-active, -.ant-tabs-card.ant-tabs-left > div > .ant-tabs-nav .ant-tabs-tab-active { - border-right-color: #fff; -} -.ant-tabs-card.ant-tabs-right > .ant-tabs-nav .ant-tabs-tab, -.ant-tabs-card.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-tab { - border-radius: 0 2px 2px 0; -} -.ant-tabs-card.ant-tabs-right > .ant-tabs-nav .ant-tabs-tab-active, -.ant-tabs-card.ant-tabs-right > div > .ant-tabs-nav .ant-tabs-tab-active { - border-left-color: #fff; -} -.ant-tabs { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - overflow: hidden; -} -.ant-tabs > .ant-tabs-nav, -.ant-tabs > div > .ant-tabs-nav { - position: relative; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} -.ant-tabs > .ant-tabs-nav .ant-tabs-nav-wrap, -.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-wrap { - position: relative; - display: inline-block; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; - -ms-flex-item-align: stretch; - align-self: stretch; - overflow: hidden; - white-space: nowrap; - -webkit-transform: translate(0); - transform: translate(0); -} -.ant-tabs > .ant-tabs-nav .ant-tabs-nav-wrap::before, -.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-wrap::before, -.ant-tabs > .ant-tabs-nav .ant-tabs-nav-wrap::after, -.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-wrap::after { - position: absolute; - z-index: 1; - opacity: 0; - -webkit-transition: opacity 0.3s; - transition: opacity 0.3s; - content: ''; - pointer-events: none; -} -.ant-tabs > .ant-tabs-nav .ant-tabs-nav-list, -.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-list { - position: relative; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-transition: -webkit-transform 0.3s; - transition: -webkit-transform 0.3s; - transition: transform 0.3s; - transition: transform 0.3s, -webkit-transform 0.3s; -} -.ant-tabs > .ant-tabs-nav .ant-tabs-nav-operations, -.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-operations { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-item-align: stretch; - align-self: stretch; -} -.ant-tabs > .ant-tabs-nav .ant-tabs-nav-operations-hidden, -.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-operations-hidden { - position: absolute; - visibility: hidden; - pointer-events: none; -} -.ant-tabs > .ant-tabs-nav .ant-tabs-nav-more, -.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-more { - position: relative; - padding: 8px 16px; - background: transparent; - border: 0; -} -.ant-tabs > .ant-tabs-nav .ant-tabs-nav-more::after, -.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-more::after { - position: absolute; - right: 0; - bottom: 0; - left: 0; - height: 5px; - -webkit-transform: translateY(100%); - transform: translateY(100%); - content: ''; -} -.ant-tabs > .ant-tabs-nav .ant-tabs-nav-add, -.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-add { - min-width: 40px; - padding: 0 8px; - background: #fafafa; - border: 1px solid #f0f0f0; - border-radius: 2px 2px 0 0; - outline: none; - cursor: pointer; - -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); - transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); -} -.ant-tabs > .ant-tabs-nav .ant-tabs-nav-add:hover, -.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-add:hover { - color: #40a9ff; -} -.ant-tabs > .ant-tabs-nav .ant-tabs-nav-add:active, -.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-add:active, -.ant-tabs > .ant-tabs-nav .ant-tabs-nav-add:focus, -.ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-add:focus { - color: #096dd9; -} -.ant-tabs-extra-content { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; -} -.ant-tabs-centered > .ant-tabs-nav .ant-tabs-nav-wrap:not([class*='ant-tabs-nav-wrap-ping']), -.ant-tabs-centered > div > .ant-tabs-nav .ant-tabs-nav-wrap:not([class*='ant-tabs-nav-wrap-ping']) { - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; -} -.ant-tabs-ink-bar { - position: absolute; - background: #1890ff; - pointer-events: none; -} -.ant-tabs-tab { - position: relative; - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - margin: 0 32px 0 0; - padding: 12px 0; - font-size: 14px; - background: transparent; - border: 0; - outline: none; - cursor: pointer; -} -.ant-tabs-tab:last-of-type { - margin-right: 0; - margin-left: 0; -} -.ant-tabs-tab-btn:focus, -.ant-tabs-tab-remove:focus, -.ant-tabs-tab-btn:active, -.ant-tabs-tab-remove:active { - color: #096dd9; -} -.ant-tabs-tab-btn { - outline: none; -} -.ant-tabs-tab-remove { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - margin-right: -4px; - margin-left: 8px; - color: rgba(0, 0, 0, 0.45); - font-size: 12px; - background: transparent; - border: none; - outline: none; - cursor: pointer; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-tabs-tab-remove:hover { - color: rgba(0, 0, 0, 0.85); -} -.ant-tabs-tab:hover { - color: #40a9ff; -} -.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn { - color: #1890ff; - font-weight: 500; -} -.ant-tabs-tab.ant-tabs-tab-disabled { - color: rgba(0, 0, 0, 0.25); - cursor: not-allowed; -} -.ant-tabs-tab .ant-tabs-tab-remove .anticon { - margin: 0; -} -.ant-tabs-tab .anticon { - margin-right: 12px; -} -.ant-tabs-content { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - width: 100%; -} -.ant-tabs-content-holder { - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; - min-width: 0; - min-height: 0; -} -.ant-tabs-content-animated { - -webkit-transition: margin 0.3s; - transition: margin 0.3s; -} -.ant-tabs-tabpane { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 100%; - outline: none; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-row { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-flow: row wrap; - flex-flow: row wrap; -} -.ant-row::before, -.ant-row::after { - display: -webkit-box; - display: -ms-flexbox; - display: flex; -} -.ant-row-start { - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; -} -.ant-row-center { - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; -} -.ant-row-end { - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; -} -.ant-row-space-between { - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; -} -.ant-row-space-around { - -ms-flex-pack: distribute; - justify-content: space-around; -} -.ant-row-top { - -webkit-box-align: start; - -ms-flex-align: start; - align-items: flex-start; -} -.ant-row-middle { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} -.ant-row-bottom { - -webkit-box-align: end; - -ms-flex-align: end; - align-items: flex-end; -} -.ant-col { - position: relative; - max-width: 100%; - min-height: 1px; -} -.ant-col-24 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; -} -.ant-col-push-24 { - left: 100%; -} -.ant-col-pull-24 { - right: 100%; -} -.ant-col-offset-24 { - margin-left: 100%; -} -.ant-col-order-24 { - -webkit-box-ordinal-group: 25; - -ms-flex-order: 24; - order: 24; -} -.ant-col-23 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 95.83333333%; - flex: 0 0 95.83333333%; - max-width: 95.83333333%; -} -.ant-col-push-23 { - left: 95.83333333%; -} -.ant-col-pull-23 { - right: 95.83333333%; -} -.ant-col-offset-23 { - margin-left: 95.83333333%; -} -.ant-col-order-23 { - -webkit-box-ordinal-group: 24; - -ms-flex-order: 23; - order: 23; -} -.ant-col-22 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 91.66666667%; - flex: 0 0 91.66666667%; - max-width: 91.66666667%; -} -.ant-col-push-22 { - left: 91.66666667%; -} -.ant-col-pull-22 { - right: 91.66666667%; -} -.ant-col-offset-22 { - margin-left: 91.66666667%; -} -.ant-col-order-22 { - -webkit-box-ordinal-group: 23; - -ms-flex-order: 22; - order: 22; -} -.ant-col-21 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 87.5%; - flex: 0 0 87.5%; - max-width: 87.5%; -} -.ant-col-push-21 { - left: 87.5%; -} -.ant-col-pull-21 { - right: 87.5%; -} -.ant-col-offset-21 { - margin-left: 87.5%; -} -.ant-col-order-21 { - -webkit-box-ordinal-group: 22; - -ms-flex-order: 21; - order: 21; -} -.ant-col-20 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 83.33333333%; - flex: 0 0 83.33333333%; - max-width: 83.33333333%; -} -.ant-col-push-20 { - left: 83.33333333%; -} -.ant-col-pull-20 { - right: 83.33333333%; -} -.ant-col-offset-20 { - margin-left: 83.33333333%; -} -.ant-col-order-20 { - -webkit-box-ordinal-group: 21; - -ms-flex-order: 20; - order: 20; -} -.ant-col-19 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 79.16666667%; - flex: 0 0 79.16666667%; - max-width: 79.16666667%; -} -.ant-col-push-19 { - left: 79.16666667%; -} -.ant-col-pull-19 { - right: 79.16666667%; -} -.ant-col-offset-19 { - margin-left: 79.16666667%; -} -.ant-col-order-19 { - -webkit-box-ordinal-group: 20; - -ms-flex-order: 19; - order: 19; -} -.ant-col-18 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; -} -.ant-col-push-18 { - left: 75%; -} -.ant-col-pull-18 { - right: 75%; -} -.ant-col-offset-18 { - margin-left: 75%; -} -.ant-col-order-18 { - -webkit-box-ordinal-group: 19; - -ms-flex-order: 18; - order: 18; -} -.ant-col-17 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 70.83333333%; - flex: 0 0 70.83333333%; - max-width: 70.83333333%; -} -.ant-col-push-17 { - left: 70.83333333%; -} -.ant-col-pull-17 { - right: 70.83333333%; -} -.ant-col-offset-17 { - margin-left: 70.83333333%; -} -.ant-col-order-17 { - -webkit-box-ordinal-group: 18; - -ms-flex-order: 17; - order: 17; -} -.ant-col-16 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 66.66666667%; - flex: 0 0 66.66666667%; - max-width: 66.66666667%; -} -.ant-col-push-16 { - left: 66.66666667%; -} -.ant-col-pull-16 { - right: 66.66666667%; -} -.ant-col-offset-16 { - margin-left: 66.66666667%; -} -.ant-col-order-16 { - -webkit-box-ordinal-group: 17; - -ms-flex-order: 16; - order: 16; -} -.ant-col-15 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 62.5%; - flex: 0 0 62.5%; - max-width: 62.5%; -} -.ant-col-push-15 { - left: 62.5%; -} -.ant-col-pull-15 { - right: 62.5%; -} -.ant-col-offset-15 { - margin-left: 62.5%; -} -.ant-col-order-15 { - -webkit-box-ordinal-group: 16; - -ms-flex-order: 15; - order: 15; -} -.ant-col-14 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 58.33333333%; - flex: 0 0 58.33333333%; - max-width: 58.33333333%; -} -.ant-col-push-14 { - left: 58.33333333%; -} -.ant-col-pull-14 { - right: 58.33333333%; -} -.ant-col-offset-14 { - margin-left: 58.33333333%; -} -.ant-col-order-14 { - -webkit-box-ordinal-group: 15; - -ms-flex-order: 14; - order: 14; -} -.ant-col-13 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 54.16666667%; - flex: 0 0 54.16666667%; - max-width: 54.16666667%; -} -.ant-col-push-13 { - left: 54.16666667%; -} -.ant-col-pull-13 { - right: 54.16666667%; -} -.ant-col-offset-13 { - margin-left: 54.16666667%; -} -.ant-col-order-13 { - -webkit-box-ordinal-group: 14; - -ms-flex-order: 13; - order: 13; -} -.ant-col-12 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; -} -.ant-col-push-12 { - left: 50%; -} -.ant-col-pull-12 { - right: 50%; -} -.ant-col-offset-12 { - margin-left: 50%; -} -.ant-col-order-12 { - -webkit-box-ordinal-group: 13; - -ms-flex-order: 12; - order: 12; -} -.ant-col-11 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 45.83333333%; - flex: 0 0 45.83333333%; - max-width: 45.83333333%; -} -.ant-col-push-11 { - left: 45.83333333%; -} -.ant-col-pull-11 { - right: 45.83333333%; -} -.ant-col-offset-11 { - margin-left: 45.83333333%; -} -.ant-col-order-11 { - -webkit-box-ordinal-group: 12; - -ms-flex-order: 11; - order: 11; -} -.ant-col-10 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 41.66666667%; - flex: 0 0 41.66666667%; - max-width: 41.66666667%; -} -.ant-col-push-10 { - left: 41.66666667%; -} -.ant-col-pull-10 { - right: 41.66666667%; -} -.ant-col-offset-10 { - margin-left: 41.66666667%; -} -.ant-col-order-10 { - -webkit-box-ordinal-group: 11; - -ms-flex-order: 10; - order: 10; -} -.ant-col-9 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 37.5%; - flex: 0 0 37.5%; - max-width: 37.5%; -} -.ant-col-push-9 { - left: 37.5%; -} -.ant-col-pull-9 { - right: 37.5%; -} -.ant-col-offset-9 { - margin-left: 37.5%; -} -.ant-col-order-9 { - -webkit-box-ordinal-group: 10; - -ms-flex-order: 9; - order: 9; -} -.ant-col-8 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 33.33333333%; - flex: 0 0 33.33333333%; - max-width: 33.33333333%; -} -.ant-col-push-8 { - left: 33.33333333%; -} -.ant-col-pull-8 { - right: 33.33333333%; -} -.ant-col-offset-8 { - margin-left: 33.33333333%; -} -.ant-col-order-8 { - -webkit-box-ordinal-group: 9; - -ms-flex-order: 8; - order: 8; -} -.ant-col-7 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 29.16666667%; - flex: 0 0 29.16666667%; - max-width: 29.16666667%; -} -.ant-col-push-7 { - left: 29.16666667%; -} -.ant-col-pull-7 { - right: 29.16666667%; -} -.ant-col-offset-7 { - margin-left: 29.16666667%; -} -.ant-col-order-7 { - -webkit-box-ordinal-group: 8; - -ms-flex-order: 7; - order: 7; -} -.ant-col-6 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; -} -.ant-col-push-6 { - left: 25%; -} -.ant-col-pull-6 { - right: 25%; -} -.ant-col-offset-6 { - margin-left: 25%; -} -.ant-col-order-6 { - -webkit-box-ordinal-group: 7; - -ms-flex-order: 6; - order: 6; -} -.ant-col-5 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 20.83333333%; - flex: 0 0 20.83333333%; - max-width: 20.83333333%; -} -.ant-col-push-5 { - left: 20.83333333%; -} -.ant-col-pull-5 { - right: 20.83333333%; -} -.ant-col-offset-5 { - margin-left: 20.83333333%; -} -.ant-col-order-5 { - -webkit-box-ordinal-group: 6; - -ms-flex-order: 5; - order: 5; -} -.ant-col-4 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 16.66666667%; - flex: 0 0 16.66666667%; - max-width: 16.66666667%; -} -.ant-col-push-4 { - left: 16.66666667%; -} -.ant-col-pull-4 { - right: 16.66666667%; -} -.ant-col-offset-4 { - margin-left: 16.66666667%; -} -.ant-col-order-4 { - -webkit-box-ordinal-group: 5; - -ms-flex-order: 4; - order: 4; -} -.ant-col-3 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 12.5%; - flex: 0 0 12.5%; - max-width: 12.5%; -} -.ant-col-push-3 { - left: 12.5%; -} -.ant-col-pull-3 { - right: 12.5%; -} -.ant-col-offset-3 { - margin-left: 12.5%; -} -.ant-col-order-3 { - -webkit-box-ordinal-group: 4; - -ms-flex-order: 3; - order: 3; -} -.ant-col-2 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 8.33333333%; - flex: 0 0 8.33333333%; - max-width: 8.33333333%; -} -.ant-col-push-2 { - left: 8.33333333%; -} -.ant-col-pull-2 { - right: 8.33333333%; -} -.ant-col-offset-2 { - margin-left: 8.33333333%; -} -.ant-col-order-2 { - -webkit-box-ordinal-group: 3; - -ms-flex-order: 2; - order: 2; -} -.ant-col-1 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 4.16666667%; - flex: 0 0 4.16666667%; - max-width: 4.16666667%; -} -.ant-col-push-1 { - left: 4.16666667%; -} -.ant-col-pull-1 { - right: 4.16666667%; -} -.ant-col-offset-1 { - margin-left: 4.16666667%; -} -.ant-col-order-1 { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1; -} -.ant-col-0 { - display: none; -} -.ant-col-push-0 { - left: auto; -} -.ant-col-pull-0 { - right: auto; -} -.ant-col-push-0 { - left: auto; -} -.ant-col-pull-0 { - right: auto; -} -.ant-col-offset-0 { - margin-left: 0; -} -.ant-col-order-0 { - -webkit-box-ordinal-group: 1; - -ms-flex-order: 0; - order: 0; -} -.ant-col-push-0.ant-col-rtl { - right: auto; -} -.ant-col-pull-0.ant-col-rtl { - left: auto; -} -.ant-col-push-0.ant-col-rtl { - right: auto; -} -.ant-col-pull-0.ant-col-rtl { - left: auto; -} -.ant-col-offset-0.ant-col-rtl { - margin-right: 0; -} -.ant-col-push-1.ant-col-rtl { - right: 4.16666667%; - left: auto; -} -.ant-col-pull-1.ant-col-rtl { - right: auto; - left: 4.16666667%; -} -.ant-col-offset-1.ant-col-rtl { - margin-right: 4.16666667%; - margin-left: 0; -} -.ant-col-push-2.ant-col-rtl { - right: 8.33333333%; - left: auto; -} -.ant-col-pull-2.ant-col-rtl { - right: auto; - left: 8.33333333%; -} -.ant-col-offset-2.ant-col-rtl { - margin-right: 8.33333333%; - margin-left: 0; -} -.ant-col-push-3.ant-col-rtl { - right: 12.5%; - left: auto; -} -.ant-col-pull-3.ant-col-rtl { - right: auto; - left: 12.5%; -} -.ant-col-offset-3.ant-col-rtl { - margin-right: 12.5%; - margin-left: 0; -} -.ant-col-push-4.ant-col-rtl { - right: 16.66666667%; - left: auto; -} -.ant-col-pull-4.ant-col-rtl { - right: auto; - left: 16.66666667%; -} -.ant-col-offset-4.ant-col-rtl { - margin-right: 16.66666667%; - margin-left: 0; -} -.ant-col-push-5.ant-col-rtl { - right: 20.83333333%; - left: auto; -} -.ant-col-pull-5.ant-col-rtl { - right: auto; - left: 20.83333333%; -} -.ant-col-offset-5.ant-col-rtl { - margin-right: 20.83333333%; - margin-left: 0; -} -.ant-col-push-6.ant-col-rtl { - right: 25%; - left: auto; -} -.ant-col-pull-6.ant-col-rtl { - right: auto; - left: 25%; -} -.ant-col-offset-6.ant-col-rtl { - margin-right: 25%; - margin-left: 0; -} -.ant-col-push-7.ant-col-rtl { - right: 29.16666667%; - left: auto; -} -.ant-col-pull-7.ant-col-rtl { - right: auto; - left: 29.16666667%; -} -.ant-col-offset-7.ant-col-rtl { - margin-right: 29.16666667%; - margin-left: 0; -} -.ant-col-push-8.ant-col-rtl { - right: 33.33333333%; - left: auto; -} -.ant-col-pull-8.ant-col-rtl { - right: auto; - left: 33.33333333%; -} -.ant-col-offset-8.ant-col-rtl { - margin-right: 33.33333333%; - margin-left: 0; -} -.ant-col-push-9.ant-col-rtl { - right: 37.5%; - left: auto; -} -.ant-col-pull-9.ant-col-rtl { - right: auto; - left: 37.5%; -} -.ant-col-offset-9.ant-col-rtl { - margin-right: 37.5%; - margin-left: 0; -} -.ant-col-push-10.ant-col-rtl { - right: 41.66666667%; - left: auto; -} -.ant-col-pull-10.ant-col-rtl { - right: auto; - left: 41.66666667%; -} -.ant-col-offset-10.ant-col-rtl { - margin-right: 41.66666667%; - margin-left: 0; -} -.ant-col-push-11.ant-col-rtl { - right: 45.83333333%; - left: auto; -} -.ant-col-pull-11.ant-col-rtl { - right: auto; - left: 45.83333333%; -} -.ant-col-offset-11.ant-col-rtl { - margin-right: 45.83333333%; - margin-left: 0; -} -.ant-col-push-12.ant-col-rtl { - right: 50%; - left: auto; -} -.ant-col-pull-12.ant-col-rtl { - right: auto; - left: 50%; -} -.ant-col-offset-12.ant-col-rtl { - margin-right: 50%; - margin-left: 0; -} -.ant-col-push-13.ant-col-rtl { - right: 54.16666667%; - left: auto; -} -.ant-col-pull-13.ant-col-rtl { - right: auto; - left: 54.16666667%; -} -.ant-col-offset-13.ant-col-rtl { - margin-right: 54.16666667%; - margin-left: 0; -} -.ant-col-push-14.ant-col-rtl { - right: 58.33333333%; - left: auto; -} -.ant-col-pull-14.ant-col-rtl { - right: auto; - left: 58.33333333%; -} -.ant-col-offset-14.ant-col-rtl { - margin-right: 58.33333333%; - margin-left: 0; -} -.ant-col-push-15.ant-col-rtl { - right: 62.5%; - left: auto; -} -.ant-col-pull-15.ant-col-rtl { - right: auto; - left: 62.5%; -} -.ant-col-offset-15.ant-col-rtl { - margin-right: 62.5%; - margin-left: 0; -} -.ant-col-push-16.ant-col-rtl { - right: 66.66666667%; - left: auto; -} -.ant-col-pull-16.ant-col-rtl { - right: auto; - left: 66.66666667%; -} -.ant-col-offset-16.ant-col-rtl { - margin-right: 66.66666667%; - margin-left: 0; -} -.ant-col-push-17.ant-col-rtl { - right: 70.83333333%; - left: auto; -} -.ant-col-pull-17.ant-col-rtl { - right: auto; - left: 70.83333333%; -} -.ant-col-offset-17.ant-col-rtl { - margin-right: 70.83333333%; - margin-left: 0; -} -.ant-col-push-18.ant-col-rtl { - right: 75%; - left: auto; -} -.ant-col-pull-18.ant-col-rtl { - right: auto; - left: 75%; -} -.ant-col-offset-18.ant-col-rtl { - margin-right: 75%; - margin-left: 0; -} -.ant-col-push-19.ant-col-rtl { - right: 79.16666667%; - left: auto; -} -.ant-col-pull-19.ant-col-rtl { - right: auto; - left: 79.16666667%; -} -.ant-col-offset-19.ant-col-rtl { - margin-right: 79.16666667%; - margin-left: 0; -} -.ant-col-push-20.ant-col-rtl { - right: 83.33333333%; - left: auto; -} -.ant-col-pull-20.ant-col-rtl { - right: auto; - left: 83.33333333%; -} -.ant-col-offset-20.ant-col-rtl { - margin-right: 83.33333333%; - margin-left: 0; -} -.ant-col-push-21.ant-col-rtl { - right: 87.5%; - left: auto; -} -.ant-col-pull-21.ant-col-rtl { - right: auto; - left: 87.5%; -} -.ant-col-offset-21.ant-col-rtl { - margin-right: 87.5%; - margin-left: 0; -} -.ant-col-push-22.ant-col-rtl { - right: 91.66666667%; - left: auto; -} -.ant-col-pull-22.ant-col-rtl { - right: auto; - left: 91.66666667%; -} -.ant-col-offset-22.ant-col-rtl { - margin-right: 91.66666667%; - margin-left: 0; -} -.ant-col-push-23.ant-col-rtl { - right: 95.83333333%; - left: auto; -} -.ant-col-pull-23.ant-col-rtl { - right: auto; - left: 95.83333333%; -} -.ant-col-offset-23.ant-col-rtl { - margin-right: 95.83333333%; - margin-left: 0; -} -.ant-col-push-24.ant-col-rtl { - right: 100%; - left: auto; -} -.ant-col-pull-24.ant-col-rtl { - right: auto; - left: 100%; -} -.ant-col-offset-24.ant-col-rtl { - margin-right: 100%; - margin-left: 0; -} -.ant-col-xs-24 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; -} -.ant-col-xs-push-24 { - left: 100%; -} -.ant-col-xs-pull-24 { - right: 100%; -} -.ant-col-xs-offset-24 { - margin-left: 100%; -} -.ant-col-xs-order-24 { - -webkit-box-ordinal-group: 25; - -ms-flex-order: 24; - order: 24; -} -.ant-col-xs-23 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 95.83333333%; - flex: 0 0 95.83333333%; - max-width: 95.83333333%; -} -.ant-col-xs-push-23 { - left: 95.83333333%; -} -.ant-col-xs-pull-23 { - right: 95.83333333%; -} -.ant-col-xs-offset-23 { - margin-left: 95.83333333%; -} -.ant-col-xs-order-23 { - -webkit-box-ordinal-group: 24; - -ms-flex-order: 23; - order: 23; -} -.ant-col-xs-22 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 91.66666667%; - flex: 0 0 91.66666667%; - max-width: 91.66666667%; -} -.ant-col-xs-push-22 { - left: 91.66666667%; -} -.ant-col-xs-pull-22 { - right: 91.66666667%; -} -.ant-col-xs-offset-22 { - margin-left: 91.66666667%; -} -.ant-col-xs-order-22 { - -webkit-box-ordinal-group: 23; - -ms-flex-order: 22; - order: 22; -} -.ant-col-xs-21 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 87.5%; - flex: 0 0 87.5%; - max-width: 87.5%; -} -.ant-col-xs-push-21 { - left: 87.5%; -} -.ant-col-xs-pull-21 { - right: 87.5%; -} -.ant-col-xs-offset-21 { - margin-left: 87.5%; -} -.ant-col-xs-order-21 { - -webkit-box-ordinal-group: 22; - -ms-flex-order: 21; - order: 21; -} -.ant-col-xs-20 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 83.33333333%; - flex: 0 0 83.33333333%; - max-width: 83.33333333%; -} -.ant-col-xs-push-20 { - left: 83.33333333%; -} -.ant-col-xs-pull-20 { - right: 83.33333333%; -} -.ant-col-xs-offset-20 { - margin-left: 83.33333333%; -} -.ant-col-xs-order-20 { - -webkit-box-ordinal-group: 21; - -ms-flex-order: 20; - order: 20; -} -.ant-col-xs-19 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 79.16666667%; - flex: 0 0 79.16666667%; - max-width: 79.16666667%; -} -.ant-col-xs-push-19 { - left: 79.16666667%; -} -.ant-col-xs-pull-19 { - right: 79.16666667%; -} -.ant-col-xs-offset-19 { - margin-left: 79.16666667%; -} -.ant-col-xs-order-19 { - -webkit-box-ordinal-group: 20; - -ms-flex-order: 19; - order: 19; -} -.ant-col-xs-18 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; -} -.ant-col-xs-push-18 { - left: 75%; -} -.ant-col-xs-pull-18 { - right: 75%; -} -.ant-col-xs-offset-18 { - margin-left: 75%; -} -.ant-col-xs-order-18 { - -webkit-box-ordinal-group: 19; - -ms-flex-order: 18; - order: 18; -} -.ant-col-xs-17 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 70.83333333%; - flex: 0 0 70.83333333%; - max-width: 70.83333333%; -} -.ant-col-xs-push-17 { - left: 70.83333333%; -} -.ant-col-xs-pull-17 { - right: 70.83333333%; -} -.ant-col-xs-offset-17 { - margin-left: 70.83333333%; -} -.ant-col-xs-order-17 { - -webkit-box-ordinal-group: 18; - -ms-flex-order: 17; - order: 17; -} -.ant-col-xs-16 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 66.66666667%; - flex: 0 0 66.66666667%; - max-width: 66.66666667%; -} -.ant-col-xs-push-16 { - left: 66.66666667%; -} -.ant-col-xs-pull-16 { - right: 66.66666667%; -} -.ant-col-xs-offset-16 { - margin-left: 66.66666667%; -} -.ant-col-xs-order-16 { - -webkit-box-ordinal-group: 17; - -ms-flex-order: 16; - order: 16; -} -.ant-col-xs-15 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 62.5%; - flex: 0 0 62.5%; - max-width: 62.5%; -} -.ant-col-xs-push-15 { - left: 62.5%; -} -.ant-col-xs-pull-15 { - right: 62.5%; -} -.ant-col-xs-offset-15 { - margin-left: 62.5%; -} -.ant-col-xs-order-15 { - -webkit-box-ordinal-group: 16; - -ms-flex-order: 15; - order: 15; -} -.ant-col-xs-14 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 58.33333333%; - flex: 0 0 58.33333333%; - max-width: 58.33333333%; -} -.ant-col-xs-push-14 { - left: 58.33333333%; -} -.ant-col-xs-pull-14 { - right: 58.33333333%; -} -.ant-col-xs-offset-14 { - margin-left: 58.33333333%; -} -.ant-col-xs-order-14 { - -webkit-box-ordinal-group: 15; - -ms-flex-order: 14; - order: 14; -} -.ant-col-xs-13 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 54.16666667%; - flex: 0 0 54.16666667%; - max-width: 54.16666667%; -} -.ant-col-xs-push-13 { - left: 54.16666667%; -} -.ant-col-xs-pull-13 { - right: 54.16666667%; -} -.ant-col-xs-offset-13 { - margin-left: 54.16666667%; -} -.ant-col-xs-order-13 { - -webkit-box-ordinal-group: 14; - -ms-flex-order: 13; - order: 13; -} -.ant-col-xs-12 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; -} -.ant-col-xs-push-12 { - left: 50%; -} -.ant-col-xs-pull-12 { - right: 50%; -} -.ant-col-xs-offset-12 { - margin-left: 50%; -} -.ant-col-xs-order-12 { - -webkit-box-ordinal-group: 13; - -ms-flex-order: 12; - order: 12; -} -.ant-col-xs-11 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 45.83333333%; - flex: 0 0 45.83333333%; - max-width: 45.83333333%; -} -.ant-col-xs-push-11 { - left: 45.83333333%; -} -.ant-col-xs-pull-11 { - right: 45.83333333%; -} -.ant-col-xs-offset-11 { - margin-left: 45.83333333%; -} -.ant-col-xs-order-11 { - -webkit-box-ordinal-group: 12; - -ms-flex-order: 11; - order: 11; -} -.ant-col-xs-10 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 41.66666667%; - flex: 0 0 41.66666667%; - max-width: 41.66666667%; -} -.ant-col-xs-push-10 { - left: 41.66666667%; -} -.ant-col-xs-pull-10 { - right: 41.66666667%; -} -.ant-col-xs-offset-10 { - margin-left: 41.66666667%; -} -.ant-col-xs-order-10 { - -webkit-box-ordinal-group: 11; - -ms-flex-order: 10; - order: 10; -} -.ant-col-xs-9 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 37.5%; - flex: 0 0 37.5%; - max-width: 37.5%; -} -.ant-col-xs-push-9 { - left: 37.5%; -} -.ant-col-xs-pull-9 { - right: 37.5%; -} -.ant-col-xs-offset-9 { - margin-left: 37.5%; -} -.ant-col-xs-order-9 { - -webkit-box-ordinal-group: 10; - -ms-flex-order: 9; - order: 9; -} -.ant-col-xs-8 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 33.33333333%; - flex: 0 0 33.33333333%; - max-width: 33.33333333%; -} -.ant-col-xs-push-8 { - left: 33.33333333%; -} -.ant-col-xs-pull-8 { - right: 33.33333333%; -} -.ant-col-xs-offset-8 { - margin-left: 33.33333333%; -} -.ant-col-xs-order-8 { - -webkit-box-ordinal-group: 9; - -ms-flex-order: 8; - order: 8; -} -.ant-col-xs-7 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 29.16666667%; - flex: 0 0 29.16666667%; - max-width: 29.16666667%; -} -.ant-col-xs-push-7 { - left: 29.16666667%; -} -.ant-col-xs-pull-7 { - right: 29.16666667%; -} -.ant-col-xs-offset-7 { - margin-left: 29.16666667%; -} -.ant-col-xs-order-7 { - -webkit-box-ordinal-group: 8; - -ms-flex-order: 7; - order: 7; -} -.ant-col-xs-6 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; -} -.ant-col-xs-push-6 { - left: 25%; -} -.ant-col-xs-pull-6 { - right: 25%; -} -.ant-col-xs-offset-6 { - margin-left: 25%; -} -.ant-col-xs-order-6 { - -webkit-box-ordinal-group: 7; - -ms-flex-order: 6; - order: 6; -} -.ant-col-xs-5 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 20.83333333%; - flex: 0 0 20.83333333%; - max-width: 20.83333333%; -} -.ant-col-xs-push-5 { - left: 20.83333333%; -} -.ant-col-xs-pull-5 { - right: 20.83333333%; -} -.ant-col-xs-offset-5 { - margin-left: 20.83333333%; -} -.ant-col-xs-order-5 { - -webkit-box-ordinal-group: 6; - -ms-flex-order: 5; - order: 5; -} -.ant-col-xs-4 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 16.66666667%; - flex: 0 0 16.66666667%; - max-width: 16.66666667%; -} -.ant-col-xs-push-4 { - left: 16.66666667%; -} -.ant-col-xs-pull-4 { - right: 16.66666667%; -} -.ant-col-xs-offset-4 { - margin-left: 16.66666667%; -} -.ant-col-xs-order-4 { - -webkit-box-ordinal-group: 5; - -ms-flex-order: 4; - order: 4; -} -.ant-col-xs-3 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 12.5%; - flex: 0 0 12.5%; - max-width: 12.5%; -} -.ant-col-xs-push-3 { - left: 12.5%; -} -.ant-col-xs-pull-3 { - right: 12.5%; -} -.ant-col-xs-offset-3 { - margin-left: 12.5%; -} -.ant-col-xs-order-3 { - -webkit-box-ordinal-group: 4; - -ms-flex-order: 3; - order: 3; -} -.ant-col-xs-2 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 8.33333333%; - flex: 0 0 8.33333333%; - max-width: 8.33333333%; -} -.ant-col-xs-push-2 { - left: 8.33333333%; -} -.ant-col-xs-pull-2 { - right: 8.33333333%; -} -.ant-col-xs-offset-2 { - margin-left: 8.33333333%; -} -.ant-col-xs-order-2 { - -webkit-box-ordinal-group: 3; - -ms-flex-order: 2; - order: 2; -} -.ant-col-xs-1 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 4.16666667%; - flex: 0 0 4.16666667%; - max-width: 4.16666667%; -} -.ant-col-xs-push-1 { - left: 4.16666667%; -} -.ant-col-xs-pull-1 { - right: 4.16666667%; -} -.ant-col-xs-offset-1 { - margin-left: 4.16666667%; -} -.ant-col-xs-order-1 { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1; -} -.ant-col-xs-0 { - display: none; -} -.ant-col-push-0 { - left: auto; -} -.ant-col-pull-0 { - right: auto; -} -.ant-col-xs-push-0 { - left: auto; -} -.ant-col-xs-pull-0 { - right: auto; -} -.ant-col-xs-offset-0 { - margin-left: 0; -} -.ant-col-xs-order-0 { - -webkit-box-ordinal-group: 1; - -ms-flex-order: 0; - order: 0; -} -.ant-col-push-0.ant-col-rtl { - right: auto; -} -.ant-col-pull-0.ant-col-rtl { - left: auto; -} -.ant-col-xs-push-0.ant-col-rtl { - right: auto; -} -.ant-col-xs-pull-0.ant-col-rtl { - left: auto; -} -.ant-col-xs-offset-0.ant-col-rtl { - margin-right: 0; -} -.ant-col-xs-push-1.ant-col-rtl { - right: 4.16666667%; - left: auto; -} -.ant-col-xs-pull-1.ant-col-rtl { - right: auto; - left: 4.16666667%; -} -.ant-col-xs-offset-1.ant-col-rtl { - margin-right: 4.16666667%; - margin-left: 0; -} -.ant-col-xs-push-2.ant-col-rtl { - right: 8.33333333%; - left: auto; -} -.ant-col-xs-pull-2.ant-col-rtl { - right: auto; - left: 8.33333333%; -} -.ant-col-xs-offset-2.ant-col-rtl { - margin-right: 8.33333333%; - margin-left: 0; -} -.ant-col-xs-push-3.ant-col-rtl { - right: 12.5%; - left: auto; -} -.ant-col-xs-pull-3.ant-col-rtl { - right: auto; - left: 12.5%; -} -.ant-col-xs-offset-3.ant-col-rtl { - margin-right: 12.5%; - margin-left: 0; -} -.ant-col-xs-push-4.ant-col-rtl { - right: 16.66666667%; - left: auto; -} -.ant-col-xs-pull-4.ant-col-rtl { - right: auto; - left: 16.66666667%; -} -.ant-col-xs-offset-4.ant-col-rtl { - margin-right: 16.66666667%; - margin-left: 0; -} -.ant-col-xs-push-5.ant-col-rtl { - right: 20.83333333%; - left: auto; -} -.ant-col-xs-pull-5.ant-col-rtl { - right: auto; - left: 20.83333333%; -} -.ant-col-xs-offset-5.ant-col-rtl { - margin-right: 20.83333333%; - margin-left: 0; -} -.ant-col-xs-push-6.ant-col-rtl { - right: 25%; - left: auto; -} -.ant-col-xs-pull-6.ant-col-rtl { - right: auto; - left: 25%; -} -.ant-col-xs-offset-6.ant-col-rtl { - margin-right: 25%; - margin-left: 0; -} -.ant-col-xs-push-7.ant-col-rtl { - right: 29.16666667%; - left: auto; -} -.ant-col-xs-pull-7.ant-col-rtl { - right: auto; - left: 29.16666667%; -} -.ant-col-xs-offset-7.ant-col-rtl { - margin-right: 29.16666667%; - margin-left: 0; -} -.ant-col-xs-push-8.ant-col-rtl { - right: 33.33333333%; - left: auto; -} -.ant-col-xs-pull-8.ant-col-rtl { - right: auto; - left: 33.33333333%; -} -.ant-col-xs-offset-8.ant-col-rtl { - margin-right: 33.33333333%; - margin-left: 0; -} -.ant-col-xs-push-9.ant-col-rtl { - right: 37.5%; - left: auto; -} -.ant-col-xs-pull-9.ant-col-rtl { - right: auto; - left: 37.5%; -} -.ant-col-xs-offset-9.ant-col-rtl { - margin-right: 37.5%; - margin-left: 0; -} -.ant-col-xs-push-10.ant-col-rtl { - right: 41.66666667%; - left: auto; -} -.ant-col-xs-pull-10.ant-col-rtl { - right: auto; - left: 41.66666667%; -} -.ant-col-xs-offset-10.ant-col-rtl { - margin-right: 41.66666667%; - margin-left: 0; -} -.ant-col-xs-push-11.ant-col-rtl { - right: 45.83333333%; - left: auto; -} -.ant-col-xs-pull-11.ant-col-rtl { - right: auto; - left: 45.83333333%; -} -.ant-col-xs-offset-11.ant-col-rtl { - margin-right: 45.83333333%; - margin-left: 0; -} -.ant-col-xs-push-12.ant-col-rtl { - right: 50%; - left: auto; -} -.ant-col-xs-pull-12.ant-col-rtl { - right: auto; - left: 50%; -} -.ant-col-xs-offset-12.ant-col-rtl { - margin-right: 50%; - margin-left: 0; -} -.ant-col-xs-push-13.ant-col-rtl { - right: 54.16666667%; - left: auto; -} -.ant-col-xs-pull-13.ant-col-rtl { - right: auto; - left: 54.16666667%; -} -.ant-col-xs-offset-13.ant-col-rtl { - margin-right: 54.16666667%; - margin-left: 0; -} -.ant-col-xs-push-14.ant-col-rtl { - right: 58.33333333%; - left: auto; -} -.ant-col-xs-pull-14.ant-col-rtl { - right: auto; - left: 58.33333333%; -} -.ant-col-xs-offset-14.ant-col-rtl { - margin-right: 58.33333333%; - margin-left: 0; -} -.ant-col-xs-push-15.ant-col-rtl { - right: 62.5%; - left: auto; -} -.ant-col-xs-pull-15.ant-col-rtl { - right: auto; - left: 62.5%; -} -.ant-col-xs-offset-15.ant-col-rtl { - margin-right: 62.5%; - margin-left: 0; -} -.ant-col-xs-push-16.ant-col-rtl { - right: 66.66666667%; - left: auto; -} -.ant-col-xs-pull-16.ant-col-rtl { - right: auto; - left: 66.66666667%; -} -.ant-col-xs-offset-16.ant-col-rtl { - margin-right: 66.66666667%; - margin-left: 0; -} -.ant-col-xs-push-17.ant-col-rtl { - right: 70.83333333%; - left: auto; -} -.ant-col-xs-pull-17.ant-col-rtl { - right: auto; - left: 70.83333333%; -} -.ant-col-xs-offset-17.ant-col-rtl { - margin-right: 70.83333333%; - margin-left: 0; -} -.ant-col-xs-push-18.ant-col-rtl { - right: 75%; - left: auto; -} -.ant-col-xs-pull-18.ant-col-rtl { - right: auto; - left: 75%; -} -.ant-col-xs-offset-18.ant-col-rtl { - margin-right: 75%; - margin-left: 0; -} -.ant-col-xs-push-19.ant-col-rtl { - right: 79.16666667%; - left: auto; -} -.ant-col-xs-pull-19.ant-col-rtl { - right: auto; - left: 79.16666667%; -} -.ant-col-xs-offset-19.ant-col-rtl { - margin-right: 79.16666667%; - margin-left: 0; -} -.ant-col-xs-push-20.ant-col-rtl { - right: 83.33333333%; - left: auto; -} -.ant-col-xs-pull-20.ant-col-rtl { - right: auto; - left: 83.33333333%; -} -.ant-col-xs-offset-20.ant-col-rtl { - margin-right: 83.33333333%; - margin-left: 0; -} -.ant-col-xs-push-21.ant-col-rtl { - right: 87.5%; - left: auto; -} -.ant-col-xs-pull-21.ant-col-rtl { - right: auto; - left: 87.5%; -} -.ant-col-xs-offset-21.ant-col-rtl { - margin-right: 87.5%; - margin-left: 0; -} -.ant-col-xs-push-22.ant-col-rtl { - right: 91.66666667%; - left: auto; -} -.ant-col-xs-pull-22.ant-col-rtl { - right: auto; - left: 91.66666667%; -} -.ant-col-xs-offset-22.ant-col-rtl { - margin-right: 91.66666667%; - margin-left: 0; -} -.ant-col-xs-push-23.ant-col-rtl { - right: 95.83333333%; - left: auto; -} -.ant-col-xs-pull-23.ant-col-rtl { - right: auto; - left: 95.83333333%; -} -.ant-col-xs-offset-23.ant-col-rtl { - margin-right: 95.83333333%; - margin-left: 0; -} -.ant-col-xs-push-24.ant-col-rtl { - right: 100%; - left: auto; -} -.ant-col-xs-pull-24.ant-col-rtl { - right: auto; - left: 100%; -} -.ant-col-xs-offset-24.ant-col-rtl { - margin-right: 100%; - margin-left: 0; -} -@media (min-width: 576px) { - .ant-col-sm-24 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .ant-col-sm-push-24 { - left: 100%; - } - .ant-col-sm-pull-24 { - right: 100%; - } - .ant-col-sm-offset-24 { - margin-left: 100%; - } - .ant-col-sm-order-24 { - -webkit-box-ordinal-group: 25; - -ms-flex-order: 24; - order: 24; - } - .ant-col-sm-23 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 95.83333333%; - flex: 0 0 95.83333333%; - max-width: 95.83333333%; - } - .ant-col-sm-push-23 { - left: 95.83333333%; - } - .ant-col-sm-pull-23 { - right: 95.83333333%; - } - .ant-col-sm-offset-23 { - margin-left: 95.83333333%; - } - .ant-col-sm-order-23 { - -webkit-box-ordinal-group: 24; - -ms-flex-order: 23; - order: 23; - } - .ant-col-sm-22 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 91.66666667%; - flex: 0 0 91.66666667%; - max-width: 91.66666667%; - } - .ant-col-sm-push-22 { - left: 91.66666667%; - } - .ant-col-sm-pull-22 { - right: 91.66666667%; - } - .ant-col-sm-offset-22 { - margin-left: 91.66666667%; - } - .ant-col-sm-order-22 { - -webkit-box-ordinal-group: 23; - -ms-flex-order: 22; - order: 22; - } - .ant-col-sm-21 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 87.5%; - flex: 0 0 87.5%; - max-width: 87.5%; - } - .ant-col-sm-push-21 { - left: 87.5%; - } - .ant-col-sm-pull-21 { - right: 87.5%; - } - .ant-col-sm-offset-21 { - margin-left: 87.5%; - } - .ant-col-sm-order-21 { - -webkit-box-ordinal-group: 22; - -ms-flex-order: 21; - order: 21; - } - .ant-col-sm-20 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 83.33333333%; - flex: 0 0 83.33333333%; - max-width: 83.33333333%; - } - .ant-col-sm-push-20 { - left: 83.33333333%; - } - .ant-col-sm-pull-20 { - right: 83.33333333%; - } - .ant-col-sm-offset-20 { - margin-left: 83.33333333%; - } - .ant-col-sm-order-20 { - -webkit-box-ordinal-group: 21; - -ms-flex-order: 20; - order: 20; - } - .ant-col-sm-19 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 79.16666667%; - flex: 0 0 79.16666667%; - max-width: 79.16666667%; - } - .ant-col-sm-push-19 { - left: 79.16666667%; - } - .ant-col-sm-pull-19 { - right: 79.16666667%; - } - .ant-col-sm-offset-19 { - margin-left: 79.16666667%; - } - .ant-col-sm-order-19 { - -webkit-box-ordinal-group: 20; - -ms-flex-order: 19; - order: 19; - } - .ant-col-sm-18 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .ant-col-sm-push-18 { - left: 75%; - } - .ant-col-sm-pull-18 { - right: 75%; - } - .ant-col-sm-offset-18 { - margin-left: 75%; - } - .ant-col-sm-order-18 { - -webkit-box-ordinal-group: 19; - -ms-flex-order: 18; - order: 18; - } - .ant-col-sm-17 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 70.83333333%; - flex: 0 0 70.83333333%; - max-width: 70.83333333%; - } - .ant-col-sm-push-17 { - left: 70.83333333%; - } - .ant-col-sm-pull-17 { - right: 70.83333333%; - } - .ant-col-sm-offset-17 { - margin-left: 70.83333333%; - } - .ant-col-sm-order-17 { - -webkit-box-ordinal-group: 18; - -ms-flex-order: 17; - order: 17; - } - .ant-col-sm-16 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 66.66666667%; - flex: 0 0 66.66666667%; - max-width: 66.66666667%; - } - .ant-col-sm-push-16 { - left: 66.66666667%; - } - .ant-col-sm-pull-16 { - right: 66.66666667%; - } - .ant-col-sm-offset-16 { - margin-left: 66.66666667%; - } - .ant-col-sm-order-16 { - -webkit-box-ordinal-group: 17; - -ms-flex-order: 16; - order: 16; - } - .ant-col-sm-15 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 62.5%; - flex: 0 0 62.5%; - max-width: 62.5%; - } - .ant-col-sm-push-15 { - left: 62.5%; - } - .ant-col-sm-pull-15 { - right: 62.5%; - } - .ant-col-sm-offset-15 { - margin-left: 62.5%; - } - .ant-col-sm-order-15 { - -webkit-box-ordinal-group: 16; - -ms-flex-order: 15; - order: 15; - } - .ant-col-sm-14 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 58.33333333%; - flex: 0 0 58.33333333%; - max-width: 58.33333333%; - } - .ant-col-sm-push-14 { - left: 58.33333333%; - } - .ant-col-sm-pull-14 { - right: 58.33333333%; - } - .ant-col-sm-offset-14 { - margin-left: 58.33333333%; - } - .ant-col-sm-order-14 { - -webkit-box-ordinal-group: 15; - -ms-flex-order: 14; - order: 14; - } - .ant-col-sm-13 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 54.16666667%; - flex: 0 0 54.16666667%; - max-width: 54.16666667%; - } - .ant-col-sm-push-13 { - left: 54.16666667%; - } - .ant-col-sm-pull-13 { - right: 54.16666667%; - } - .ant-col-sm-offset-13 { - margin-left: 54.16666667%; - } - .ant-col-sm-order-13 { - -webkit-box-ordinal-group: 14; - -ms-flex-order: 13; - order: 13; - } - .ant-col-sm-12 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .ant-col-sm-push-12 { - left: 50%; - } - .ant-col-sm-pull-12 { - right: 50%; - } - .ant-col-sm-offset-12 { - margin-left: 50%; - } - .ant-col-sm-order-12 { - -webkit-box-ordinal-group: 13; - -ms-flex-order: 12; - order: 12; - } - .ant-col-sm-11 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 45.83333333%; - flex: 0 0 45.83333333%; - max-width: 45.83333333%; - } - .ant-col-sm-push-11 { - left: 45.83333333%; - } - .ant-col-sm-pull-11 { - right: 45.83333333%; - } - .ant-col-sm-offset-11 { - margin-left: 45.83333333%; - } - .ant-col-sm-order-11 { - -webkit-box-ordinal-group: 12; - -ms-flex-order: 11; - order: 11; - } - .ant-col-sm-10 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 41.66666667%; - flex: 0 0 41.66666667%; - max-width: 41.66666667%; - } - .ant-col-sm-push-10 { - left: 41.66666667%; - } - .ant-col-sm-pull-10 { - right: 41.66666667%; - } - .ant-col-sm-offset-10 { - margin-left: 41.66666667%; - } - .ant-col-sm-order-10 { - -webkit-box-ordinal-group: 11; - -ms-flex-order: 10; - order: 10; - } - .ant-col-sm-9 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 37.5%; - flex: 0 0 37.5%; - max-width: 37.5%; - } - .ant-col-sm-push-9 { - left: 37.5%; - } - .ant-col-sm-pull-9 { - right: 37.5%; - } - .ant-col-sm-offset-9 { - margin-left: 37.5%; - } - .ant-col-sm-order-9 { - -webkit-box-ordinal-group: 10; - -ms-flex-order: 9; - order: 9; - } - .ant-col-sm-8 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 33.33333333%; - flex: 0 0 33.33333333%; - max-width: 33.33333333%; - } - .ant-col-sm-push-8 { - left: 33.33333333%; - } - .ant-col-sm-pull-8 { - right: 33.33333333%; - } - .ant-col-sm-offset-8 { - margin-left: 33.33333333%; - } - .ant-col-sm-order-8 { - -webkit-box-ordinal-group: 9; - -ms-flex-order: 8; - order: 8; - } - .ant-col-sm-7 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 29.16666667%; - flex: 0 0 29.16666667%; - max-width: 29.16666667%; - } - .ant-col-sm-push-7 { - left: 29.16666667%; - } - .ant-col-sm-pull-7 { - right: 29.16666667%; - } - .ant-col-sm-offset-7 { - margin-left: 29.16666667%; - } - .ant-col-sm-order-7 { - -webkit-box-ordinal-group: 8; - -ms-flex-order: 7; - order: 7; - } - .ant-col-sm-6 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .ant-col-sm-push-6 { - left: 25%; - } - .ant-col-sm-pull-6 { - right: 25%; - } - .ant-col-sm-offset-6 { - margin-left: 25%; - } - .ant-col-sm-order-6 { - -webkit-box-ordinal-group: 7; - -ms-flex-order: 6; - order: 6; - } - .ant-col-sm-5 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 20.83333333%; - flex: 0 0 20.83333333%; - max-width: 20.83333333%; - } - .ant-col-sm-push-5 { - left: 20.83333333%; - } - .ant-col-sm-pull-5 { - right: 20.83333333%; - } - .ant-col-sm-offset-5 { - margin-left: 20.83333333%; - } - .ant-col-sm-order-5 { - -webkit-box-ordinal-group: 6; - -ms-flex-order: 5; - order: 5; - } - .ant-col-sm-4 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 16.66666667%; - flex: 0 0 16.66666667%; - max-width: 16.66666667%; - } - .ant-col-sm-push-4 { - left: 16.66666667%; - } - .ant-col-sm-pull-4 { - right: 16.66666667%; - } - .ant-col-sm-offset-4 { - margin-left: 16.66666667%; - } - .ant-col-sm-order-4 { - -webkit-box-ordinal-group: 5; - -ms-flex-order: 4; - order: 4; - } - .ant-col-sm-3 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 12.5%; - flex: 0 0 12.5%; - max-width: 12.5%; - } - .ant-col-sm-push-3 { - left: 12.5%; - } - .ant-col-sm-pull-3 { - right: 12.5%; - } - .ant-col-sm-offset-3 { - margin-left: 12.5%; - } - .ant-col-sm-order-3 { - -webkit-box-ordinal-group: 4; - -ms-flex-order: 3; - order: 3; - } - .ant-col-sm-2 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 8.33333333%; - flex: 0 0 8.33333333%; - max-width: 8.33333333%; - } - .ant-col-sm-push-2 { - left: 8.33333333%; - } - .ant-col-sm-pull-2 { - right: 8.33333333%; - } - .ant-col-sm-offset-2 { - margin-left: 8.33333333%; - } - .ant-col-sm-order-2 { - -webkit-box-ordinal-group: 3; - -ms-flex-order: 2; - order: 2; - } - .ant-col-sm-1 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 4.16666667%; - flex: 0 0 4.16666667%; - max-width: 4.16666667%; - } - .ant-col-sm-push-1 { - left: 4.16666667%; - } - .ant-col-sm-pull-1 { - right: 4.16666667%; - } - .ant-col-sm-offset-1 { - margin-left: 4.16666667%; - } - .ant-col-sm-order-1 { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1; - } - .ant-col-sm-0 { - display: none; - } - .ant-col-push-0 { - left: auto; - } - .ant-col-pull-0 { - right: auto; - } - .ant-col-sm-push-0 { - left: auto; - } - .ant-col-sm-pull-0 { - right: auto; - } - .ant-col-sm-offset-0 { - margin-left: 0; - } - .ant-col-sm-order-0 { - -webkit-box-ordinal-group: 1; - -ms-flex-order: 0; - order: 0; - } - .ant-col-push-0.ant-col-rtl { - right: auto; - } - .ant-col-pull-0.ant-col-rtl { - left: auto; - } - .ant-col-sm-push-0.ant-col-rtl { - right: auto; - } - .ant-col-sm-pull-0.ant-col-rtl { - left: auto; - } - .ant-col-sm-offset-0.ant-col-rtl { - margin-right: 0; - } - .ant-col-sm-push-1.ant-col-rtl { - right: 4.16666667%; - left: auto; - } - .ant-col-sm-pull-1.ant-col-rtl { - right: auto; - left: 4.16666667%; - } - .ant-col-sm-offset-1.ant-col-rtl { - margin-right: 4.16666667%; - margin-left: 0; - } - .ant-col-sm-push-2.ant-col-rtl { - right: 8.33333333%; - left: auto; - } - .ant-col-sm-pull-2.ant-col-rtl { - right: auto; - left: 8.33333333%; - } - .ant-col-sm-offset-2.ant-col-rtl { - margin-right: 8.33333333%; - margin-left: 0; - } - .ant-col-sm-push-3.ant-col-rtl { - right: 12.5%; - left: auto; - } - .ant-col-sm-pull-3.ant-col-rtl { - right: auto; - left: 12.5%; - } - .ant-col-sm-offset-3.ant-col-rtl { - margin-right: 12.5%; - margin-left: 0; - } - .ant-col-sm-push-4.ant-col-rtl { - right: 16.66666667%; - left: auto; - } - .ant-col-sm-pull-4.ant-col-rtl { - right: auto; - left: 16.66666667%; - } - .ant-col-sm-offset-4.ant-col-rtl { - margin-right: 16.66666667%; - margin-left: 0; - } - .ant-col-sm-push-5.ant-col-rtl { - right: 20.83333333%; - left: auto; - } - .ant-col-sm-pull-5.ant-col-rtl { - right: auto; - left: 20.83333333%; - } - .ant-col-sm-offset-5.ant-col-rtl { - margin-right: 20.83333333%; - margin-left: 0; - } - .ant-col-sm-push-6.ant-col-rtl { - right: 25%; - left: auto; - } - .ant-col-sm-pull-6.ant-col-rtl { - right: auto; - left: 25%; - } - .ant-col-sm-offset-6.ant-col-rtl { - margin-right: 25%; - margin-left: 0; - } - .ant-col-sm-push-7.ant-col-rtl { - right: 29.16666667%; - left: auto; - } - .ant-col-sm-pull-7.ant-col-rtl { - right: auto; - left: 29.16666667%; - } - .ant-col-sm-offset-7.ant-col-rtl { - margin-right: 29.16666667%; - margin-left: 0; - } - .ant-col-sm-push-8.ant-col-rtl { - right: 33.33333333%; - left: auto; - } - .ant-col-sm-pull-8.ant-col-rtl { - right: auto; - left: 33.33333333%; - } - .ant-col-sm-offset-8.ant-col-rtl { - margin-right: 33.33333333%; - margin-left: 0; - } - .ant-col-sm-push-9.ant-col-rtl { - right: 37.5%; - left: auto; - } - .ant-col-sm-pull-9.ant-col-rtl { - right: auto; - left: 37.5%; - } - .ant-col-sm-offset-9.ant-col-rtl { - margin-right: 37.5%; - margin-left: 0; - } - .ant-col-sm-push-10.ant-col-rtl { - right: 41.66666667%; - left: auto; - } - .ant-col-sm-pull-10.ant-col-rtl { - right: auto; - left: 41.66666667%; - } - .ant-col-sm-offset-10.ant-col-rtl { - margin-right: 41.66666667%; - margin-left: 0; - } - .ant-col-sm-push-11.ant-col-rtl { - right: 45.83333333%; - left: auto; - } - .ant-col-sm-pull-11.ant-col-rtl { - right: auto; - left: 45.83333333%; - } - .ant-col-sm-offset-11.ant-col-rtl { - margin-right: 45.83333333%; - margin-left: 0; - } - .ant-col-sm-push-12.ant-col-rtl { - right: 50%; - left: auto; - } - .ant-col-sm-pull-12.ant-col-rtl { - right: auto; - left: 50%; - } - .ant-col-sm-offset-12.ant-col-rtl { - margin-right: 50%; - margin-left: 0; - } - .ant-col-sm-push-13.ant-col-rtl { - right: 54.16666667%; - left: auto; - } - .ant-col-sm-pull-13.ant-col-rtl { - right: auto; - left: 54.16666667%; - } - .ant-col-sm-offset-13.ant-col-rtl { - margin-right: 54.16666667%; - margin-left: 0; - } - .ant-col-sm-push-14.ant-col-rtl { - right: 58.33333333%; - left: auto; - } - .ant-col-sm-pull-14.ant-col-rtl { - right: auto; - left: 58.33333333%; - } - .ant-col-sm-offset-14.ant-col-rtl { - margin-right: 58.33333333%; - margin-left: 0; - } - .ant-col-sm-push-15.ant-col-rtl { - right: 62.5%; - left: auto; - } - .ant-col-sm-pull-15.ant-col-rtl { - right: auto; - left: 62.5%; - } - .ant-col-sm-offset-15.ant-col-rtl { - margin-right: 62.5%; - margin-left: 0; - } - .ant-col-sm-push-16.ant-col-rtl { - right: 66.66666667%; - left: auto; - } - .ant-col-sm-pull-16.ant-col-rtl { - right: auto; - left: 66.66666667%; - } - .ant-col-sm-offset-16.ant-col-rtl { - margin-right: 66.66666667%; - margin-left: 0; - } - .ant-col-sm-push-17.ant-col-rtl { - right: 70.83333333%; - left: auto; - } - .ant-col-sm-pull-17.ant-col-rtl { - right: auto; - left: 70.83333333%; - } - .ant-col-sm-offset-17.ant-col-rtl { - margin-right: 70.83333333%; - margin-left: 0; - } - .ant-col-sm-push-18.ant-col-rtl { - right: 75%; - left: auto; - } - .ant-col-sm-pull-18.ant-col-rtl { - right: auto; - left: 75%; - } - .ant-col-sm-offset-18.ant-col-rtl { - margin-right: 75%; - margin-left: 0; - } - .ant-col-sm-push-19.ant-col-rtl { - right: 79.16666667%; - left: auto; - } - .ant-col-sm-pull-19.ant-col-rtl { - right: auto; - left: 79.16666667%; - } - .ant-col-sm-offset-19.ant-col-rtl { - margin-right: 79.16666667%; - margin-left: 0; - } - .ant-col-sm-push-20.ant-col-rtl { - right: 83.33333333%; - left: auto; - } - .ant-col-sm-pull-20.ant-col-rtl { - right: auto; - left: 83.33333333%; - } - .ant-col-sm-offset-20.ant-col-rtl { - margin-right: 83.33333333%; - margin-left: 0; - } - .ant-col-sm-push-21.ant-col-rtl { - right: 87.5%; - left: auto; - } - .ant-col-sm-pull-21.ant-col-rtl { - right: auto; - left: 87.5%; - } - .ant-col-sm-offset-21.ant-col-rtl { - margin-right: 87.5%; - margin-left: 0; - } - .ant-col-sm-push-22.ant-col-rtl { - right: 91.66666667%; - left: auto; - } - .ant-col-sm-pull-22.ant-col-rtl { - right: auto; - left: 91.66666667%; - } - .ant-col-sm-offset-22.ant-col-rtl { - margin-right: 91.66666667%; - margin-left: 0; - } - .ant-col-sm-push-23.ant-col-rtl { - right: 95.83333333%; - left: auto; - } - .ant-col-sm-pull-23.ant-col-rtl { - right: auto; - left: 95.83333333%; - } - .ant-col-sm-offset-23.ant-col-rtl { - margin-right: 95.83333333%; - margin-left: 0; - } - .ant-col-sm-push-24.ant-col-rtl { - right: 100%; - left: auto; - } - .ant-col-sm-pull-24.ant-col-rtl { - right: auto; - left: 100%; - } - .ant-col-sm-offset-24.ant-col-rtl { - margin-right: 100%; - margin-left: 0; - } -} -@media (min-width: 768px) { - .ant-col-md-24 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .ant-col-md-push-24 { - left: 100%; - } - .ant-col-md-pull-24 { - right: 100%; - } - .ant-col-md-offset-24 { - margin-left: 100%; - } - .ant-col-md-order-24 { - -webkit-box-ordinal-group: 25; - -ms-flex-order: 24; - order: 24; - } - .ant-col-md-23 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 95.83333333%; - flex: 0 0 95.83333333%; - max-width: 95.83333333%; - } - .ant-col-md-push-23 { - left: 95.83333333%; - } - .ant-col-md-pull-23 { - right: 95.83333333%; - } - .ant-col-md-offset-23 { - margin-left: 95.83333333%; - } - .ant-col-md-order-23 { - -webkit-box-ordinal-group: 24; - -ms-flex-order: 23; - order: 23; - } - .ant-col-md-22 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 91.66666667%; - flex: 0 0 91.66666667%; - max-width: 91.66666667%; - } - .ant-col-md-push-22 { - left: 91.66666667%; - } - .ant-col-md-pull-22 { - right: 91.66666667%; - } - .ant-col-md-offset-22 { - margin-left: 91.66666667%; - } - .ant-col-md-order-22 { - -webkit-box-ordinal-group: 23; - -ms-flex-order: 22; - order: 22; - } - .ant-col-md-21 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 87.5%; - flex: 0 0 87.5%; - max-width: 87.5%; - } - .ant-col-md-push-21 { - left: 87.5%; - } - .ant-col-md-pull-21 { - right: 87.5%; - } - .ant-col-md-offset-21 { - margin-left: 87.5%; - } - .ant-col-md-order-21 { - -webkit-box-ordinal-group: 22; - -ms-flex-order: 21; - order: 21; - } - .ant-col-md-20 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 83.33333333%; - flex: 0 0 83.33333333%; - max-width: 83.33333333%; - } - .ant-col-md-push-20 { - left: 83.33333333%; - } - .ant-col-md-pull-20 { - right: 83.33333333%; - } - .ant-col-md-offset-20 { - margin-left: 83.33333333%; - } - .ant-col-md-order-20 { - -webkit-box-ordinal-group: 21; - -ms-flex-order: 20; - order: 20; - } - .ant-col-md-19 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 79.16666667%; - flex: 0 0 79.16666667%; - max-width: 79.16666667%; - } - .ant-col-md-push-19 { - left: 79.16666667%; - } - .ant-col-md-pull-19 { - right: 79.16666667%; - } - .ant-col-md-offset-19 { - margin-left: 79.16666667%; - } - .ant-col-md-order-19 { - -webkit-box-ordinal-group: 20; - -ms-flex-order: 19; - order: 19; - } - .ant-col-md-18 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .ant-col-md-push-18 { - left: 75%; - } - .ant-col-md-pull-18 { - right: 75%; - } - .ant-col-md-offset-18 { - margin-left: 75%; - } - .ant-col-md-order-18 { - -webkit-box-ordinal-group: 19; - -ms-flex-order: 18; - order: 18; - } - .ant-col-md-17 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 70.83333333%; - flex: 0 0 70.83333333%; - max-width: 70.83333333%; - } - .ant-col-md-push-17 { - left: 70.83333333%; - } - .ant-col-md-pull-17 { - right: 70.83333333%; - } - .ant-col-md-offset-17 { - margin-left: 70.83333333%; - } - .ant-col-md-order-17 { - -webkit-box-ordinal-group: 18; - -ms-flex-order: 17; - order: 17; - } - .ant-col-md-16 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 66.66666667%; - flex: 0 0 66.66666667%; - max-width: 66.66666667%; - } - .ant-col-md-push-16 { - left: 66.66666667%; - } - .ant-col-md-pull-16 { - right: 66.66666667%; - } - .ant-col-md-offset-16 { - margin-left: 66.66666667%; - } - .ant-col-md-order-16 { - -webkit-box-ordinal-group: 17; - -ms-flex-order: 16; - order: 16; - } - .ant-col-md-15 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 62.5%; - flex: 0 0 62.5%; - max-width: 62.5%; - } - .ant-col-md-push-15 { - left: 62.5%; - } - .ant-col-md-pull-15 { - right: 62.5%; - } - .ant-col-md-offset-15 { - margin-left: 62.5%; - } - .ant-col-md-order-15 { - -webkit-box-ordinal-group: 16; - -ms-flex-order: 15; - order: 15; - } - .ant-col-md-14 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 58.33333333%; - flex: 0 0 58.33333333%; - max-width: 58.33333333%; - } - .ant-col-md-push-14 { - left: 58.33333333%; - } - .ant-col-md-pull-14 { - right: 58.33333333%; - } - .ant-col-md-offset-14 { - margin-left: 58.33333333%; - } - .ant-col-md-order-14 { - -webkit-box-ordinal-group: 15; - -ms-flex-order: 14; - order: 14; - } - .ant-col-md-13 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 54.16666667%; - flex: 0 0 54.16666667%; - max-width: 54.16666667%; - } - .ant-col-md-push-13 { - left: 54.16666667%; - } - .ant-col-md-pull-13 { - right: 54.16666667%; - } - .ant-col-md-offset-13 { - margin-left: 54.16666667%; - } - .ant-col-md-order-13 { - -webkit-box-ordinal-group: 14; - -ms-flex-order: 13; - order: 13; - } - .ant-col-md-12 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .ant-col-md-push-12 { - left: 50%; - } - .ant-col-md-pull-12 { - right: 50%; - } - .ant-col-md-offset-12 { - margin-left: 50%; - } - .ant-col-md-order-12 { - -webkit-box-ordinal-group: 13; - -ms-flex-order: 12; - order: 12; - } - .ant-col-md-11 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 45.83333333%; - flex: 0 0 45.83333333%; - max-width: 45.83333333%; - } - .ant-col-md-push-11 { - left: 45.83333333%; - } - .ant-col-md-pull-11 { - right: 45.83333333%; - } - .ant-col-md-offset-11 { - margin-left: 45.83333333%; - } - .ant-col-md-order-11 { - -webkit-box-ordinal-group: 12; - -ms-flex-order: 11; - order: 11; - } - .ant-col-md-10 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 41.66666667%; - flex: 0 0 41.66666667%; - max-width: 41.66666667%; - } - .ant-col-md-push-10 { - left: 41.66666667%; - } - .ant-col-md-pull-10 { - right: 41.66666667%; - } - .ant-col-md-offset-10 { - margin-left: 41.66666667%; - } - .ant-col-md-order-10 { - -webkit-box-ordinal-group: 11; - -ms-flex-order: 10; - order: 10; - } - .ant-col-md-9 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 37.5%; - flex: 0 0 37.5%; - max-width: 37.5%; - } - .ant-col-md-push-9 { - left: 37.5%; - } - .ant-col-md-pull-9 { - right: 37.5%; - } - .ant-col-md-offset-9 { - margin-left: 37.5%; - } - .ant-col-md-order-9 { - -webkit-box-ordinal-group: 10; - -ms-flex-order: 9; - order: 9; - } - .ant-col-md-8 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 33.33333333%; - flex: 0 0 33.33333333%; - max-width: 33.33333333%; - } - .ant-col-md-push-8 { - left: 33.33333333%; - } - .ant-col-md-pull-8 { - right: 33.33333333%; - } - .ant-col-md-offset-8 { - margin-left: 33.33333333%; - } - .ant-col-md-order-8 { - -webkit-box-ordinal-group: 9; - -ms-flex-order: 8; - order: 8; - } - .ant-col-md-7 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 29.16666667%; - flex: 0 0 29.16666667%; - max-width: 29.16666667%; - } - .ant-col-md-push-7 { - left: 29.16666667%; - } - .ant-col-md-pull-7 { - right: 29.16666667%; - } - .ant-col-md-offset-7 { - margin-left: 29.16666667%; - } - .ant-col-md-order-7 { - -webkit-box-ordinal-group: 8; - -ms-flex-order: 7; - order: 7; - } - .ant-col-md-6 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .ant-col-md-push-6 { - left: 25%; - } - .ant-col-md-pull-6 { - right: 25%; - } - .ant-col-md-offset-6 { - margin-left: 25%; - } - .ant-col-md-order-6 { - -webkit-box-ordinal-group: 7; - -ms-flex-order: 6; - order: 6; - } - .ant-col-md-5 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 20.83333333%; - flex: 0 0 20.83333333%; - max-width: 20.83333333%; - } - .ant-col-md-push-5 { - left: 20.83333333%; - } - .ant-col-md-pull-5 { - right: 20.83333333%; - } - .ant-col-md-offset-5 { - margin-left: 20.83333333%; - } - .ant-col-md-order-5 { - -webkit-box-ordinal-group: 6; - -ms-flex-order: 5; - order: 5; - } - .ant-col-md-4 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 16.66666667%; - flex: 0 0 16.66666667%; - max-width: 16.66666667%; - } - .ant-col-md-push-4 { - left: 16.66666667%; - } - .ant-col-md-pull-4 { - right: 16.66666667%; - } - .ant-col-md-offset-4 { - margin-left: 16.66666667%; - } - .ant-col-md-order-4 { - -webkit-box-ordinal-group: 5; - -ms-flex-order: 4; - order: 4; - } - .ant-col-md-3 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 12.5%; - flex: 0 0 12.5%; - max-width: 12.5%; - } - .ant-col-md-push-3 { - left: 12.5%; - } - .ant-col-md-pull-3 { - right: 12.5%; - } - .ant-col-md-offset-3 { - margin-left: 12.5%; - } - .ant-col-md-order-3 { - -webkit-box-ordinal-group: 4; - -ms-flex-order: 3; - order: 3; - } - .ant-col-md-2 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 8.33333333%; - flex: 0 0 8.33333333%; - max-width: 8.33333333%; - } - .ant-col-md-push-2 { - left: 8.33333333%; - } - .ant-col-md-pull-2 { - right: 8.33333333%; - } - .ant-col-md-offset-2 { - margin-left: 8.33333333%; - } - .ant-col-md-order-2 { - -webkit-box-ordinal-group: 3; - -ms-flex-order: 2; - order: 2; - } - .ant-col-md-1 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 4.16666667%; - flex: 0 0 4.16666667%; - max-width: 4.16666667%; - } - .ant-col-md-push-1 { - left: 4.16666667%; - } - .ant-col-md-pull-1 { - right: 4.16666667%; - } - .ant-col-md-offset-1 { - margin-left: 4.16666667%; - } - .ant-col-md-order-1 { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1; - } - .ant-col-md-0 { - display: none; - } - .ant-col-push-0 { - left: auto; - } - .ant-col-pull-0 { - right: auto; - } - .ant-col-md-push-0 { - left: auto; - } - .ant-col-md-pull-0 { - right: auto; - } - .ant-col-md-offset-0 { - margin-left: 0; - } - .ant-col-md-order-0 { - -webkit-box-ordinal-group: 1; - -ms-flex-order: 0; - order: 0; - } - .ant-col-push-0.ant-col-rtl { - right: auto; - } - .ant-col-pull-0.ant-col-rtl { - left: auto; - } - .ant-col-md-push-0.ant-col-rtl { - right: auto; - } - .ant-col-md-pull-0.ant-col-rtl { - left: auto; - } - .ant-col-md-offset-0.ant-col-rtl { - margin-right: 0; - } - .ant-col-md-push-1.ant-col-rtl { - right: 4.16666667%; - left: auto; - } - .ant-col-md-pull-1.ant-col-rtl { - right: auto; - left: 4.16666667%; - } - .ant-col-md-offset-1.ant-col-rtl { - margin-right: 4.16666667%; - margin-left: 0; - } - .ant-col-md-push-2.ant-col-rtl { - right: 8.33333333%; - left: auto; - } - .ant-col-md-pull-2.ant-col-rtl { - right: auto; - left: 8.33333333%; - } - .ant-col-md-offset-2.ant-col-rtl { - margin-right: 8.33333333%; - margin-left: 0; - } - .ant-col-md-push-3.ant-col-rtl { - right: 12.5%; - left: auto; - } - .ant-col-md-pull-3.ant-col-rtl { - right: auto; - left: 12.5%; - } - .ant-col-md-offset-3.ant-col-rtl { - margin-right: 12.5%; - margin-left: 0; - } - .ant-col-md-push-4.ant-col-rtl { - right: 16.66666667%; - left: auto; - } - .ant-col-md-pull-4.ant-col-rtl { - right: auto; - left: 16.66666667%; - } - .ant-col-md-offset-4.ant-col-rtl { - margin-right: 16.66666667%; - margin-left: 0; - } - .ant-col-md-push-5.ant-col-rtl { - right: 20.83333333%; - left: auto; - } - .ant-col-md-pull-5.ant-col-rtl { - right: auto; - left: 20.83333333%; - } - .ant-col-md-offset-5.ant-col-rtl { - margin-right: 20.83333333%; - margin-left: 0; - } - .ant-col-md-push-6.ant-col-rtl { - right: 25%; - left: auto; - } - .ant-col-md-pull-6.ant-col-rtl { - right: auto; - left: 25%; - } - .ant-col-md-offset-6.ant-col-rtl { - margin-right: 25%; - margin-left: 0; - } - .ant-col-md-push-7.ant-col-rtl { - right: 29.16666667%; - left: auto; - } - .ant-col-md-pull-7.ant-col-rtl { - right: auto; - left: 29.16666667%; - } - .ant-col-md-offset-7.ant-col-rtl { - margin-right: 29.16666667%; - margin-left: 0; - } - .ant-col-md-push-8.ant-col-rtl { - right: 33.33333333%; - left: auto; - } - .ant-col-md-pull-8.ant-col-rtl { - right: auto; - left: 33.33333333%; - } - .ant-col-md-offset-8.ant-col-rtl { - margin-right: 33.33333333%; - margin-left: 0; - } - .ant-col-md-push-9.ant-col-rtl { - right: 37.5%; - left: auto; - } - .ant-col-md-pull-9.ant-col-rtl { - right: auto; - left: 37.5%; - } - .ant-col-md-offset-9.ant-col-rtl { - margin-right: 37.5%; - margin-left: 0; - } - .ant-col-md-push-10.ant-col-rtl { - right: 41.66666667%; - left: auto; - } - .ant-col-md-pull-10.ant-col-rtl { - right: auto; - left: 41.66666667%; - } - .ant-col-md-offset-10.ant-col-rtl { - margin-right: 41.66666667%; - margin-left: 0; - } - .ant-col-md-push-11.ant-col-rtl { - right: 45.83333333%; - left: auto; - } - .ant-col-md-pull-11.ant-col-rtl { - right: auto; - left: 45.83333333%; - } - .ant-col-md-offset-11.ant-col-rtl { - margin-right: 45.83333333%; - margin-left: 0; - } - .ant-col-md-push-12.ant-col-rtl { - right: 50%; - left: auto; - } - .ant-col-md-pull-12.ant-col-rtl { - right: auto; - left: 50%; - } - .ant-col-md-offset-12.ant-col-rtl { - margin-right: 50%; - margin-left: 0; - } - .ant-col-md-push-13.ant-col-rtl { - right: 54.16666667%; - left: auto; - } - .ant-col-md-pull-13.ant-col-rtl { - right: auto; - left: 54.16666667%; - } - .ant-col-md-offset-13.ant-col-rtl { - margin-right: 54.16666667%; - margin-left: 0; - } - .ant-col-md-push-14.ant-col-rtl { - right: 58.33333333%; - left: auto; - } - .ant-col-md-pull-14.ant-col-rtl { - right: auto; - left: 58.33333333%; - } - .ant-col-md-offset-14.ant-col-rtl { - margin-right: 58.33333333%; - margin-left: 0; - } - .ant-col-md-push-15.ant-col-rtl { - right: 62.5%; - left: auto; - } - .ant-col-md-pull-15.ant-col-rtl { - right: auto; - left: 62.5%; - } - .ant-col-md-offset-15.ant-col-rtl { - margin-right: 62.5%; - margin-left: 0; - } - .ant-col-md-push-16.ant-col-rtl { - right: 66.66666667%; - left: auto; - } - .ant-col-md-pull-16.ant-col-rtl { - right: auto; - left: 66.66666667%; - } - .ant-col-md-offset-16.ant-col-rtl { - margin-right: 66.66666667%; - margin-left: 0; - } - .ant-col-md-push-17.ant-col-rtl { - right: 70.83333333%; - left: auto; - } - .ant-col-md-pull-17.ant-col-rtl { - right: auto; - left: 70.83333333%; - } - .ant-col-md-offset-17.ant-col-rtl { - margin-right: 70.83333333%; - margin-left: 0; - } - .ant-col-md-push-18.ant-col-rtl { - right: 75%; - left: auto; - } - .ant-col-md-pull-18.ant-col-rtl { - right: auto; - left: 75%; - } - .ant-col-md-offset-18.ant-col-rtl { - margin-right: 75%; - margin-left: 0; - } - .ant-col-md-push-19.ant-col-rtl { - right: 79.16666667%; - left: auto; - } - .ant-col-md-pull-19.ant-col-rtl { - right: auto; - left: 79.16666667%; - } - .ant-col-md-offset-19.ant-col-rtl { - margin-right: 79.16666667%; - margin-left: 0; - } - .ant-col-md-push-20.ant-col-rtl { - right: 83.33333333%; - left: auto; - } - .ant-col-md-pull-20.ant-col-rtl { - right: auto; - left: 83.33333333%; - } - .ant-col-md-offset-20.ant-col-rtl { - margin-right: 83.33333333%; - margin-left: 0; - } - .ant-col-md-push-21.ant-col-rtl { - right: 87.5%; - left: auto; - } - .ant-col-md-pull-21.ant-col-rtl { - right: auto; - left: 87.5%; - } - .ant-col-md-offset-21.ant-col-rtl { - margin-right: 87.5%; - margin-left: 0; - } - .ant-col-md-push-22.ant-col-rtl { - right: 91.66666667%; - left: auto; - } - .ant-col-md-pull-22.ant-col-rtl { - right: auto; - left: 91.66666667%; - } - .ant-col-md-offset-22.ant-col-rtl { - margin-right: 91.66666667%; - margin-left: 0; - } - .ant-col-md-push-23.ant-col-rtl { - right: 95.83333333%; - left: auto; - } - .ant-col-md-pull-23.ant-col-rtl { - right: auto; - left: 95.83333333%; - } - .ant-col-md-offset-23.ant-col-rtl { - margin-right: 95.83333333%; - margin-left: 0; - } - .ant-col-md-push-24.ant-col-rtl { - right: 100%; - left: auto; - } - .ant-col-md-pull-24.ant-col-rtl { - right: auto; - left: 100%; - } - .ant-col-md-offset-24.ant-col-rtl { - margin-right: 100%; - margin-left: 0; - } -} -@media (min-width: 992px) { - .ant-col-lg-24 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .ant-col-lg-push-24 { - left: 100%; - } - .ant-col-lg-pull-24 { - right: 100%; - } - .ant-col-lg-offset-24 { - margin-left: 100%; - } - .ant-col-lg-order-24 { - -webkit-box-ordinal-group: 25; - -ms-flex-order: 24; - order: 24; - } - .ant-col-lg-23 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 95.83333333%; - flex: 0 0 95.83333333%; - max-width: 95.83333333%; - } - .ant-col-lg-push-23 { - left: 95.83333333%; - } - .ant-col-lg-pull-23 { - right: 95.83333333%; - } - .ant-col-lg-offset-23 { - margin-left: 95.83333333%; - } - .ant-col-lg-order-23 { - -webkit-box-ordinal-group: 24; - -ms-flex-order: 23; - order: 23; - } - .ant-col-lg-22 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 91.66666667%; - flex: 0 0 91.66666667%; - max-width: 91.66666667%; - } - .ant-col-lg-push-22 { - left: 91.66666667%; - } - .ant-col-lg-pull-22 { - right: 91.66666667%; - } - .ant-col-lg-offset-22 { - margin-left: 91.66666667%; - } - .ant-col-lg-order-22 { - -webkit-box-ordinal-group: 23; - -ms-flex-order: 22; - order: 22; - } - .ant-col-lg-21 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 87.5%; - flex: 0 0 87.5%; - max-width: 87.5%; - } - .ant-col-lg-push-21 { - left: 87.5%; - } - .ant-col-lg-pull-21 { - right: 87.5%; - } - .ant-col-lg-offset-21 { - margin-left: 87.5%; - } - .ant-col-lg-order-21 { - -webkit-box-ordinal-group: 22; - -ms-flex-order: 21; - order: 21; - } - .ant-col-lg-20 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 83.33333333%; - flex: 0 0 83.33333333%; - max-width: 83.33333333%; - } - .ant-col-lg-push-20 { - left: 83.33333333%; - } - .ant-col-lg-pull-20 { - right: 83.33333333%; - } - .ant-col-lg-offset-20 { - margin-left: 83.33333333%; - } - .ant-col-lg-order-20 { - -webkit-box-ordinal-group: 21; - -ms-flex-order: 20; - order: 20; - } - .ant-col-lg-19 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 79.16666667%; - flex: 0 0 79.16666667%; - max-width: 79.16666667%; - } - .ant-col-lg-push-19 { - left: 79.16666667%; - } - .ant-col-lg-pull-19 { - right: 79.16666667%; - } - .ant-col-lg-offset-19 { - margin-left: 79.16666667%; - } - .ant-col-lg-order-19 { - -webkit-box-ordinal-group: 20; - -ms-flex-order: 19; - order: 19; - } - .ant-col-lg-18 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .ant-col-lg-push-18 { - left: 75%; - } - .ant-col-lg-pull-18 { - right: 75%; - } - .ant-col-lg-offset-18 { - margin-left: 75%; - } - .ant-col-lg-order-18 { - -webkit-box-ordinal-group: 19; - -ms-flex-order: 18; - order: 18; - } - .ant-col-lg-17 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 70.83333333%; - flex: 0 0 70.83333333%; - max-width: 70.83333333%; - } - .ant-col-lg-push-17 { - left: 70.83333333%; - } - .ant-col-lg-pull-17 { - right: 70.83333333%; - } - .ant-col-lg-offset-17 { - margin-left: 70.83333333%; - } - .ant-col-lg-order-17 { - -webkit-box-ordinal-group: 18; - -ms-flex-order: 17; - order: 17; - } - .ant-col-lg-16 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 66.66666667%; - flex: 0 0 66.66666667%; - max-width: 66.66666667%; - } - .ant-col-lg-push-16 { - left: 66.66666667%; - } - .ant-col-lg-pull-16 { - right: 66.66666667%; - } - .ant-col-lg-offset-16 { - margin-left: 66.66666667%; - } - .ant-col-lg-order-16 { - -webkit-box-ordinal-group: 17; - -ms-flex-order: 16; - order: 16; - } - .ant-col-lg-15 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 62.5%; - flex: 0 0 62.5%; - max-width: 62.5%; - } - .ant-col-lg-push-15 { - left: 62.5%; - } - .ant-col-lg-pull-15 { - right: 62.5%; - } - .ant-col-lg-offset-15 { - margin-left: 62.5%; - } - .ant-col-lg-order-15 { - -webkit-box-ordinal-group: 16; - -ms-flex-order: 15; - order: 15; - } - .ant-col-lg-14 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 58.33333333%; - flex: 0 0 58.33333333%; - max-width: 58.33333333%; - } - .ant-col-lg-push-14 { - left: 58.33333333%; - } - .ant-col-lg-pull-14 { - right: 58.33333333%; - } - .ant-col-lg-offset-14 { - margin-left: 58.33333333%; - } - .ant-col-lg-order-14 { - -webkit-box-ordinal-group: 15; - -ms-flex-order: 14; - order: 14; - } - .ant-col-lg-13 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 54.16666667%; - flex: 0 0 54.16666667%; - max-width: 54.16666667%; - } - .ant-col-lg-push-13 { - left: 54.16666667%; - } - .ant-col-lg-pull-13 { - right: 54.16666667%; - } - .ant-col-lg-offset-13 { - margin-left: 54.16666667%; - } - .ant-col-lg-order-13 { - -webkit-box-ordinal-group: 14; - -ms-flex-order: 13; - order: 13; - } - .ant-col-lg-12 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .ant-col-lg-push-12 { - left: 50%; - } - .ant-col-lg-pull-12 { - right: 50%; - } - .ant-col-lg-offset-12 { - margin-left: 50%; - } - .ant-col-lg-order-12 { - -webkit-box-ordinal-group: 13; - -ms-flex-order: 12; - order: 12; - } - .ant-col-lg-11 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 45.83333333%; - flex: 0 0 45.83333333%; - max-width: 45.83333333%; - } - .ant-col-lg-push-11 { - left: 45.83333333%; - } - .ant-col-lg-pull-11 { - right: 45.83333333%; - } - .ant-col-lg-offset-11 { - margin-left: 45.83333333%; - } - .ant-col-lg-order-11 { - -webkit-box-ordinal-group: 12; - -ms-flex-order: 11; - order: 11; - } - .ant-col-lg-10 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 41.66666667%; - flex: 0 0 41.66666667%; - max-width: 41.66666667%; - } - .ant-col-lg-push-10 { - left: 41.66666667%; - } - .ant-col-lg-pull-10 { - right: 41.66666667%; - } - .ant-col-lg-offset-10 { - margin-left: 41.66666667%; - } - .ant-col-lg-order-10 { - -webkit-box-ordinal-group: 11; - -ms-flex-order: 10; - order: 10; - } - .ant-col-lg-9 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 37.5%; - flex: 0 0 37.5%; - max-width: 37.5%; - } - .ant-col-lg-push-9 { - left: 37.5%; - } - .ant-col-lg-pull-9 { - right: 37.5%; - } - .ant-col-lg-offset-9 { - margin-left: 37.5%; - } - .ant-col-lg-order-9 { - -webkit-box-ordinal-group: 10; - -ms-flex-order: 9; - order: 9; - } - .ant-col-lg-8 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 33.33333333%; - flex: 0 0 33.33333333%; - max-width: 33.33333333%; - } - .ant-col-lg-push-8 { - left: 33.33333333%; - } - .ant-col-lg-pull-8 { - right: 33.33333333%; - } - .ant-col-lg-offset-8 { - margin-left: 33.33333333%; - } - .ant-col-lg-order-8 { - -webkit-box-ordinal-group: 9; - -ms-flex-order: 8; - order: 8; - } - .ant-col-lg-7 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 29.16666667%; - flex: 0 0 29.16666667%; - max-width: 29.16666667%; - } - .ant-col-lg-push-7 { - left: 29.16666667%; - } - .ant-col-lg-pull-7 { - right: 29.16666667%; - } - .ant-col-lg-offset-7 { - margin-left: 29.16666667%; - } - .ant-col-lg-order-7 { - -webkit-box-ordinal-group: 8; - -ms-flex-order: 7; - order: 7; - } - .ant-col-lg-6 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .ant-col-lg-push-6 { - left: 25%; - } - .ant-col-lg-pull-6 { - right: 25%; - } - .ant-col-lg-offset-6 { - margin-left: 25%; - } - .ant-col-lg-order-6 { - -webkit-box-ordinal-group: 7; - -ms-flex-order: 6; - order: 6; - } - .ant-col-lg-5 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 20.83333333%; - flex: 0 0 20.83333333%; - max-width: 20.83333333%; - } - .ant-col-lg-push-5 { - left: 20.83333333%; - } - .ant-col-lg-pull-5 { - right: 20.83333333%; - } - .ant-col-lg-offset-5 { - margin-left: 20.83333333%; - } - .ant-col-lg-order-5 { - -webkit-box-ordinal-group: 6; - -ms-flex-order: 5; - order: 5; - } - .ant-col-lg-4 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 16.66666667%; - flex: 0 0 16.66666667%; - max-width: 16.66666667%; - } - .ant-col-lg-push-4 { - left: 16.66666667%; - } - .ant-col-lg-pull-4 { - right: 16.66666667%; - } - .ant-col-lg-offset-4 { - margin-left: 16.66666667%; - } - .ant-col-lg-order-4 { - -webkit-box-ordinal-group: 5; - -ms-flex-order: 4; - order: 4; - } - .ant-col-lg-3 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 12.5%; - flex: 0 0 12.5%; - max-width: 12.5%; - } - .ant-col-lg-push-3 { - left: 12.5%; - } - .ant-col-lg-pull-3 { - right: 12.5%; - } - .ant-col-lg-offset-3 { - margin-left: 12.5%; - } - .ant-col-lg-order-3 { - -webkit-box-ordinal-group: 4; - -ms-flex-order: 3; - order: 3; - } - .ant-col-lg-2 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 8.33333333%; - flex: 0 0 8.33333333%; - max-width: 8.33333333%; - } - .ant-col-lg-push-2 { - left: 8.33333333%; - } - .ant-col-lg-pull-2 { - right: 8.33333333%; - } - .ant-col-lg-offset-2 { - margin-left: 8.33333333%; - } - .ant-col-lg-order-2 { - -webkit-box-ordinal-group: 3; - -ms-flex-order: 2; - order: 2; - } - .ant-col-lg-1 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 4.16666667%; - flex: 0 0 4.16666667%; - max-width: 4.16666667%; - } - .ant-col-lg-push-1 { - left: 4.16666667%; - } - .ant-col-lg-pull-1 { - right: 4.16666667%; - } - .ant-col-lg-offset-1 { - margin-left: 4.16666667%; - } - .ant-col-lg-order-1 { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1; - } - .ant-col-lg-0 { - display: none; - } - .ant-col-push-0 { - left: auto; - } - .ant-col-pull-0 { - right: auto; - } - .ant-col-lg-push-0 { - left: auto; - } - .ant-col-lg-pull-0 { - right: auto; - } - .ant-col-lg-offset-0 { - margin-left: 0; - } - .ant-col-lg-order-0 { - -webkit-box-ordinal-group: 1; - -ms-flex-order: 0; - order: 0; - } - .ant-col-push-0.ant-col-rtl { - right: auto; - } - .ant-col-pull-0.ant-col-rtl { - left: auto; - } - .ant-col-lg-push-0.ant-col-rtl { - right: auto; - } - .ant-col-lg-pull-0.ant-col-rtl { - left: auto; - } - .ant-col-lg-offset-0.ant-col-rtl { - margin-right: 0; - } - .ant-col-lg-push-1.ant-col-rtl { - right: 4.16666667%; - left: auto; - } - .ant-col-lg-pull-1.ant-col-rtl { - right: auto; - left: 4.16666667%; - } - .ant-col-lg-offset-1.ant-col-rtl { - margin-right: 4.16666667%; - margin-left: 0; - } - .ant-col-lg-push-2.ant-col-rtl { - right: 8.33333333%; - left: auto; - } - .ant-col-lg-pull-2.ant-col-rtl { - right: auto; - left: 8.33333333%; - } - .ant-col-lg-offset-2.ant-col-rtl { - margin-right: 8.33333333%; - margin-left: 0; - } - .ant-col-lg-push-3.ant-col-rtl { - right: 12.5%; - left: auto; - } - .ant-col-lg-pull-3.ant-col-rtl { - right: auto; - left: 12.5%; - } - .ant-col-lg-offset-3.ant-col-rtl { - margin-right: 12.5%; - margin-left: 0; - } - .ant-col-lg-push-4.ant-col-rtl { - right: 16.66666667%; - left: auto; - } - .ant-col-lg-pull-4.ant-col-rtl { - right: auto; - left: 16.66666667%; - } - .ant-col-lg-offset-4.ant-col-rtl { - margin-right: 16.66666667%; - margin-left: 0; - } - .ant-col-lg-push-5.ant-col-rtl { - right: 20.83333333%; - left: auto; - } - .ant-col-lg-pull-5.ant-col-rtl { - right: auto; - left: 20.83333333%; - } - .ant-col-lg-offset-5.ant-col-rtl { - margin-right: 20.83333333%; - margin-left: 0; - } - .ant-col-lg-push-6.ant-col-rtl { - right: 25%; - left: auto; - } - .ant-col-lg-pull-6.ant-col-rtl { - right: auto; - left: 25%; - } - .ant-col-lg-offset-6.ant-col-rtl { - margin-right: 25%; - margin-left: 0; - } - .ant-col-lg-push-7.ant-col-rtl { - right: 29.16666667%; - left: auto; - } - .ant-col-lg-pull-7.ant-col-rtl { - right: auto; - left: 29.16666667%; - } - .ant-col-lg-offset-7.ant-col-rtl { - margin-right: 29.16666667%; - margin-left: 0; - } - .ant-col-lg-push-8.ant-col-rtl { - right: 33.33333333%; - left: auto; - } - .ant-col-lg-pull-8.ant-col-rtl { - right: auto; - left: 33.33333333%; - } - .ant-col-lg-offset-8.ant-col-rtl { - margin-right: 33.33333333%; - margin-left: 0; - } - .ant-col-lg-push-9.ant-col-rtl { - right: 37.5%; - left: auto; - } - .ant-col-lg-pull-9.ant-col-rtl { - right: auto; - left: 37.5%; - } - .ant-col-lg-offset-9.ant-col-rtl { - margin-right: 37.5%; - margin-left: 0; - } - .ant-col-lg-push-10.ant-col-rtl { - right: 41.66666667%; - left: auto; - } - .ant-col-lg-pull-10.ant-col-rtl { - right: auto; - left: 41.66666667%; - } - .ant-col-lg-offset-10.ant-col-rtl { - margin-right: 41.66666667%; - margin-left: 0; - } - .ant-col-lg-push-11.ant-col-rtl { - right: 45.83333333%; - left: auto; - } - .ant-col-lg-pull-11.ant-col-rtl { - right: auto; - left: 45.83333333%; - } - .ant-col-lg-offset-11.ant-col-rtl { - margin-right: 45.83333333%; - margin-left: 0; - } - .ant-col-lg-push-12.ant-col-rtl { - right: 50%; - left: auto; - } - .ant-col-lg-pull-12.ant-col-rtl { - right: auto; - left: 50%; - } - .ant-col-lg-offset-12.ant-col-rtl { - margin-right: 50%; - margin-left: 0; - } - .ant-col-lg-push-13.ant-col-rtl { - right: 54.16666667%; - left: auto; - } - .ant-col-lg-pull-13.ant-col-rtl { - right: auto; - left: 54.16666667%; - } - .ant-col-lg-offset-13.ant-col-rtl { - margin-right: 54.16666667%; - margin-left: 0; - } - .ant-col-lg-push-14.ant-col-rtl { - right: 58.33333333%; - left: auto; - } - .ant-col-lg-pull-14.ant-col-rtl { - right: auto; - left: 58.33333333%; - } - .ant-col-lg-offset-14.ant-col-rtl { - margin-right: 58.33333333%; - margin-left: 0; - } - .ant-col-lg-push-15.ant-col-rtl { - right: 62.5%; - left: auto; - } - .ant-col-lg-pull-15.ant-col-rtl { - right: auto; - left: 62.5%; - } - .ant-col-lg-offset-15.ant-col-rtl { - margin-right: 62.5%; - margin-left: 0; - } - .ant-col-lg-push-16.ant-col-rtl { - right: 66.66666667%; - left: auto; - } - .ant-col-lg-pull-16.ant-col-rtl { - right: auto; - left: 66.66666667%; - } - .ant-col-lg-offset-16.ant-col-rtl { - margin-right: 66.66666667%; - margin-left: 0; - } - .ant-col-lg-push-17.ant-col-rtl { - right: 70.83333333%; - left: auto; - } - .ant-col-lg-pull-17.ant-col-rtl { - right: auto; - left: 70.83333333%; - } - .ant-col-lg-offset-17.ant-col-rtl { - margin-right: 70.83333333%; - margin-left: 0; - } - .ant-col-lg-push-18.ant-col-rtl { - right: 75%; - left: auto; - } - .ant-col-lg-pull-18.ant-col-rtl { - right: auto; - left: 75%; - } - .ant-col-lg-offset-18.ant-col-rtl { - margin-right: 75%; - margin-left: 0; - } - .ant-col-lg-push-19.ant-col-rtl { - right: 79.16666667%; - left: auto; - } - .ant-col-lg-pull-19.ant-col-rtl { - right: auto; - left: 79.16666667%; - } - .ant-col-lg-offset-19.ant-col-rtl { - margin-right: 79.16666667%; - margin-left: 0; - } - .ant-col-lg-push-20.ant-col-rtl { - right: 83.33333333%; - left: auto; - } - .ant-col-lg-pull-20.ant-col-rtl { - right: auto; - left: 83.33333333%; - } - .ant-col-lg-offset-20.ant-col-rtl { - margin-right: 83.33333333%; - margin-left: 0; - } - .ant-col-lg-push-21.ant-col-rtl { - right: 87.5%; - left: auto; - } - .ant-col-lg-pull-21.ant-col-rtl { - right: auto; - left: 87.5%; - } - .ant-col-lg-offset-21.ant-col-rtl { - margin-right: 87.5%; - margin-left: 0; - } - .ant-col-lg-push-22.ant-col-rtl { - right: 91.66666667%; - left: auto; - } - .ant-col-lg-pull-22.ant-col-rtl { - right: auto; - left: 91.66666667%; - } - .ant-col-lg-offset-22.ant-col-rtl { - margin-right: 91.66666667%; - margin-left: 0; - } - .ant-col-lg-push-23.ant-col-rtl { - right: 95.83333333%; - left: auto; - } - .ant-col-lg-pull-23.ant-col-rtl { - right: auto; - left: 95.83333333%; - } - .ant-col-lg-offset-23.ant-col-rtl { - margin-right: 95.83333333%; - margin-left: 0; - } - .ant-col-lg-push-24.ant-col-rtl { - right: 100%; - left: auto; - } - .ant-col-lg-pull-24.ant-col-rtl { - right: auto; - left: 100%; - } - .ant-col-lg-offset-24.ant-col-rtl { - margin-right: 100%; - margin-left: 0; - } -} -@media (min-width: 1200px) { - .ant-col-xl-24 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .ant-col-xl-push-24 { - left: 100%; - } - .ant-col-xl-pull-24 { - right: 100%; - } - .ant-col-xl-offset-24 { - margin-left: 100%; - } - .ant-col-xl-order-24 { - -webkit-box-ordinal-group: 25; - -ms-flex-order: 24; - order: 24; - } - .ant-col-xl-23 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 95.83333333%; - flex: 0 0 95.83333333%; - max-width: 95.83333333%; - } - .ant-col-xl-push-23 { - left: 95.83333333%; - } - .ant-col-xl-pull-23 { - right: 95.83333333%; - } - .ant-col-xl-offset-23 { - margin-left: 95.83333333%; - } - .ant-col-xl-order-23 { - -webkit-box-ordinal-group: 24; - -ms-flex-order: 23; - order: 23; - } - .ant-col-xl-22 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 91.66666667%; - flex: 0 0 91.66666667%; - max-width: 91.66666667%; - } - .ant-col-xl-push-22 { - left: 91.66666667%; - } - .ant-col-xl-pull-22 { - right: 91.66666667%; - } - .ant-col-xl-offset-22 { - margin-left: 91.66666667%; - } - .ant-col-xl-order-22 { - -webkit-box-ordinal-group: 23; - -ms-flex-order: 22; - order: 22; - } - .ant-col-xl-21 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 87.5%; - flex: 0 0 87.5%; - max-width: 87.5%; - } - .ant-col-xl-push-21 { - left: 87.5%; - } - .ant-col-xl-pull-21 { - right: 87.5%; - } - .ant-col-xl-offset-21 { - margin-left: 87.5%; - } - .ant-col-xl-order-21 { - -webkit-box-ordinal-group: 22; - -ms-flex-order: 21; - order: 21; - } - .ant-col-xl-20 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 83.33333333%; - flex: 0 0 83.33333333%; - max-width: 83.33333333%; - } - .ant-col-xl-push-20 { - left: 83.33333333%; - } - .ant-col-xl-pull-20 { - right: 83.33333333%; - } - .ant-col-xl-offset-20 { - margin-left: 83.33333333%; - } - .ant-col-xl-order-20 { - -webkit-box-ordinal-group: 21; - -ms-flex-order: 20; - order: 20; - } - .ant-col-xl-19 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 79.16666667%; - flex: 0 0 79.16666667%; - max-width: 79.16666667%; - } - .ant-col-xl-push-19 { - left: 79.16666667%; - } - .ant-col-xl-pull-19 { - right: 79.16666667%; - } - .ant-col-xl-offset-19 { - margin-left: 79.16666667%; - } - .ant-col-xl-order-19 { - -webkit-box-ordinal-group: 20; - -ms-flex-order: 19; - order: 19; - } - .ant-col-xl-18 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .ant-col-xl-push-18 { - left: 75%; - } - .ant-col-xl-pull-18 { - right: 75%; - } - .ant-col-xl-offset-18 { - margin-left: 75%; - } - .ant-col-xl-order-18 { - -webkit-box-ordinal-group: 19; - -ms-flex-order: 18; - order: 18; - } - .ant-col-xl-17 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 70.83333333%; - flex: 0 0 70.83333333%; - max-width: 70.83333333%; - } - .ant-col-xl-push-17 { - left: 70.83333333%; - } - .ant-col-xl-pull-17 { - right: 70.83333333%; - } - .ant-col-xl-offset-17 { - margin-left: 70.83333333%; - } - .ant-col-xl-order-17 { - -webkit-box-ordinal-group: 18; - -ms-flex-order: 17; - order: 17; - } - .ant-col-xl-16 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 66.66666667%; - flex: 0 0 66.66666667%; - max-width: 66.66666667%; - } - .ant-col-xl-push-16 { - left: 66.66666667%; - } - .ant-col-xl-pull-16 { - right: 66.66666667%; - } - .ant-col-xl-offset-16 { - margin-left: 66.66666667%; - } - .ant-col-xl-order-16 { - -webkit-box-ordinal-group: 17; - -ms-flex-order: 16; - order: 16; - } - .ant-col-xl-15 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 62.5%; - flex: 0 0 62.5%; - max-width: 62.5%; - } - .ant-col-xl-push-15 { - left: 62.5%; - } - .ant-col-xl-pull-15 { - right: 62.5%; - } - .ant-col-xl-offset-15 { - margin-left: 62.5%; - } - .ant-col-xl-order-15 { - -webkit-box-ordinal-group: 16; - -ms-flex-order: 15; - order: 15; - } - .ant-col-xl-14 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 58.33333333%; - flex: 0 0 58.33333333%; - max-width: 58.33333333%; - } - .ant-col-xl-push-14 { - left: 58.33333333%; - } - .ant-col-xl-pull-14 { - right: 58.33333333%; - } - .ant-col-xl-offset-14 { - margin-left: 58.33333333%; - } - .ant-col-xl-order-14 { - -webkit-box-ordinal-group: 15; - -ms-flex-order: 14; - order: 14; - } - .ant-col-xl-13 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 54.16666667%; - flex: 0 0 54.16666667%; - max-width: 54.16666667%; - } - .ant-col-xl-push-13 { - left: 54.16666667%; - } - .ant-col-xl-pull-13 { - right: 54.16666667%; - } - .ant-col-xl-offset-13 { - margin-left: 54.16666667%; - } - .ant-col-xl-order-13 { - -webkit-box-ordinal-group: 14; - -ms-flex-order: 13; - order: 13; - } - .ant-col-xl-12 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .ant-col-xl-push-12 { - left: 50%; - } - .ant-col-xl-pull-12 { - right: 50%; - } - .ant-col-xl-offset-12 { - margin-left: 50%; - } - .ant-col-xl-order-12 { - -webkit-box-ordinal-group: 13; - -ms-flex-order: 12; - order: 12; - } - .ant-col-xl-11 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 45.83333333%; - flex: 0 0 45.83333333%; - max-width: 45.83333333%; - } - .ant-col-xl-push-11 { - left: 45.83333333%; - } - .ant-col-xl-pull-11 { - right: 45.83333333%; - } - .ant-col-xl-offset-11 { - margin-left: 45.83333333%; - } - .ant-col-xl-order-11 { - -webkit-box-ordinal-group: 12; - -ms-flex-order: 11; - order: 11; - } - .ant-col-xl-10 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 41.66666667%; - flex: 0 0 41.66666667%; - max-width: 41.66666667%; - } - .ant-col-xl-push-10 { - left: 41.66666667%; - } - .ant-col-xl-pull-10 { - right: 41.66666667%; - } - .ant-col-xl-offset-10 { - margin-left: 41.66666667%; - } - .ant-col-xl-order-10 { - -webkit-box-ordinal-group: 11; - -ms-flex-order: 10; - order: 10; - } - .ant-col-xl-9 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 37.5%; - flex: 0 0 37.5%; - max-width: 37.5%; - } - .ant-col-xl-push-9 { - left: 37.5%; - } - .ant-col-xl-pull-9 { - right: 37.5%; - } - .ant-col-xl-offset-9 { - margin-left: 37.5%; - } - .ant-col-xl-order-9 { - -webkit-box-ordinal-group: 10; - -ms-flex-order: 9; - order: 9; - } - .ant-col-xl-8 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 33.33333333%; - flex: 0 0 33.33333333%; - max-width: 33.33333333%; - } - .ant-col-xl-push-8 { - left: 33.33333333%; - } - .ant-col-xl-pull-8 { - right: 33.33333333%; - } - .ant-col-xl-offset-8 { - margin-left: 33.33333333%; - } - .ant-col-xl-order-8 { - -webkit-box-ordinal-group: 9; - -ms-flex-order: 8; - order: 8; - } - .ant-col-xl-7 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 29.16666667%; - flex: 0 0 29.16666667%; - max-width: 29.16666667%; - } - .ant-col-xl-push-7 { - left: 29.16666667%; - } - .ant-col-xl-pull-7 { - right: 29.16666667%; - } - .ant-col-xl-offset-7 { - margin-left: 29.16666667%; - } - .ant-col-xl-order-7 { - -webkit-box-ordinal-group: 8; - -ms-flex-order: 7; - order: 7; - } - .ant-col-xl-6 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .ant-col-xl-push-6 { - left: 25%; - } - .ant-col-xl-pull-6 { - right: 25%; - } - .ant-col-xl-offset-6 { - margin-left: 25%; - } - .ant-col-xl-order-6 { - -webkit-box-ordinal-group: 7; - -ms-flex-order: 6; - order: 6; - } - .ant-col-xl-5 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 20.83333333%; - flex: 0 0 20.83333333%; - max-width: 20.83333333%; - } - .ant-col-xl-push-5 { - left: 20.83333333%; - } - .ant-col-xl-pull-5 { - right: 20.83333333%; - } - .ant-col-xl-offset-5 { - margin-left: 20.83333333%; - } - .ant-col-xl-order-5 { - -webkit-box-ordinal-group: 6; - -ms-flex-order: 5; - order: 5; - } - .ant-col-xl-4 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 16.66666667%; - flex: 0 0 16.66666667%; - max-width: 16.66666667%; - } - .ant-col-xl-push-4 { - left: 16.66666667%; - } - .ant-col-xl-pull-4 { - right: 16.66666667%; - } - .ant-col-xl-offset-4 { - margin-left: 16.66666667%; - } - .ant-col-xl-order-4 { - -webkit-box-ordinal-group: 5; - -ms-flex-order: 4; - order: 4; - } - .ant-col-xl-3 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 12.5%; - flex: 0 0 12.5%; - max-width: 12.5%; - } - .ant-col-xl-push-3 { - left: 12.5%; - } - .ant-col-xl-pull-3 { - right: 12.5%; - } - .ant-col-xl-offset-3 { - margin-left: 12.5%; - } - .ant-col-xl-order-3 { - -webkit-box-ordinal-group: 4; - -ms-flex-order: 3; - order: 3; - } - .ant-col-xl-2 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 8.33333333%; - flex: 0 0 8.33333333%; - max-width: 8.33333333%; - } - .ant-col-xl-push-2 { - left: 8.33333333%; - } - .ant-col-xl-pull-2 { - right: 8.33333333%; - } - .ant-col-xl-offset-2 { - margin-left: 8.33333333%; - } - .ant-col-xl-order-2 { - -webkit-box-ordinal-group: 3; - -ms-flex-order: 2; - order: 2; - } - .ant-col-xl-1 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 4.16666667%; - flex: 0 0 4.16666667%; - max-width: 4.16666667%; - } - .ant-col-xl-push-1 { - left: 4.16666667%; - } - .ant-col-xl-pull-1 { - right: 4.16666667%; - } - .ant-col-xl-offset-1 { - margin-left: 4.16666667%; - } - .ant-col-xl-order-1 { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1; - } - .ant-col-xl-0 { - display: none; - } - .ant-col-push-0 { - left: auto; - } - .ant-col-pull-0 { - right: auto; - } - .ant-col-xl-push-0 { - left: auto; - } - .ant-col-xl-pull-0 { - right: auto; - } - .ant-col-xl-offset-0 { - margin-left: 0; - } - .ant-col-xl-order-0 { - -webkit-box-ordinal-group: 1; - -ms-flex-order: 0; - order: 0; - } - .ant-col-push-0.ant-col-rtl { - right: auto; - } - .ant-col-pull-0.ant-col-rtl { - left: auto; - } - .ant-col-xl-push-0.ant-col-rtl { - right: auto; - } - .ant-col-xl-pull-0.ant-col-rtl { - left: auto; - } - .ant-col-xl-offset-0.ant-col-rtl { - margin-right: 0; - } - .ant-col-xl-push-1.ant-col-rtl { - right: 4.16666667%; - left: auto; - } - .ant-col-xl-pull-1.ant-col-rtl { - right: auto; - left: 4.16666667%; - } - .ant-col-xl-offset-1.ant-col-rtl { - margin-right: 4.16666667%; - margin-left: 0; - } - .ant-col-xl-push-2.ant-col-rtl { - right: 8.33333333%; - left: auto; - } - .ant-col-xl-pull-2.ant-col-rtl { - right: auto; - left: 8.33333333%; - } - .ant-col-xl-offset-2.ant-col-rtl { - margin-right: 8.33333333%; - margin-left: 0; - } - .ant-col-xl-push-3.ant-col-rtl { - right: 12.5%; - left: auto; - } - .ant-col-xl-pull-3.ant-col-rtl { - right: auto; - left: 12.5%; - } - .ant-col-xl-offset-3.ant-col-rtl { - margin-right: 12.5%; - margin-left: 0; - } - .ant-col-xl-push-4.ant-col-rtl { - right: 16.66666667%; - left: auto; - } - .ant-col-xl-pull-4.ant-col-rtl { - right: auto; - left: 16.66666667%; - } - .ant-col-xl-offset-4.ant-col-rtl { - margin-right: 16.66666667%; - margin-left: 0; - } - .ant-col-xl-push-5.ant-col-rtl { - right: 20.83333333%; - left: auto; - } - .ant-col-xl-pull-5.ant-col-rtl { - right: auto; - left: 20.83333333%; - } - .ant-col-xl-offset-5.ant-col-rtl { - margin-right: 20.83333333%; - margin-left: 0; - } - .ant-col-xl-push-6.ant-col-rtl { - right: 25%; - left: auto; - } - .ant-col-xl-pull-6.ant-col-rtl { - right: auto; - left: 25%; - } - .ant-col-xl-offset-6.ant-col-rtl { - margin-right: 25%; - margin-left: 0; - } - .ant-col-xl-push-7.ant-col-rtl { - right: 29.16666667%; - left: auto; - } - .ant-col-xl-pull-7.ant-col-rtl { - right: auto; - left: 29.16666667%; - } - .ant-col-xl-offset-7.ant-col-rtl { - margin-right: 29.16666667%; - margin-left: 0; - } - .ant-col-xl-push-8.ant-col-rtl { - right: 33.33333333%; - left: auto; - } - .ant-col-xl-pull-8.ant-col-rtl { - right: auto; - left: 33.33333333%; - } - .ant-col-xl-offset-8.ant-col-rtl { - margin-right: 33.33333333%; - margin-left: 0; - } - .ant-col-xl-push-9.ant-col-rtl { - right: 37.5%; - left: auto; - } - .ant-col-xl-pull-9.ant-col-rtl { - right: auto; - left: 37.5%; - } - .ant-col-xl-offset-9.ant-col-rtl { - margin-right: 37.5%; - margin-left: 0; - } - .ant-col-xl-push-10.ant-col-rtl { - right: 41.66666667%; - left: auto; - } - .ant-col-xl-pull-10.ant-col-rtl { - right: auto; - left: 41.66666667%; - } - .ant-col-xl-offset-10.ant-col-rtl { - margin-right: 41.66666667%; - margin-left: 0; - } - .ant-col-xl-push-11.ant-col-rtl { - right: 45.83333333%; - left: auto; - } - .ant-col-xl-pull-11.ant-col-rtl { - right: auto; - left: 45.83333333%; - } - .ant-col-xl-offset-11.ant-col-rtl { - margin-right: 45.83333333%; - margin-left: 0; - } - .ant-col-xl-push-12.ant-col-rtl { - right: 50%; - left: auto; - } - .ant-col-xl-pull-12.ant-col-rtl { - right: auto; - left: 50%; - } - .ant-col-xl-offset-12.ant-col-rtl { - margin-right: 50%; - margin-left: 0; - } - .ant-col-xl-push-13.ant-col-rtl { - right: 54.16666667%; - left: auto; - } - .ant-col-xl-pull-13.ant-col-rtl { - right: auto; - left: 54.16666667%; - } - .ant-col-xl-offset-13.ant-col-rtl { - margin-right: 54.16666667%; - margin-left: 0; - } - .ant-col-xl-push-14.ant-col-rtl { - right: 58.33333333%; - left: auto; - } - .ant-col-xl-pull-14.ant-col-rtl { - right: auto; - left: 58.33333333%; - } - .ant-col-xl-offset-14.ant-col-rtl { - margin-right: 58.33333333%; - margin-left: 0; - } - .ant-col-xl-push-15.ant-col-rtl { - right: 62.5%; - left: auto; - } - .ant-col-xl-pull-15.ant-col-rtl { - right: auto; - left: 62.5%; - } - .ant-col-xl-offset-15.ant-col-rtl { - margin-right: 62.5%; - margin-left: 0; - } - .ant-col-xl-push-16.ant-col-rtl { - right: 66.66666667%; - left: auto; - } - .ant-col-xl-pull-16.ant-col-rtl { - right: auto; - left: 66.66666667%; - } - .ant-col-xl-offset-16.ant-col-rtl { - margin-right: 66.66666667%; - margin-left: 0; - } - .ant-col-xl-push-17.ant-col-rtl { - right: 70.83333333%; - left: auto; - } - .ant-col-xl-pull-17.ant-col-rtl { - right: auto; - left: 70.83333333%; - } - .ant-col-xl-offset-17.ant-col-rtl { - margin-right: 70.83333333%; - margin-left: 0; - } - .ant-col-xl-push-18.ant-col-rtl { - right: 75%; - left: auto; - } - .ant-col-xl-pull-18.ant-col-rtl { - right: auto; - left: 75%; - } - .ant-col-xl-offset-18.ant-col-rtl { - margin-right: 75%; - margin-left: 0; - } - .ant-col-xl-push-19.ant-col-rtl { - right: 79.16666667%; - left: auto; - } - .ant-col-xl-pull-19.ant-col-rtl { - right: auto; - left: 79.16666667%; - } - .ant-col-xl-offset-19.ant-col-rtl { - margin-right: 79.16666667%; - margin-left: 0; - } - .ant-col-xl-push-20.ant-col-rtl { - right: 83.33333333%; - left: auto; - } - .ant-col-xl-pull-20.ant-col-rtl { - right: auto; - left: 83.33333333%; - } - .ant-col-xl-offset-20.ant-col-rtl { - margin-right: 83.33333333%; - margin-left: 0; - } - .ant-col-xl-push-21.ant-col-rtl { - right: 87.5%; - left: auto; - } - .ant-col-xl-pull-21.ant-col-rtl { - right: auto; - left: 87.5%; - } - .ant-col-xl-offset-21.ant-col-rtl { - margin-right: 87.5%; - margin-left: 0; - } - .ant-col-xl-push-22.ant-col-rtl { - right: 91.66666667%; - left: auto; - } - .ant-col-xl-pull-22.ant-col-rtl { - right: auto; - left: 91.66666667%; - } - .ant-col-xl-offset-22.ant-col-rtl { - margin-right: 91.66666667%; - margin-left: 0; - } - .ant-col-xl-push-23.ant-col-rtl { - right: 95.83333333%; - left: auto; - } - .ant-col-xl-pull-23.ant-col-rtl { - right: auto; - left: 95.83333333%; - } - .ant-col-xl-offset-23.ant-col-rtl { - margin-right: 95.83333333%; - margin-left: 0; - } - .ant-col-xl-push-24.ant-col-rtl { - right: 100%; - left: auto; - } - .ant-col-xl-pull-24.ant-col-rtl { - right: auto; - left: 100%; - } - .ant-col-xl-offset-24.ant-col-rtl { - margin-right: 100%; - margin-left: 0; - } -} -@media (min-width: 1600px) { - .ant-col-xxl-24 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .ant-col-xxl-push-24 { - left: 100%; - } - .ant-col-xxl-pull-24 { - right: 100%; - } - .ant-col-xxl-offset-24 { - margin-left: 100%; - } - .ant-col-xxl-order-24 { - -webkit-box-ordinal-group: 25; - -ms-flex-order: 24; - order: 24; - } - .ant-col-xxl-23 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 95.83333333%; - flex: 0 0 95.83333333%; - max-width: 95.83333333%; - } - .ant-col-xxl-push-23 { - left: 95.83333333%; - } - .ant-col-xxl-pull-23 { - right: 95.83333333%; - } - .ant-col-xxl-offset-23 { - margin-left: 95.83333333%; - } - .ant-col-xxl-order-23 { - -webkit-box-ordinal-group: 24; - -ms-flex-order: 23; - order: 23; - } - .ant-col-xxl-22 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 91.66666667%; - flex: 0 0 91.66666667%; - max-width: 91.66666667%; - } - .ant-col-xxl-push-22 { - left: 91.66666667%; - } - .ant-col-xxl-pull-22 { - right: 91.66666667%; - } - .ant-col-xxl-offset-22 { - margin-left: 91.66666667%; - } - .ant-col-xxl-order-22 { - -webkit-box-ordinal-group: 23; - -ms-flex-order: 22; - order: 22; - } - .ant-col-xxl-21 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 87.5%; - flex: 0 0 87.5%; - max-width: 87.5%; - } - .ant-col-xxl-push-21 { - left: 87.5%; - } - .ant-col-xxl-pull-21 { - right: 87.5%; - } - .ant-col-xxl-offset-21 { - margin-left: 87.5%; - } - .ant-col-xxl-order-21 { - -webkit-box-ordinal-group: 22; - -ms-flex-order: 21; - order: 21; - } - .ant-col-xxl-20 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 83.33333333%; - flex: 0 0 83.33333333%; - max-width: 83.33333333%; - } - .ant-col-xxl-push-20 { - left: 83.33333333%; - } - .ant-col-xxl-pull-20 { - right: 83.33333333%; - } - .ant-col-xxl-offset-20 { - margin-left: 83.33333333%; - } - .ant-col-xxl-order-20 { - -webkit-box-ordinal-group: 21; - -ms-flex-order: 20; - order: 20; - } - .ant-col-xxl-19 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 79.16666667%; - flex: 0 0 79.16666667%; - max-width: 79.16666667%; - } - .ant-col-xxl-push-19 { - left: 79.16666667%; - } - .ant-col-xxl-pull-19 { - right: 79.16666667%; - } - .ant-col-xxl-offset-19 { - margin-left: 79.16666667%; - } - .ant-col-xxl-order-19 { - -webkit-box-ordinal-group: 20; - -ms-flex-order: 19; - order: 19; - } - .ant-col-xxl-18 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .ant-col-xxl-push-18 { - left: 75%; - } - .ant-col-xxl-pull-18 { - right: 75%; - } - .ant-col-xxl-offset-18 { - margin-left: 75%; - } - .ant-col-xxl-order-18 { - -webkit-box-ordinal-group: 19; - -ms-flex-order: 18; - order: 18; - } - .ant-col-xxl-17 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 70.83333333%; - flex: 0 0 70.83333333%; - max-width: 70.83333333%; - } - .ant-col-xxl-push-17 { - left: 70.83333333%; - } - .ant-col-xxl-pull-17 { - right: 70.83333333%; - } - .ant-col-xxl-offset-17 { - margin-left: 70.83333333%; - } - .ant-col-xxl-order-17 { - -webkit-box-ordinal-group: 18; - -ms-flex-order: 17; - order: 17; - } - .ant-col-xxl-16 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 66.66666667%; - flex: 0 0 66.66666667%; - max-width: 66.66666667%; - } - .ant-col-xxl-push-16 { - left: 66.66666667%; - } - .ant-col-xxl-pull-16 { - right: 66.66666667%; - } - .ant-col-xxl-offset-16 { - margin-left: 66.66666667%; - } - .ant-col-xxl-order-16 { - -webkit-box-ordinal-group: 17; - -ms-flex-order: 16; - order: 16; - } - .ant-col-xxl-15 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 62.5%; - flex: 0 0 62.5%; - max-width: 62.5%; - } - .ant-col-xxl-push-15 { - left: 62.5%; - } - .ant-col-xxl-pull-15 { - right: 62.5%; - } - .ant-col-xxl-offset-15 { - margin-left: 62.5%; - } - .ant-col-xxl-order-15 { - -webkit-box-ordinal-group: 16; - -ms-flex-order: 15; - order: 15; - } - .ant-col-xxl-14 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 58.33333333%; - flex: 0 0 58.33333333%; - max-width: 58.33333333%; - } - .ant-col-xxl-push-14 { - left: 58.33333333%; - } - .ant-col-xxl-pull-14 { - right: 58.33333333%; - } - .ant-col-xxl-offset-14 { - margin-left: 58.33333333%; - } - .ant-col-xxl-order-14 { - -webkit-box-ordinal-group: 15; - -ms-flex-order: 14; - order: 14; - } - .ant-col-xxl-13 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 54.16666667%; - flex: 0 0 54.16666667%; - max-width: 54.16666667%; - } - .ant-col-xxl-push-13 { - left: 54.16666667%; - } - .ant-col-xxl-pull-13 { - right: 54.16666667%; - } - .ant-col-xxl-offset-13 { - margin-left: 54.16666667%; - } - .ant-col-xxl-order-13 { - -webkit-box-ordinal-group: 14; - -ms-flex-order: 13; - order: 13; - } - .ant-col-xxl-12 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .ant-col-xxl-push-12 { - left: 50%; - } - .ant-col-xxl-pull-12 { - right: 50%; - } - .ant-col-xxl-offset-12 { - margin-left: 50%; - } - .ant-col-xxl-order-12 { - -webkit-box-ordinal-group: 13; - -ms-flex-order: 12; - order: 12; - } - .ant-col-xxl-11 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 45.83333333%; - flex: 0 0 45.83333333%; - max-width: 45.83333333%; - } - .ant-col-xxl-push-11 { - left: 45.83333333%; - } - .ant-col-xxl-pull-11 { - right: 45.83333333%; - } - .ant-col-xxl-offset-11 { - margin-left: 45.83333333%; - } - .ant-col-xxl-order-11 { - -webkit-box-ordinal-group: 12; - -ms-flex-order: 11; - order: 11; - } - .ant-col-xxl-10 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 41.66666667%; - flex: 0 0 41.66666667%; - max-width: 41.66666667%; - } - .ant-col-xxl-push-10 { - left: 41.66666667%; - } - .ant-col-xxl-pull-10 { - right: 41.66666667%; - } - .ant-col-xxl-offset-10 { - margin-left: 41.66666667%; - } - .ant-col-xxl-order-10 { - -webkit-box-ordinal-group: 11; - -ms-flex-order: 10; - order: 10; - } - .ant-col-xxl-9 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 37.5%; - flex: 0 0 37.5%; - max-width: 37.5%; - } - .ant-col-xxl-push-9 { - left: 37.5%; - } - .ant-col-xxl-pull-9 { - right: 37.5%; - } - .ant-col-xxl-offset-9 { - margin-left: 37.5%; - } - .ant-col-xxl-order-9 { - -webkit-box-ordinal-group: 10; - -ms-flex-order: 9; - order: 9; - } - .ant-col-xxl-8 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 33.33333333%; - flex: 0 0 33.33333333%; - max-width: 33.33333333%; - } - .ant-col-xxl-push-8 { - left: 33.33333333%; - } - .ant-col-xxl-pull-8 { - right: 33.33333333%; - } - .ant-col-xxl-offset-8 { - margin-left: 33.33333333%; - } - .ant-col-xxl-order-8 { - -webkit-box-ordinal-group: 9; - -ms-flex-order: 8; - order: 8; - } - .ant-col-xxl-7 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 29.16666667%; - flex: 0 0 29.16666667%; - max-width: 29.16666667%; - } - .ant-col-xxl-push-7 { - left: 29.16666667%; - } - .ant-col-xxl-pull-7 { - right: 29.16666667%; - } - .ant-col-xxl-offset-7 { - margin-left: 29.16666667%; - } - .ant-col-xxl-order-7 { - -webkit-box-ordinal-group: 8; - -ms-flex-order: 7; - order: 7; - } - .ant-col-xxl-6 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .ant-col-xxl-push-6 { - left: 25%; - } - .ant-col-xxl-pull-6 { - right: 25%; - } - .ant-col-xxl-offset-6 { - margin-left: 25%; - } - .ant-col-xxl-order-6 { - -webkit-box-ordinal-group: 7; - -ms-flex-order: 6; - order: 6; - } - .ant-col-xxl-5 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 20.83333333%; - flex: 0 0 20.83333333%; - max-width: 20.83333333%; - } - .ant-col-xxl-push-5 { - left: 20.83333333%; - } - .ant-col-xxl-pull-5 { - right: 20.83333333%; - } - .ant-col-xxl-offset-5 { - margin-left: 20.83333333%; - } - .ant-col-xxl-order-5 { - -webkit-box-ordinal-group: 6; - -ms-flex-order: 5; - order: 5; - } - .ant-col-xxl-4 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 16.66666667%; - flex: 0 0 16.66666667%; - max-width: 16.66666667%; - } - .ant-col-xxl-push-4 { - left: 16.66666667%; - } - .ant-col-xxl-pull-4 { - right: 16.66666667%; - } - .ant-col-xxl-offset-4 { - margin-left: 16.66666667%; - } - .ant-col-xxl-order-4 { - -webkit-box-ordinal-group: 5; - -ms-flex-order: 4; - order: 4; - } - .ant-col-xxl-3 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 12.5%; - flex: 0 0 12.5%; - max-width: 12.5%; - } - .ant-col-xxl-push-3 { - left: 12.5%; - } - .ant-col-xxl-pull-3 { - right: 12.5%; - } - .ant-col-xxl-offset-3 { - margin-left: 12.5%; - } - .ant-col-xxl-order-3 { - -webkit-box-ordinal-group: 4; - -ms-flex-order: 3; - order: 3; - } - .ant-col-xxl-2 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 8.33333333%; - flex: 0 0 8.33333333%; - max-width: 8.33333333%; - } - .ant-col-xxl-push-2 { - left: 8.33333333%; - } - .ant-col-xxl-pull-2 { - right: 8.33333333%; - } - .ant-col-xxl-offset-2 { - margin-left: 8.33333333%; - } - .ant-col-xxl-order-2 { - -webkit-box-ordinal-group: 3; - -ms-flex-order: 2; - order: 2; - } - .ant-col-xxl-1 { - display: block; - -webkit-box-flex: 0; - -ms-flex: 0 0 4.16666667%; - flex: 0 0 4.16666667%; - max-width: 4.16666667%; - } - .ant-col-xxl-push-1 { - left: 4.16666667%; - } - .ant-col-xxl-pull-1 { - right: 4.16666667%; - } - .ant-col-xxl-offset-1 { - margin-left: 4.16666667%; - } - .ant-col-xxl-order-1 { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1; - } - .ant-col-xxl-0 { - display: none; - } - .ant-col-push-0 { - left: auto; - } - .ant-col-pull-0 { - right: auto; - } - .ant-col-xxl-push-0 { - left: auto; - } - .ant-col-xxl-pull-0 { - right: auto; - } - .ant-col-xxl-offset-0 { - margin-left: 0; - } - .ant-col-xxl-order-0 { - -webkit-box-ordinal-group: 1; - -ms-flex-order: 0; - order: 0; - } - .ant-col-push-0.ant-col-rtl { - right: auto; - } - .ant-col-pull-0.ant-col-rtl { - left: auto; - } - .ant-col-xxl-push-0.ant-col-rtl { - right: auto; - } - .ant-col-xxl-pull-0.ant-col-rtl { - left: auto; - } - .ant-col-xxl-offset-0.ant-col-rtl { - margin-right: 0; - } - .ant-col-xxl-push-1.ant-col-rtl { - right: 4.16666667%; - left: auto; - } - .ant-col-xxl-pull-1.ant-col-rtl { - right: auto; - left: 4.16666667%; - } - .ant-col-xxl-offset-1.ant-col-rtl { - margin-right: 4.16666667%; - margin-left: 0; - } - .ant-col-xxl-push-2.ant-col-rtl { - right: 8.33333333%; - left: auto; - } - .ant-col-xxl-pull-2.ant-col-rtl { - right: auto; - left: 8.33333333%; - } - .ant-col-xxl-offset-2.ant-col-rtl { - margin-right: 8.33333333%; - margin-left: 0; - } - .ant-col-xxl-push-3.ant-col-rtl { - right: 12.5%; - left: auto; - } - .ant-col-xxl-pull-3.ant-col-rtl { - right: auto; - left: 12.5%; - } - .ant-col-xxl-offset-3.ant-col-rtl { - margin-right: 12.5%; - margin-left: 0; - } - .ant-col-xxl-push-4.ant-col-rtl { - right: 16.66666667%; - left: auto; - } - .ant-col-xxl-pull-4.ant-col-rtl { - right: auto; - left: 16.66666667%; - } - .ant-col-xxl-offset-4.ant-col-rtl { - margin-right: 16.66666667%; - margin-left: 0; - } - .ant-col-xxl-push-5.ant-col-rtl { - right: 20.83333333%; - left: auto; - } - .ant-col-xxl-pull-5.ant-col-rtl { - right: auto; - left: 20.83333333%; - } - .ant-col-xxl-offset-5.ant-col-rtl { - margin-right: 20.83333333%; - margin-left: 0; - } - .ant-col-xxl-push-6.ant-col-rtl { - right: 25%; - left: auto; - } - .ant-col-xxl-pull-6.ant-col-rtl { - right: auto; - left: 25%; - } - .ant-col-xxl-offset-6.ant-col-rtl { - margin-right: 25%; - margin-left: 0; - } - .ant-col-xxl-push-7.ant-col-rtl { - right: 29.16666667%; - left: auto; - } - .ant-col-xxl-pull-7.ant-col-rtl { - right: auto; - left: 29.16666667%; - } - .ant-col-xxl-offset-7.ant-col-rtl { - margin-right: 29.16666667%; - margin-left: 0; - } - .ant-col-xxl-push-8.ant-col-rtl { - right: 33.33333333%; - left: auto; - } - .ant-col-xxl-pull-8.ant-col-rtl { - right: auto; - left: 33.33333333%; - } - .ant-col-xxl-offset-8.ant-col-rtl { - margin-right: 33.33333333%; - margin-left: 0; - } - .ant-col-xxl-push-9.ant-col-rtl { - right: 37.5%; - left: auto; - } - .ant-col-xxl-pull-9.ant-col-rtl { - right: auto; - left: 37.5%; - } - .ant-col-xxl-offset-9.ant-col-rtl { - margin-right: 37.5%; - margin-left: 0; - } - .ant-col-xxl-push-10.ant-col-rtl { - right: 41.66666667%; - left: auto; - } - .ant-col-xxl-pull-10.ant-col-rtl { - right: auto; - left: 41.66666667%; - } - .ant-col-xxl-offset-10.ant-col-rtl { - margin-right: 41.66666667%; - margin-left: 0; - } - .ant-col-xxl-push-11.ant-col-rtl { - right: 45.83333333%; - left: auto; - } - .ant-col-xxl-pull-11.ant-col-rtl { - right: auto; - left: 45.83333333%; - } - .ant-col-xxl-offset-11.ant-col-rtl { - margin-right: 45.83333333%; - margin-left: 0; - } - .ant-col-xxl-push-12.ant-col-rtl { - right: 50%; - left: auto; - } - .ant-col-xxl-pull-12.ant-col-rtl { - right: auto; - left: 50%; - } - .ant-col-xxl-offset-12.ant-col-rtl { - margin-right: 50%; - margin-left: 0; - } - .ant-col-xxl-push-13.ant-col-rtl { - right: 54.16666667%; - left: auto; - } - .ant-col-xxl-pull-13.ant-col-rtl { - right: auto; - left: 54.16666667%; - } - .ant-col-xxl-offset-13.ant-col-rtl { - margin-right: 54.16666667%; - margin-left: 0; - } - .ant-col-xxl-push-14.ant-col-rtl { - right: 58.33333333%; - left: auto; - } - .ant-col-xxl-pull-14.ant-col-rtl { - right: auto; - left: 58.33333333%; - } - .ant-col-xxl-offset-14.ant-col-rtl { - margin-right: 58.33333333%; - margin-left: 0; - } - .ant-col-xxl-push-15.ant-col-rtl { - right: 62.5%; - left: auto; - } - .ant-col-xxl-pull-15.ant-col-rtl { - right: auto; - left: 62.5%; - } - .ant-col-xxl-offset-15.ant-col-rtl { - margin-right: 62.5%; - margin-left: 0; - } - .ant-col-xxl-push-16.ant-col-rtl { - right: 66.66666667%; - left: auto; - } - .ant-col-xxl-pull-16.ant-col-rtl { - right: auto; - left: 66.66666667%; - } - .ant-col-xxl-offset-16.ant-col-rtl { - margin-right: 66.66666667%; - margin-left: 0; - } - .ant-col-xxl-push-17.ant-col-rtl { - right: 70.83333333%; - left: auto; - } - .ant-col-xxl-pull-17.ant-col-rtl { - right: auto; - left: 70.83333333%; - } - .ant-col-xxl-offset-17.ant-col-rtl { - margin-right: 70.83333333%; - margin-left: 0; - } - .ant-col-xxl-push-18.ant-col-rtl { - right: 75%; - left: auto; - } - .ant-col-xxl-pull-18.ant-col-rtl { - right: auto; - left: 75%; - } - .ant-col-xxl-offset-18.ant-col-rtl { - margin-right: 75%; - margin-left: 0; - } - .ant-col-xxl-push-19.ant-col-rtl { - right: 79.16666667%; - left: auto; - } - .ant-col-xxl-pull-19.ant-col-rtl { - right: auto; - left: 79.16666667%; - } - .ant-col-xxl-offset-19.ant-col-rtl { - margin-right: 79.16666667%; - margin-left: 0; - } - .ant-col-xxl-push-20.ant-col-rtl { - right: 83.33333333%; - left: auto; - } - .ant-col-xxl-pull-20.ant-col-rtl { - right: auto; - left: 83.33333333%; - } - .ant-col-xxl-offset-20.ant-col-rtl { - margin-right: 83.33333333%; - margin-left: 0; - } - .ant-col-xxl-push-21.ant-col-rtl { - right: 87.5%; - left: auto; - } - .ant-col-xxl-pull-21.ant-col-rtl { - right: auto; - left: 87.5%; - } - .ant-col-xxl-offset-21.ant-col-rtl { - margin-right: 87.5%; - margin-left: 0; - } - .ant-col-xxl-push-22.ant-col-rtl { - right: 91.66666667%; - left: auto; - } - .ant-col-xxl-pull-22.ant-col-rtl { - right: auto; - left: 91.66666667%; - } - .ant-col-xxl-offset-22.ant-col-rtl { - margin-right: 91.66666667%; - margin-left: 0; - } - .ant-col-xxl-push-23.ant-col-rtl { - right: 95.83333333%; - left: auto; - } - .ant-col-xxl-pull-23.ant-col-rtl { - right: auto; - left: 95.83333333%; - } - .ant-col-xxl-offset-23.ant-col-rtl { - margin-right: 95.83333333%; - margin-left: 0; - } - .ant-col-xxl-push-24.ant-col-rtl { - right: 100%; - left: auto; - } - .ant-col-xxl-pull-24.ant-col-rtl { - right: auto; - left: 100%; - } - .ant-col-xxl-offset-24.ant-col-rtl { - margin-right: 100%; - margin-left: 0; - } -} -.ant-row-rtl { - direction: rtl; -} -.ant-col.ant-col-rtl { - float: right; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-carousel { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; -} -.ant-carousel .slick-slider { - position: relative; - display: block; - -webkit-box-sizing: border-box; - box-sizing: border-box; - -webkit-touch-callout: none; - -ms-touch-action: pan-y; - touch-action: pan-y; - -webkit-tap-highlight-color: transparent; -} -.ant-carousel .slick-list { - position: relative; - display: block; - margin: 0; - padding: 0; - overflow: hidden; -} -.ant-carousel .slick-list:focus { - outline: none; -} -.ant-carousel .slick-list.dragging { - cursor: pointer; -} -.ant-carousel .slick-list .slick-slide { - pointer-events: none; -} -.ant-carousel .slick-list .slick-slide input.ant-radio-input, -.ant-carousel .slick-list .slick-slide input.ant-checkbox-input { - visibility: hidden; -} -.ant-carousel .slick-list .slick-slide.slick-active { - pointer-events: auto; -} -.ant-carousel .slick-list .slick-slide.slick-active input.ant-radio-input, -.ant-carousel .slick-list .slick-slide.slick-active input.ant-checkbox-input { - visibility: visible; -} -.ant-carousel .slick-slider .slick-track, -.ant-carousel .slick-slider .slick-list { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -.ant-carousel .slick-track { - position: relative; - top: 0; - left: 0; - display: block; -} -.ant-carousel .slick-track::before, -.ant-carousel .slick-track::after { - display: table; - content: ''; -} -.ant-carousel .slick-track::after { - clear: both; -} -.slick-loading .ant-carousel .slick-track { - visibility: hidden; -} -.ant-carousel .slick-slide { - display: none; - float: left; - height: 100%; - min-height: 1px; -} -.ant-carousel .slick-slide img { - display: block; -} -.ant-carousel .slick-slide.slick-loading img { - display: none; -} -.ant-carousel .slick-slide.dragging img { - pointer-events: none; -} -.ant-carousel .slick-initialized .slick-slide { - display: block; -} -.ant-carousel .slick-loading .slick-slide { - visibility: hidden; -} -.ant-carousel .slick-vertical .slick-slide { - display: block; - height: auto; - border: 1px solid transparent; -} -.ant-carousel .slick-arrow.slick-hidden { - display: none; -} -.ant-carousel .slick-prev, -.ant-carousel .slick-next { - position: absolute; - top: 50%; - display: block; - width: 20px; - height: 20px; - margin-top: -10px; - padding: 0; - color: transparent; - font-size: 0; - line-height: 0; - background: transparent; - border: 0; - outline: none; - cursor: pointer; -} -.ant-carousel .slick-prev:hover, -.ant-carousel .slick-next:hover, -.ant-carousel .slick-prev:focus, -.ant-carousel .slick-next:focus { - color: transparent; - background: transparent; - outline: none; -} -.ant-carousel .slick-prev:hover::before, -.ant-carousel .slick-next:hover::before, -.ant-carousel .slick-prev:focus::before, -.ant-carousel .slick-next:focus::before { - opacity: 1; -} -.ant-carousel .slick-prev.slick-disabled::before, -.ant-carousel .slick-next.slick-disabled::before { - opacity: 0.25; -} -.ant-carousel .slick-prev { - left: -25px; -} -.ant-carousel .slick-prev::before { - content: '←'; -} -.ant-carousel .slick-next { - right: -25px; -} -.ant-carousel .slick-next::before { - content: '→'; -} -.ant-carousel .slick-dots { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 15; - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - margin-right: 15%; - margin-left: 15%; - padding-left: 0; - list-style: none; -} -.ant-carousel .slick-dots-bottom { - bottom: 12px; -} -.ant-carousel .slick-dots-top { - top: 12px; -} -.ant-carousel .slick-dots li { - position: relative; - display: inline-block; - -webkit-box-flex: 0; - -ms-flex: 0 1 auto; - flex: 0 1 auto; - -webkit-box-sizing: content-box; - box-sizing: content-box; - width: 16px; - height: 3px; - margin: 0 2px; - margin-right: 3px; - margin-left: 3px; - padding: 0; - text-align: center; - text-indent: -999px; - vertical-align: top; - -webkit-transition: all 0.5s; - transition: all 0.5s; -} -.ant-carousel .slick-dots li button { - display: block; - width: 100%; - height: 3px; - padding: 0; - color: transparent; - font-size: 0; - background: #fff; - border: 0; - border-radius: 1px; - outline: none; - cursor: pointer; - opacity: 0.3; - -webkit-transition: all 0.5s; - transition: all 0.5s; -} -.ant-carousel .slick-dots li button:hover, -.ant-carousel .slick-dots li button:focus { - opacity: 0.75; -} -.ant-carousel .slick-dots li.slick-active { - width: 24px; -} -.ant-carousel .slick-dots li.slick-active button { - background: #fff; - opacity: 1; -} -.ant-carousel .slick-dots li.slick-active:hover, -.ant-carousel .slick-dots li.slick-active:focus { - opacity: 1; -} -.ant-carousel-vertical .slick-dots { - top: 50%; - bottom: auto; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - width: 3px; - height: auto; - margin: 0; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); -} -.ant-carousel-vertical .slick-dots-left { - right: auto; - left: 12px; -} -.ant-carousel-vertical .slick-dots-right { - right: 12px; - left: auto; -} -.ant-carousel-vertical .slick-dots li { - width: 3px; - height: 16px; - margin: 4px 2px; - vertical-align: baseline; -} -.ant-carousel-vertical .slick-dots li button { - width: 3px; - height: 16px; -} -.ant-carousel-vertical .slick-dots li.slick-active { - width: 3px; - height: 24px; -} -.ant-carousel-vertical .slick-dots li.slick-active button { - width: 3px; - height: 24px; -} -.ant-carousel-rtl { - direction: rtl; -} -.ant-carousel-rtl .ant-carousel .slick-track { - right: 0; - left: auto; -} -.ant-carousel-rtl .ant-carousel .slick-prev { - right: -25px; - left: auto; -} -.ant-carousel-rtl .ant-carousel .slick-prev::before { - content: '→'; -} -.ant-carousel-rtl .ant-carousel .slick-next { - right: auto; - left: -25px; -} -.ant-carousel-rtl .ant-carousel .slick-next::before { - content: '←'; -} -.ant-carousel-rtl.ant-carousel .slick-dots { - -webkit-box-orient: horizontal; - -webkit-box-direction: reverse; - -ms-flex-direction: row-reverse; - flex-direction: row-reverse; -} -.ant-carousel-rtl.ant-carousel-vertical .slick-dots { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-cascader { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; -} -.ant-cascader-input.ant-input { - position: static; - width: 100%; - padding-right: 24px; - background-color: transparent !important; - cursor: pointer; -} -.ant-cascader-picker-show-search .ant-cascader-input.ant-input { - position: relative; -} -.ant-cascader-picker { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - display: inline-block; - background-color: #fff; - border-radius: 2px; - outline: 0; - cursor: pointer; - -webkit-transition: color 0.3s; - transition: color 0.3s; -} -.ant-cascader-picker-with-value .ant-cascader-picker-label { - color: transparent; -} -.ant-cascader-picker-disabled { - color: rgba(0, 0, 0, 0.25); - background: #f5f5f5; - cursor: not-allowed; -} -.ant-cascader-picker-disabled .ant-cascader-input { - cursor: not-allowed; -} -.ant-cascader-picker:focus .ant-cascader-input { - border-color: #40a9ff; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); - box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); -} -.ant-cascader-picker-borderless .ant-cascader-input { - border-color: transparent !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; -} -.ant-cascader-picker-show-search.ant-cascader-picker-focused { - color: rgba(0, 0, 0, 0.25); -} -.ant-cascader-picker-label { - position: absolute; - top: 50%; - left: 0; - width: 100%; - height: 20px; - margin-top: -10px; - padding: 0 20px 0 12px; - overflow: hidden; - line-height: 20px; - white-space: nowrap; - text-overflow: ellipsis; -} -.ant-cascader-picker-clear { - position: absolute; - top: 50%; - right: 12px; - z-index: 2; - width: 12px; - height: 12px; - margin-top: -6px; - color: rgba(0, 0, 0, 0.25); - font-size: 12px; - line-height: 12px; - background: #fff; - cursor: pointer; - opacity: 0; - -webkit-transition: color 0.3s ease, opacity 0.15s ease; - transition: color 0.3s ease, opacity 0.15s ease; -} -.ant-cascader-picker-clear:hover { - color: rgba(0, 0, 0, 0.45); -} -.ant-cascader-picker:hover .ant-cascader-picker-clear { - opacity: 1; -} -.ant-cascader-picker-arrow { - position: absolute; - top: 50%; - right: 12px; - z-index: 1; - width: 12px; - height: 12px; - margin-top: -6px; - color: rgba(0, 0, 0, 0.25); - font-size: 12px; - line-height: 12px; - -webkit-transition: -webkit-transform 0.2s; - transition: -webkit-transform 0.2s; - transition: transform 0.2s; - transition: transform 0.2s, -webkit-transform 0.2s; -} -.ant-cascader-picker-arrow.ant-cascader-picker-arrow-expand { - -webkit-transform: rotate(180deg); - transform: rotate(180deg); -} -.ant-cascader-picker-label:hover + .ant-cascader-input { - border-color: #40a9ff; - border-right-width: 1px !important; -} -.ant-cascader-picker-small .ant-cascader-picker-clear, -.ant-cascader-picker-small .ant-cascader-picker-arrow { - right: 8px; -} -.ant-cascader-menus { - position: absolute; - z-index: 1050; - font-size: 14px; - white-space: nowrap; - background: #fff; - border-radius: 2px; - -webkit-box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); -} -.ant-cascader-menus ul, -.ant-cascader-menus ol { - margin: 0; - list-style: none; -} -.ant-cascader-menus-empty, -.ant-cascader-menus-hidden { - display: none; -} -.ant-cascader-menus.slide-up-enter.slide-up-enter-active.ant-cascader-menus-placement-bottomLeft, -.ant-cascader-menus.slide-up-appear.slide-up-appear-active.ant-cascader-menus-placement-bottomLeft { - -webkit-animation-name: antSlideUpIn; - animation-name: antSlideUpIn; -} -.ant-cascader-menus.slide-up-enter.slide-up-enter-active.ant-cascader-menus-placement-topLeft, -.ant-cascader-menus.slide-up-appear.slide-up-appear-active.ant-cascader-menus-placement-topLeft { - -webkit-animation-name: antSlideDownIn; - animation-name: antSlideDownIn; -} -.ant-cascader-menus.slide-up-leave.slide-up-leave-active.ant-cascader-menus-placement-bottomLeft { - -webkit-animation-name: antSlideUpOut; - animation-name: antSlideUpOut; -} -.ant-cascader-menus.slide-up-leave.slide-up-leave-active.ant-cascader-menus-placement-topLeft { - -webkit-animation-name: antSlideDownOut; - animation-name: antSlideDownOut; -} -.ant-cascader-menu { - display: inline-block; - min-width: 111px; - height: 180px; - margin: 0; - padding: 4px 0; - overflow: auto; - vertical-align: top; - list-style: none; - border-right: 1px solid #f0f0f0; - -ms-overflow-style: -ms-autohiding-scrollbar; -} -.ant-cascader-menu:first-child { - border-radius: 2px 0 0 2px; -} -.ant-cascader-menu:last-child { - margin-right: -1px; - border-right-color: transparent; - border-radius: 0 2px 2px 0; -} -.ant-cascader-menu:only-child { - border-radius: 2px; -} -.ant-cascader-menu-item { - padding: 5px 12px; - line-height: 22px; - white-space: nowrap; - cursor: pointer; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-cascader-menu-item:hover { - background: #f5f5f5; -} -.ant-cascader-menu-item-disabled { - color: rgba(0, 0, 0, 0.25); - cursor: not-allowed; -} -.ant-cascader-menu-item-disabled:hover { - background: transparent; -} -.ant-cascader-menu-empty .ant-cascader-menu-item { - color: rgba(0, 0, 0, 0.25); - cursor: default; - pointer-events: none; -} -.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled), -.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled):hover { - font-weight: 600; - background-color: #e6f7ff; -} -.ant-cascader-menu-item-expand { - position: relative; - padding-right: 24px; -} -.ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon, -.ant-cascader-menu-item-loading-icon { - display: inline-block; - font-size: 10px; - position: absolute; - right: 12px; - color: rgba(0, 0, 0, 0.45); -} -.ant-cascader-menu-item-disabled.ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon, -.ant-cascader-menu-item-disabled.ant-cascader-menu-item-loading-icon { - color: rgba(0, 0, 0, 0.25); -} -.ant-cascader-menu-item .ant-cascader-menu-item-keyword { - color: #ff4d4f; -} -.ant-cascader-picker-rtl .ant-cascader-input.ant-input { - padding-right: 11px; - padding-left: 24px; - text-align: right; -} -.ant-cascader-picker-rtl { - direction: rtl; -} -.ant-cascader-picker-rtl .ant-cascader-picker-label { - padding: 0 12px 0 20px; - text-align: right; -} -.ant-cascader-picker-rtl .ant-cascader-picker-clear { - right: auto; - left: 12px; -} -.ant-cascader-picker-rtl .ant-cascader-picker-arrow { - right: auto; - left: 12px; -} -.ant-cascader-picker-rtl.ant-cascader-picker-small .ant-cascader-picker-clear, -.ant-cascader-picker-rtl.ant-cascader-picker-small .ant-cascader-picker-arrow { - right: auto; - left: 8px; -} -.ant-cascader-menu-rtl .ant-cascader-menu { - direction: rtl; - border-right: none; - border-left: 1px solid #f0f0f0; -} -.ant-cascader-menu-rtl .ant-cascader-menu:first-child { - border-radius: 0 2px 2px 0; -} -.ant-cascader-menu-rtl .ant-cascader-menu:last-child { - margin-right: 0; - margin-left: -1px; - border-left-color: transparent; - border-radius: 2px 0 0 2px; -} -.ant-cascader-menu-rtl .ant-cascader-menu:only-child { - border-radius: 2px; -} -.ant-cascader-menu-rtl .ant-cascader-menu-item-expand { - padding-right: 12px; - padding-left: 24px; -} -.ant-cascader-menu-rtl .ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon, -.ant-cascader-menu-rtl .ant-cascader-menu-item-loading-icon { - right: auto; - left: 12px; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-input-affix-wrapper { - position: relative; - display: inline-block; - width: 100%; - min-width: 0; - padding: 4px 11px; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - line-height: 1.5715; - background-color: #fff; - background-image: none; - border: 1px solid #d9d9d9; - border-radius: 2px; - -webkit-transition: all 0.3s; - transition: all 0.3s; - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; -} -.ant-input-affix-wrapper::-moz-placeholder { - opacity: 1; -} -.ant-input-affix-wrapper::-webkit-input-placeholder { - color: #bfbfbf; -} -.ant-input-affix-wrapper:-ms-input-placeholder { - color: #bfbfbf; -} -.ant-input-affix-wrapper::-ms-input-placeholder { - color: #bfbfbf; -} -.ant-input-affix-wrapper::placeholder { - color: #bfbfbf; -} -.ant-input-affix-wrapper:-moz-placeholder-shown { - text-overflow: ellipsis; -} -.ant-input-affix-wrapper:-ms-input-placeholder { - text-overflow: ellipsis; -} -.ant-input-affix-wrapper:placeholder-shown { - text-overflow: ellipsis; -} -.ant-input-affix-wrapper:hover { - border-color: #40a9ff; - border-right-width: 1px !important; -} -.ant-input-rtl .ant-input-affix-wrapper:hover { - border-right-width: 0; - border-left-width: 1px !important; -} -.ant-input-affix-wrapper:focus, -.ant-input-affix-wrapper-focused { - border-color: #40a9ff; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); - box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); -} -.ant-input-rtl .ant-input-affix-wrapper:focus, -.ant-input-rtl .ant-input-affix-wrapper-focused { - border-right-width: 0; - border-left-width: 1px !important; -} -.ant-input-affix-wrapper-disabled { - color: rgba(0, 0, 0, 0.25); - background-color: #f5f5f5; - cursor: not-allowed; - opacity: 1; -} -.ant-input-affix-wrapper-disabled:hover { - border-color: #d9d9d9; - border-right-width: 1px !important; -} -.ant-input-affix-wrapper[disabled] { - color: rgba(0, 0, 0, 0.25); - background-color: #f5f5f5; - cursor: not-allowed; - opacity: 1; -} -.ant-input-affix-wrapper[disabled]:hover { - border-color: #d9d9d9; - border-right-width: 1px !important; -} -textarea.ant-input-affix-wrapper { - max-width: 100%; - height: auto; - min-height: 32px; - line-height: 1.5715; - vertical-align: bottom; - -webkit-transition: all 0.3s, height 0s; - transition: all 0.3s, height 0s; -} -.ant-input-affix-wrapper-lg { - padding: 6.5px 11px; - font-size: 16px; -} -.ant-input-affix-wrapper-sm { - padding: 0px 7px; -} -.ant-input-affix-wrapper-rtl { - direction: rtl; -} -.ant-input-affix-wrapper-disabled .ant-input[disabled] { - background: transparent; -} -.ant-input-affix-wrapper > input.ant-input { - padding: 0; - border: none; - outline: none; -} -.ant-input-affix-wrapper > input.ant-input:focus { - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-input-affix-wrapper::before { - width: 0; - visibility: hidden; - content: '\a0'; -} -.ant-input-prefix, -.ant-input-suffix { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} -.ant-input-prefix { - margin-right: 4px; -} -.ant-input-suffix { - margin-left: 4px; -} -.ant-input-clear-icon { - color: rgba(0, 0, 0, 0.25); - font-size: 12px; - cursor: pointer; - -webkit-transition: color 0.3s; - transition: color 0.3s; - margin: 0 4px; - vertical-align: -1px; -} -.ant-input-clear-icon:hover { - color: rgba(0, 0, 0, 0.45); -} -.ant-input-clear-icon:active { - color: rgba(0, 0, 0, 0.65); -} -.ant-input-clear-icon + i { - margin-left: 6px; -} -.ant-input-clear-icon-hidden { - visibility: hidden; -} -.ant-input-clear-icon:last-child { - margin-right: 0; -} -.ant-input-affix-wrapper-textarea-with-clear-btn { - padding: 0 !important; - border: 0 !important; -} -.ant-input-textarea-clear-icon { - color: rgba(0, 0, 0, 0.25); - font-size: 12px; - cursor: pointer; - -webkit-transition: color 0.3s; - transition: color 0.3s; - position: absolute; - top: 0; - right: 0; - z-index: 1; - margin: 8px 8px 0 0; -} -.ant-input-textarea-clear-icon:hover { - color: rgba(0, 0, 0, 0.45); -} -.ant-input-textarea-clear-icon:active { - color: rgba(0, 0, 0, 0.65); -} -.ant-input-textarea-clear-icon + i { - margin-left: 6px; -} -.ant-input-textarea-clear-icon-hidden { - visibility: hidden; -} -.ant-input { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - font-variant: tabular-nums; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - display: inline-block; - width: 100%; - min-width: 0; - padding: 4px 11px; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - line-height: 1.5715; - background-color: #fff; - background-image: none; - border: 1px solid #d9d9d9; - border-radius: 2px; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-input::-moz-placeholder { - opacity: 1; -} -.ant-input::-webkit-input-placeholder { - color: #bfbfbf; -} -.ant-input:-ms-input-placeholder { - color: #bfbfbf; -} -.ant-input::-ms-input-placeholder { - color: #bfbfbf; -} -.ant-input::placeholder { - color: #bfbfbf; -} -.ant-input:-moz-placeholder-shown { - text-overflow: ellipsis; -} -.ant-input:-ms-input-placeholder { - text-overflow: ellipsis; -} -.ant-input:placeholder-shown { - text-overflow: ellipsis; -} -.ant-input:hover { - border-color: #40a9ff; - border-right-width: 1px !important; -} -.ant-input-rtl .ant-input:hover { - border-right-width: 0; - border-left-width: 1px !important; -} -.ant-input:focus, -.ant-input-focused { - border-color: #40a9ff; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); - box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); -} -.ant-input-rtl .ant-input:focus, -.ant-input-rtl .ant-input-focused { - border-right-width: 0; - border-left-width: 1px !important; -} -.ant-input-disabled { - color: rgba(0, 0, 0, 0.25); - background-color: #f5f5f5; - cursor: not-allowed; - opacity: 1; -} -.ant-input-disabled:hover { - border-color: #d9d9d9; - border-right-width: 1px !important; -} -.ant-input[disabled] { - color: rgba(0, 0, 0, 0.25); - background-color: #f5f5f5; - cursor: not-allowed; - opacity: 1; -} -.ant-input[disabled]:hover { - border-color: #d9d9d9; - border-right-width: 1px !important; -} -textarea.ant-input { - max-width: 100%; - height: auto; - min-height: 32px; - line-height: 1.5715; - vertical-align: bottom; - -webkit-transition: all 0.3s, height 0s; - transition: all 0.3s, height 0s; -} -.ant-input-lg { - padding: 6.5px 11px; - font-size: 16px; -} -.ant-input-sm { - padding: 0px 7px; -} -.ant-input-rtl { - direction: rtl; -} -.ant-input-group { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - display: table; - width: 100%; - border-collapse: separate; - border-spacing: 0; -} -.ant-input-group[class*='col-'] { - float: none; - padding-right: 0; - padding-left: 0; -} -.ant-input-group > [class*='col-'] { - padding-right: 8px; -} -.ant-input-group > [class*='col-']:last-child { - padding-right: 0; -} -.ant-input-group-addon, -.ant-input-group-wrap, -.ant-input-group > .ant-input { - display: table-cell; -} -.ant-input-group-addon:not(:first-child):not(:last-child), -.ant-input-group-wrap:not(:first-child):not(:last-child), -.ant-input-group > .ant-input:not(:first-child):not(:last-child) { - border-radius: 0; -} -.ant-input-group-addon, -.ant-input-group-wrap { - width: 1px; - white-space: nowrap; - vertical-align: middle; -} -.ant-input-group-wrap > * { - display: block !important; -} -.ant-input-group .ant-input { - float: left; - width: 100%; - margin-bottom: 0; - text-align: inherit; -} -.ant-input-group .ant-input:focus { - z-index: 1; - border-right-width: 1px; -} -.ant-input-group .ant-input:hover { - z-index: 1; - border-right-width: 1px; -} -.ant-input-group-addon { - position: relative; - padding: 0 11px; - color: rgba(0, 0, 0, 0.65); - font-weight: normal; - font-size: 14px; - text-align: center; - background-color: #fafafa; - border: 1px solid #d9d9d9; - border-radius: 2px; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-input-group-addon .ant-select { - margin: -5px -11px; -} -.ant-input-group-addon .ant-select.ant-select-single:not(.ant-select-customize-input) .ant-select-selector { - background-color: inherit; - border: 1px solid transparent; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-input-group-addon .ant-select-open .ant-select-selector, -.ant-input-group-addon .ant-select-focused .ant-select-selector { - color: #1890ff; -} -.ant-input-group-addon > i:only-child::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - content: ''; -} -.ant-input-group > .ant-input:first-child, -.ant-input-group-addon:first-child { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.ant-input-group > .ant-input:first-child .ant-select .ant-select-selector, -.ant-input-group-addon:first-child .ant-select .ant-select-selector { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.ant-input-group > .ant-input-affix-wrapper:not(:first-child) .ant-input { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.ant-input-group > .ant-input-affix-wrapper:not(:last-child) .ant-input { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.ant-input-group-addon:first-child { - border-right: 0; -} -.ant-input-group-addon:last-child { - border-left: 0; -} -.ant-input-group > .ant-input:last-child, -.ant-input-group-addon:last-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.ant-input-group > .ant-input:last-child .ant-select .ant-select-selector, -.ant-input-group-addon:last-child .ant-select .ant-select-selector { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.ant-input-group-lg .ant-input, -.ant-input-group-lg > .ant-input-group-addon { - padding: 6.5px 11px; - font-size: 16px; -} -.ant-input-group-sm .ant-input, -.ant-input-group-sm > .ant-input-group-addon { - padding: 0px 7px; -} -.ant-input-group-lg .ant-select-single .ant-select-selector { - height: 40px; -} -.ant-input-group-sm .ant-select-single .ant-select-selector { - height: 24px; -} -.ant-input-group .ant-input-affix-wrapper:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.ant-input-group .ant-input-affix-wrapper:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.ant-input-group.ant-input-group-compact { - display: block; -} -.ant-input-group.ant-input-group-compact::before { - display: table; - content: ''; -} -.ant-input-group.ant-input-group-compact::after { - display: table; - clear: both; - content: ''; -} -.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child), -.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child), -.ant-input-group.ant-input-group-compact > .ant-input:not(:first-child):not(:last-child) { - border-right-width: 1px; -} -.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):hover, -.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):hover, -.ant-input-group.ant-input-group-compact > .ant-input:not(:first-child):not(:last-child):hover { - z-index: 1; -} -.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):focus, -.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):focus, -.ant-input-group.ant-input-group-compact > .ant-input:not(:first-child):not(:last-child):focus { - z-index: 1; -} -.ant-input-group.ant-input-group-compact > * { - display: inline-block; - float: none; - vertical-align: top; - border-radius: 0; -} -.ant-input-group.ant-input-group-compact > .ant-input-affix-wrapper { - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; -} -.ant-input-group.ant-input-group-compact > .ant-picker-range { - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; -} -.ant-input-group.ant-input-group-compact > *:not(:last-child) { - margin-right: -1px; - border-right-width: 1px; -} -.ant-input-group.ant-input-group-compact .ant-input { - float: none; -} -.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-selector, -.ant-input-group.ant-input-group-compact > .ant-calendar-picker .ant-input, -.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input, -.ant-input-group.ant-input-group-compact > .ant-cascader-picker .ant-input, -.ant-input-group.ant-input-group-compact > .ant-mention-wrapper .ant-mention-editor, -.ant-input-group.ant-input-group-compact > .ant-time-picker .ant-time-picker-input, -.ant-input-group.ant-input-group-compact > .ant-input-group-wrapper .ant-input { - border-right-width: 1px; - border-radius: 0; -} -.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-selector:hover, -.ant-input-group.ant-input-group-compact > .ant-calendar-picker .ant-input:hover, -.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input:hover, -.ant-input-group.ant-input-group-compact > .ant-cascader-picker .ant-input:hover, -.ant-input-group.ant-input-group-compact > .ant-mention-wrapper .ant-mention-editor:hover, -.ant-input-group.ant-input-group-compact > .ant-time-picker .ant-time-picker-input:hover, -.ant-input-group.ant-input-group-compact > .ant-input-group-wrapper .ant-input:hover { - z-index: 1; -} -.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-selector:focus, -.ant-input-group.ant-input-group-compact > .ant-calendar-picker .ant-input:focus, -.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input:focus, -.ant-input-group.ant-input-group-compact > .ant-cascader-picker .ant-input:focus, -.ant-input-group.ant-input-group-compact > .ant-mention-wrapper .ant-mention-editor:focus, -.ant-input-group.ant-input-group-compact > .ant-time-picker .ant-time-picker-input:focus, -.ant-input-group.ant-input-group-compact > .ant-input-group-wrapper .ant-input:focus { - z-index: 1; -} -.ant-input-group.ant-input-group-compact > .ant-select-focused { - z-index: 1; -} -.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-arrow { - z-index: 1; -} -.ant-input-group.ant-input-group-compact > *:first-child, -.ant-input-group.ant-input-group-compact > .ant-select:first-child > .ant-select-selector, -.ant-input-group.ant-input-group-compact > .ant-calendar-picker:first-child .ant-input, -.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:first-child .ant-input, -.ant-input-group.ant-input-group-compact > .ant-cascader-picker:first-child .ant-input, -.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:first-child .ant-mention-editor, -.ant-input-group.ant-input-group-compact > .ant-time-picker:first-child .ant-time-picker-input { - border-top-left-radius: 2px; - border-bottom-left-radius: 2px; -} -.ant-input-group.ant-input-group-compact > *:last-child, -.ant-input-group.ant-input-group-compact > .ant-select:last-child > .ant-select-selector, -.ant-input-group.ant-input-group-compact > .ant-calendar-picker:last-child .ant-input, -.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:last-child .ant-input, -.ant-input-group.ant-input-group-compact > .ant-cascader-picker:last-child .ant-input, -.ant-input-group.ant-input-group-compact > .ant-cascader-picker-focused:last-child .ant-input, -.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:last-child .ant-mention-editor, -.ant-input-group.ant-input-group-compact > .ant-time-picker:last-child .ant-time-picker-input { - border-right-width: 1px; - border-top-right-radius: 2px; - border-bottom-right-radius: 2px; -} -.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input { - vertical-align: top; -} -.ant-input-group > .ant-input-rtl:first-child, -.ant-input-group-rtl .ant-input-group-addon:first-child { - border-radius: 0 2px 2px 0; -} -.ant-input-group-rtl .ant-input-group-addon:first-child { - border-right: 1px solid #d9d9d9; - border-left: 0; -} -.ant-input-group-rtl .ant-input-group-addon:last-child { - border-right: 0; - border-left: 1px solid #d9d9d9; -} -.ant-input-group-rtl .ant-input-group > .ant-input:last-child, -.ant-input-group-rtl .ant-input-group-addon:last-child { - border-radius: 2px 0 0 2px; -} -.ant-input-group-rtl.ant-input-group .ant-input-affix-wrapper:not(:first-child) { - border-radius: 2px 0 0 2px; -} -.ant-input-group-rtl.ant-input-group .ant-input-affix-wrapper:not(:last-child) { - border-radius: 0 2px 2px 0; -} -.ant-input-group-rtl.ant-input-group.ant-input-group-compact > *:not(:last-child) { - margin-right: 0; - margin-left: -1px; - border-left-width: 1px; -} -.ant-input-group-rtl.ant-input-group.ant-input-group-compact > *:first-child, -.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-select:first-child > .ant-select-selector, -.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-calendar-picker:first-child .ant-input, -.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:first-child .ant-input, -.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-cascader-picker:first-child .ant-input, -.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:first-child .ant-mention-editor, -.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-time-picker:first-child .ant-time-picker-input { - border-radius: 0 2px 2px 0; -} -.ant-input-group-rtl.ant-input-group.ant-input-group-compact > *:last-child, -.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-select:last-child > .ant-select-selector, -.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-calendar-picker:last-child .ant-input, -.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:last-child .ant-input, -.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-cascader-picker:last-child .ant-input, -.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-cascader-picker-focused:last-child .ant-input, -.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:last-child .ant-mention-editor, -.ant-input-group-rtl.ant-input-group.ant-input-group-compact > .ant-time-picker:last-child .ant-time-picker-input { - border-left-width: 1px; - border-radius: 2px 0 0 2px; -} -.ant-input-group-wrapper { - display: inline-block; - width: 100%; - text-align: start; - vertical-align: top; -} -.ant-input-password-icon { - color: rgba(0, 0, 0, 0.45); - cursor: pointer; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-input-password-icon:hover { - color: rgba(0, 0, 0, 0.85); -} -.ant-input[type='color'] { - height: 32px; -} -.ant-input[type='color'].ant-input-lg { - height: 40px; -} -.ant-input[type='color'].ant-input-sm { - height: 24px; - padding-top: 3px; - padding-bottom: 3px; -} -.ant-input-search-icon { - padding: 0 9px; -} -.ant-input-search-icon::before { - -webkit-transform: translateX(-10px); - transform: translateX(-10px); -} -.ant-input-search-icon::after { - width: 32px; -} -.ant-input-affix-wrapper-lg .ant-input-search-icon { - padding: 0 12px; -} -.ant-input-affix-wrapper-lg .ant-input-search-icon::before { - -webkit-transform: translateX(-13px); - transform: translateX(-13px); -} -.ant-input-affix-wrapper-lg .ant-input-search-icon::after { - width: 40px; -} -.ant-input-affix-wrapper-sm .ant-input-search-icon { - padding: 0 6px; -} -.ant-input-affix-wrapper-sm .ant-input-search-icon::before { - -webkit-transform: translateX(-7px); - transform: translateX(-7px); -} -.ant-input-affix-wrapper-sm .ant-input-search-icon::after { - width: 24px; -} -.ant-input-search-icon { - margin-left: 0.5em; - color: rgba(0, 0, 0, 0.45); - cursor: pointer; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-input-search-icon:hover { - color: rgba(0, 0, 0, 0.85); -} -.ant-input-search-icon::before { - position: absolute; - top: 0; - bottom: 0; - display: block; - border-left: 1px solid #d9d9d9; - -webkit-transition: all 0.3s; - transition: all 0.3s; - content: ''; -} -.ant-input-search-icon::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - content: ''; -} -.ant-input-search:not(.ant-input-search-enter-button) { - padding-right: 0; -} -.ant-input-search-enter-button input { - border-right: 0; -} -.ant-input-search-enter-button input:hover, -.ant-input-search-enter-button input:focus { - border-color: #40a9ff; -} -.ant-input-search-enter-button.ant-input-affix-wrapper { - border-right: 0; -} -.ant-input-search-enter-button + .ant-input-group-addon, -.ant-input-search-enter-button input + .ant-input-group-addon { - padding: 0; - border: 0; -} -.ant-input-search-enter-button + .ant-input-group-addon .ant-input-search-button, -.ant-input-search-enter-button input + .ant-input-group-addon .ant-input-search-button { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.ant-input-group-wrapper-rtl { - direction: rtl; -} -.ant-input-group-rtl { - direction: rtl; -} -.ant-input-affix-wrapper.ant-input-affix-wrapper-rtl > input.ant-input { - border: none; - outline: none; -} -.ant-input-affix-wrapper-rtl .ant-input-prefix { - margin: 0 0 0 4px; -} -.ant-input-affix-wrapper-rtl .ant-input-suffix { - margin: 0 4px 0 0; -} -.ant-input-affix-wrapper-rtl .ant-input-clear-icon:last-child { - margin-right: 4px; - margin-left: 0; -} -.ant-input-affix-wrapper-rtl .ant-input-textarea-clear-icon { - right: auto; - left: 0; - margin: 8px 0 0 8px; -} -.ant-input-search-rtl { - direction: rtl; -} -.ant-input-search-rtl .ant-input-search-icon { - margin-right: 0.5em; - margin-left: 0; -} -.ant-input-search-rtl .ant-input-search-icon::before { - border-left: none; -} -.ant-input-search-rtl .ant-input-search-icon::after { - right: auto; - left: 0; - border-right: 1px solid #d9d9d9; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-input-search-rtl.ant-input-search:not(.ant-input-search-enter-button) { - padding-right: 11px; - padding-left: 0; -} -.ant-input-search-rtl.ant-input-search-enter-button input { - border-right: 1px solid #d9d9d9; - border-left: 0; -} -.ant-input-search-rtl.ant-input-search-enter-button input:hover, -.ant-input-search-rtl.ant-input-search-enter-button input:focus { - border-color: #40a9ff; -} -.ant-input-search-rtl.ant-input-search-enter-button.ant-input-affix-wrapper { - border-right: 1px solid #d9d9d9; - border-left: 0; -} -.ant-input-search-rtl.ant-input-search-enter-button.ant-input-affix-wrapper:hover, -.ant-input-search-rtl.ant-input-search-enter-button.ant-input-affix-wrapper:focus { - border-color: #40a9ff; -} -.ant-input-search-rtl.ant-input-search-enter-button + .ant-input-group-addon .ant-input-search-button, -.ant-input-search-rtl.ant-input-search-enter-button input + .ant-input-group-addon .ant-input-search-button { - width: 100%; - border-radius: 2px 0 0 2px; -} -@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { - .ant-input { - height: 32px; - } - .ant-input-lg { - height: 40px; - } - .ant-input-sm { - height: 24px; - } - .ant-input-affix-wrapper > input.ant-input { - height: auto; - } -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -@-webkit-keyframes antCheckboxEffect { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 0.5; - } - 100% { - -webkit-transform: scale(1.6); - transform: scale(1.6); - opacity: 0; - } -} -@keyframes antCheckboxEffect { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 0.5; - } - 100% { - -webkit-transform: scale(1.6); - transform: scale(1.6); - opacity: 0; - } -} -.ant-checkbox { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - top: -0.09em; - display: inline-block; - line-height: 1; - white-space: nowrap; - vertical-align: middle; - outline: none; - cursor: pointer; -} -.ant-checkbox-wrapper:hover .ant-checkbox-inner, -.ant-checkbox:hover .ant-checkbox-inner, -.ant-checkbox-input:focus + .ant-checkbox-inner { - border-color: #1890ff; -} -.ant-checkbox-checked::after { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - border: 1px solid #1890ff; - border-radius: 2px; - visibility: hidden; - -webkit-animation: antCheckboxEffect 0.36s ease-in-out; - animation: antCheckboxEffect 0.36s ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; - content: ''; -} -.ant-checkbox:hover::after, -.ant-checkbox-wrapper:hover .ant-checkbox::after { - visibility: visible; -} -.ant-checkbox-inner { - position: relative; - top: 0; - left: 0; - display: block; - width: 16px; - height: 16px; - direction: ltr; - background-color: #fff; - border: 1px solid #d9d9d9; - border-radius: 2px; - border-collapse: separate; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-checkbox-inner::after { - position: absolute; - top: 50%; - left: 22%; - display: table; - width: 5.71428571px; - height: 9.14285714px; - border: 2px solid #fff; - border-top: 0; - border-left: 0; - -webkit-transform: rotate(45deg) scale(0) translate(-50%, -50%); - transform: rotate(45deg) scale(0) translate(-50%, -50%); - opacity: 0; - -webkit-transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s; - transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s; - content: ' '; -} -.ant-checkbox-input { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - width: 100%; - height: 100%; - cursor: pointer; - opacity: 0; -} -.ant-checkbox-checked .ant-checkbox-inner::after { - position: absolute; - display: table; - border: 2px solid #fff; - border-top: 0; - border-left: 0; - -webkit-transform: rotate(45deg) scale(1) translate(-50%, -50%); - transform: rotate(45deg) scale(1) translate(-50%, -50%); - opacity: 1; - -webkit-transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s; - transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s; - content: ' '; -} -.ant-checkbox-checked .ant-checkbox-inner { - background-color: #1890ff; - border-color: #1890ff; -} -.ant-checkbox-disabled { - cursor: not-allowed; -} -.ant-checkbox-disabled.ant-checkbox-checked .ant-checkbox-inner::after { - border-color: rgba(0, 0, 0, 0.25); - -webkit-animation-name: none; - animation-name: none; -} -.ant-checkbox-disabled .ant-checkbox-input { - cursor: not-allowed; -} -.ant-checkbox-disabled .ant-checkbox-inner { - background-color: #f5f5f5; - border-color: #d9d9d9 !important; -} -.ant-checkbox-disabled .ant-checkbox-inner::after { - border-color: #f5f5f5; - border-collapse: separate; - -webkit-animation-name: none; - animation-name: none; -} -.ant-checkbox-disabled + span { - color: rgba(0, 0, 0, 0.25); - cursor: not-allowed; -} -.ant-checkbox-disabled:hover::after, -.ant-checkbox-wrapper:hover .ant-checkbox-disabled::after { - visibility: hidden; -} -.ant-checkbox-wrapper { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - display: inline-block; - line-height: unset; - cursor: pointer; -} -.ant-checkbox-wrapper.ant-checkbox-wrapper-disabled { - cursor: not-allowed; -} -.ant-checkbox-wrapper + .ant-checkbox-wrapper { - margin-left: 8px; -} -.ant-checkbox + span { - padding-right: 8px; - padding-left: 8px; -} -.ant-checkbox-group { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - display: inline-block; -} -.ant-checkbox-group-item { - display: inline-block; - margin-right: 8px; -} -.ant-checkbox-group-item:last-child { - margin-right: 0; -} -.ant-checkbox-group-item + .ant-checkbox-group-item { - margin-left: 0; -} -.ant-checkbox-indeterminate .ant-checkbox-inner { - background-color: #fff; - border-color: #d9d9d9; -} -.ant-checkbox-indeterminate .ant-checkbox-inner::after { - top: 50%; - left: 50%; - width: 8px; - height: 8px; - background-color: #1890ff; - border: 0; - -webkit-transform: translate(-50%, -50%) scale(1); - transform: translate(-50%, -50%) scale(1); - opacity: 1; - content: ' '; -} -.ant-checkbox-indeterminate.ant-checkbox-disabled .ant-checkbox-inner::after { - background-color: rgba(0, 0, 0, 0.25); - border-color: rgba(0, 0, 0, 0.25); -} -.ant-checkbox-rtl { - direction: rtl; -} -.ant-checkbox-group-rtl .ant-checkbox-group-item { - margin-right: 0; - margin-left: 8px; -} -.ant-checkbox-group-rtl .ant-checkbox-group-item:last-child { - margin-left: 0 !important; -} -.ant-checkbox-group-rtl .ant-checkbox-group-item + .ant-checkbox-group-item { - margin-left: 8px; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-collapse { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - background-color: #fafafa; - border: 1px solid #d9d9d9; - border-bottom: 0; - border-radius: 2px; -} -.ant-collapse > .ant-collapse-item { - border-bottom: 1px solid #d9d9d9; -} -.ant-collapse > .ant-collapse-item:last-child, -.ant-collapse > .ant-collapse-item:last-child > .ant-collapse-header { - border-radius: 0 0 2px 2px; -} -.ant-collapse > .ant-collapse-item > .ant-collapse-header { - position: relative; - padding: 12px 16px; - padding-left: 40px; - color: rgba(0, 0, 0, 0.85); - line-height: 1.5715; - cursor: pointer; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-collapse > .ant-collapse-item > .ant-collapse-header::before { - display: table; - content: ''; -} -.ant-collapse > .ant-collapse-item > .ant-collapse-header::after { - display: table; - clear: both; - content: ''; -} -.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow { - color: inherit; - font-style: normal; - line-height: 0; - text-align: center; - text-transform: none; - vertical-align: -0.125em; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - position: absolute; - top: 50%; - left: 16px; - display: inline-block; - font-size: 12px; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); -} -.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow > * { - line-height: 1; -} -.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow svg { - display: inline-block; -} -.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow::before { - display: none; -} -.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow .ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow-icon { - display: block; -} -.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow svg { - -webkit-transition: -webkit-transform 0.24s; - transition: -webkit-transform 0.24s; - transition: transform 0.24s; - transition: transform 0.24s, -webkit-transform 0.24s; -} -.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-extra { - float: right; -} -.ant-collapse > .ant-collapse-item > .ant-collapse-header:focus { - outline: none; -} -.ant-collapse > .ant-collapse-item.ant-collapse-no-arrow > .ant-collapse-header { - padding-left: 12px; -} -.ant-collapse-icon-position-right > .ant-collapse-item > .ant-collapse-header { - padding: 12px 16px; - padding-right: 40px; -} -.ant-collapse-icon-position-right > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow { - right: 16px; - left: auto; -} -.ant-collapse-anim-active { - -webkit-transition: height 0.2s cubic-bezier(0.215, 0.61, 0.355, 1); - transition: height 0.2s cubic-bezier(0.215, 0.61, 0.355, 1); -} -.ant-collapse-content { - overflow: hidden; - color: rgba(0, 0, 0, 0.65); - background-color: #fff; - border-top: 1px solid #d9d9d9; -} -.ant-collapse-content > .ant-collapse-content-box { - padding: 16px; -} -.ant-collapse-content-inactive { - display: none; -} -.ant-collapse-item:last-child > .ant-collapse-content { - border-radius: 0 0 2px 2px; -} -.ant-collapse-borderless { - background-color: #fafafa; - border: 0; -} -.ant-collapse-borderless > .ant-collapse-item { - border-bottom: 1px solid #d9d9d9; -} -.ant-collapse-borderless > .ant-collapse-item:last-child, -.ant-collapse-borderless > .ant-collapse-item:last-child .ant-collapse-header { - border-radius: 0; -} -.ant-collapse-borderless > .ant-collapse-item > .ant-collapse-content { - background-color: transparent; - border-top: 0; -} -.ant-collapse-borderless > .ant-collapse-item > .ant-collapse-content > .ant-collapse-content-box { - padding-top: 4px; -} -.ant-collapse-ghost { - background-color: transparent; - border: 0; -} -.ant-collapse-ghost > .ant-collapse-item { - border-bottom: 0; -} -.ant-collapse-ghost > .ant-collapse-item > .ant-collapse-content { - background-color: transparent; - border-top: 0; -} -.ant-collapse-ghost > .ant-collapse-item > .ant-collapse-content > .ant-collapse-content-box { - padding-top: 12px; - padding-bottom: 12px; -} -.ant-collapse .ant-collapse-item-disabled > .ant-collapse-header, -.ant-collapse .ant-collapse-item-disabled > .ant-collapse-header > .arrow { - color: rgba(0, 0, 0, 0.25); - cursor: not-allowed; -} -.ant-collapse-rtl { - direction: rtl; -} -.ant-collapse-rtl .ant-collapse > .ant-collapse-item > .ant-collapse-header { - padding: 12px 16px; - padding-right: 40px; -} -.ant-collapse-rtl.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-arrow svg { - -webkit-transform: rotate(180deg); - transform: rotate(180deg); -} -.ant-collapse-rtl.ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-extra { - float: left; -} -.ant-collapse-rtl.ant-collapse > .ant-collapse-item.ant-collapse-no-arrow > .ant-collapse-header { - padding-right: 12px; - padding-left: 0; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-comment { - position: relative; - background-color: inherit; -} -.ant-comment-inner { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - padding: 16px 0; -} -.ant-comment-avatar { - position: relative; - -ms-flex-negative: 0; - flex-shrink: 0; - margin-right: 12px; - cursor: pointer; -} -.ant-comment-avatar img { - width: 32px; - height: 32px; - border-radius: 50%; -} -.ant-comment-content { - position: relative; - -webkit-box-flex: 1; - -ms-flex: 1 1 auto; - flex: 1 1 auto; - min-width: 1px; - font-size: 14px; - word-wrap: break-word; -} -.ant-comment-content-author { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - margin-bottom: 4px; - font-size: 14px; -} -.ant-comment-content-author > a, -.ant-comment-content-author > span { - padding-right: 8px; - font-size: 12px; - line-height: 18px; -} -.ant-comment-content-author-name { - color: rgba(0, 0, 0, 0.45); - font-size: 14px; - -webkit-transition: color 0.3s; - transition: color 0.3s; -} -.ant-comment-content-author-name > * { - color: rgba(0, 0, 0, 0.45); -} -.ant-comment-content-author-name > *:hover { - color: rgba(0, 0, 0, 0.45); -} -.ant-comment-content-author-time { - color: #ccc; - white-space: nowrap; - cursor: auto; -} -.ant-comment-content-detail p { - margin-bottom: inherit; - white-space: pre-wrap; -} -.ant-comment-actions { - margin-top: 12px; - margin-bottom: inherit; - padding-left: 0; -} -.ant-comment-actions > li { - display: inline-block; - color: rgba(0, 0, 0, 0.45); -} -.ant-comment-actions > li > span { - margin-right: 10px; - color: rgba(0, 0, 0, 0.45); - font-size: 12px; - cursor: pointer; - -webkit-transition: color 0.3s; - transition: color 0.3s; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.ant-comment-actions > li > span:hover { - color: #595959; -} -.ant-comment-nested { - margin-left: 44px; -} -.ant-comment-rtl { - direction: rtl; -} -.ant-comment-rtl .ant-comment-avatar { - margin-right: 0; - margin-left: 12px; -} -.ant-comment-rtl .ant-comment-content-author > a, -.ant-comment-rtl .ant-comment-content-author > span { - padding-right: 0; - padding-left: 8px; -} -.ant-comment-rtl .ant-comment-actions { - padding-right: 0; -} -.ant-comment-rtl .ant-comment-actions > li > span { - margin-right: 0; - margin-left: 10px; -} -.ant-comment-rtl .ant-comment-nested { - margin-right: 44px; - margin-left: 0; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-descriptions-title { - margin-bottom: 20px; - color: rgba(0, 0, 0, 0.85); - font-weight: bold; - font-size: 16px; - line-height: 1.5715; -} -.ant-descriptions-view { - width: 100%; - overflow: hidden; - border-radius: 2px; -} -.ant-descriptions-view table { - width: 100%; - table-layout: fixed; -} -.ant-descriptions-row > th, -.ant-descriptions-row > td { - padding-bottom: 16px; -} -.ant-descriptions-row:last-child { - border-bottom: none; -} -.ant-descriptions-item-label { - color: rgba(0, 0, 0, 0.85); - font-weight: normal; - font-size: 14px; - line-height: 1.5715; - text-align: start; -} -.ant-descriptions-item-label::after { - content: ':'; - position: relative; - top: -0.5px; - margin: 0 8px 0 2px; -} -.ant-descriptions-item-label.ant-descriptions-item-no-colon::after { - content: ' '; -} -.ant-descriptions-item-no-label::after { - margin: 0; - content: ''; -} -.ant-descriptions-item-content { - display: table-cell; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - line-height: 1.5715; -} -.ant-descriptions-item { - padding-bottom: 0; -} -.ant-descriptions-item > span { - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-box-align: baseline; - -ms-flex-align: baseline; - align-items: baseline; -} -.ant-descriptions-middle .ant-descriptions-row > th, -.ant-descriptions-middle .ant-descriptions-row > td { - padding-bottom: 12px; -} -.ant-descriptions-small .ant-descriptions-row > th, -.ant-descriptions-small .ant-descriptions-row > td { - padding-bottom: 8px; -} -.ant-descriptions-bordered .ant-descriptions-view { - border: 1px solid #f0f0f0; -} -.ant-descriptions-bordered .ant-descriptions-view > table { - table-layout: auto; -} -.ant-descriptions-bordered .ant-descriptions-item-label, -.ant-descriptions-bordered .ant-descriptions-item-content { - padding: 16px 24px; - border-right: 1px solid #f0f0f0; -} -.ant-descriptions-bordered .ant-descriptions-item-label:last-child, -.ant-descriptions-bordered .ant-descriptions-item-content:last-child { - border-right: none; -} -.ant-descriptions-bordered .ant-descriptions-item-label { - background-color: #fafafa; -} -.ant-descriptions-bordered .ant-descriptions-item-label::after { - display: none; -} -.ant-descriptions-bordered .ant-descriptions-row { - border-bottom: 1px solid #f0f0f0; -} -.ant-descriptions-bordered .ant-descriptions-row:last-child { - border-bottom: none; -} -.ant-descriptions-bordered.ant-descriptions-middle .ant-descriptions-item-label, -.ant-descriptions-bordered.ant-descriptions-middle .ant-descriptions-item-content { - padding: 12px 24px; -} -.ant-descriptions-bordered.ant-descriptions-small .ant-descriptions-item-label, -.ant-descriptions-bordered.ant-descriptions-small .ant-descriptions-item-content { - padding: 8px 16px; -} -.ant-descriptions-rtl { - direction: rtl; -} -.ant-descriptions-rtl .ant-descriptions-item-label::after { - margin: 0 2px 0 8px; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-divider { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - border-top: 1px solid #f0f0f0; -} -.ant-divider-vertical { - position: relative; - top: -0.06em; - display: inline-block; - height: 0.9em; - margin: 0 8px; - vertical-align: middle; - border-top: 0; - border-left: 1px solid #f0f0f0; -} -.ant-divider-horizontal { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - clear: both; - width: 100%; - min-width: 100%; - margin: 24px 0; -} -.ant-divider-horizontal.ant-divider-with-text { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - margin: 16px 0; - color: rgba(0, 0, 0, 0.85); - font-weight: 500; - font-size: 16px; - white-space: nowrap; - text-align: center; - border-top: 0; -} -.ant-divider-horizontal.ant-divider-with-text::before, -.ant-divider-horizontal.ant-divider-with-text::after { - position: relative; - top: 50%; - width: 50%; - border-top: 1px solid #f0f0f0; - -webkit-transform: translateY(50%); - transform: translateY(50%); - content: ''; -} -.ant-divider-horizontal.ant-divider-with-text-left::before { - top: 50%; - width: 5%; -} -.ant-divider-horizontal.ant-divider-with-text-left::after { - top: 50%; - width: 95%; -} -.ant-divider-horizontal.ant-divider-with-text-right::before { - top: 50%; - width: 95%; -} -.ant-divider-horizontal.ant-divider-with-text-right::after { - top: 50%; - width: 5%; -} -.ant-divider-inner-text { - display: inline-block; - padding: 0 1em; -} -.ant-divider-dashed { - background: none; - border-color: #f0f0f0; - border-style: dashed; - border-width: 1px 0 0; -} -.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed { - border-top: 0; -} -.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed::before, -.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed::after { - border-style: dashed none none; -} -.ant-divider-vertical.ant-divider-dashed { - border-width: 0 0 0 1px; -} -.ant-divider-plain.ant-divider-with-text { - color: rgba(0, 0, 0, 0.65); - font-weight: normal; - font-size: 14px; -} -.ant-divider-rtl { - direction: rtl; -} -.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-left::before { - width: 95%; -} -.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-left::after { - width: 5%; -} -.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-right::before { - width: 5%; -} -.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-right::after { - width: 95%; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-drawer { - position: fixed; - z-index: 1000; - width: 0%; - height: 100%; - -webkit-transition: height 0s ease 0.3s, width 0s ease 0.3s, -webkit-transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); - transition: height 0s ease 0.3s, width 0s ease 0.3s, -webkit-transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); - transition: transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1), height 0s ease 0.3s, width 0s ease 0.3s; - transition: transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1), height 0s ease 0.3s, width 0s ease 0.3s, -webkit-transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); -} -.ant-drawer > * { - -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1), -webkit-box-shadow 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); - transition: -webkit-transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1), -webkit-box-shadow 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); - transition: transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1), box-shadow 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); - transition: transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1), box-shadow 0.3s cubic-bezier(0.7, 0.3, 0.1, 1), -webkit-transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1), -webkit-box-shadow 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); -} -.ant-drawer-content-wrapper { - position: absolute; - width: 100%; - height: 100%; -} -.ant-drawer .ant-drawer-content { - width: 100%; - height: 100%; -} -.ant-drawer-left, -.ant-drawer-right { - top: 0; - width: 0%; - height: 100%; -} -.ant-drawer-left .ant-drawer-content-wrapper, -.ant-drawer-right .ant-drawer-content-wrapper { - height: 100%; -} -.ant-drawer-left.ant-drawer-open, -.ant-drawer-right.ant-drawer-open { - width: 100%; - -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); - transition: -webkit-transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); - transition: transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); - transition: transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1), -webkit-transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); -} -.ant-drawer-left { - left: 0; -} -.ant-drawer-left .ant-drawer-content-wrapper { - left: 0; -} -.ant-drawer-left.ant-drawer-open .ant-drawer-content-wrapper { - -webkit-box-shadow: 6px 0 16px -8px rgba(0, 0, 0, 0.08), 9px 0 28px 0 rgba(0, 0, 0, 0.05), 12px 0 48px 16px rgba(0, 0, 0, 0.03); - box-shadow: 6px 0 16px -8px rgba(0, 0, 0, 0.08), 9px 0 28px 0 rgba(0, 0, 0, 0.05), 12px 0 48px 16px rgba(0, 0, 0, 0.03); -} -.ant-drawer-right { - right: 0; -} -.ant-drawer-right .ant-drawer-content-wrapper { - right: 0; -} -.ant-drawer-right.ant-drawer-open .ant-drawer-content-wrapper { - -webkit-box-shadow: -6px 0 16px -8px rgba(0, 0, 0, 0.08), -9px 0 28px 0 rgba(0, 0, 0, 0.05), -12px 0 48px 16px rgba(0, 0, 0, 0.03); - box-shadow: -6px 0 16px -8px rgba(0, 0, 0, 0.08), -9px 0 28px 0 rgba(0, 0, 0, 0.05), -12px 0 48px 16px rgba(0, 0, 0, 0.03); -} -.ant-drawer-right.ant-drawer-open.no-mask { - right: 1px; - -webkit-transform: translateX(1px); - transform: translateX(1px); -} -.ant-drawer-top, -.ant-drawer-bottom { - left: 0; - width: 100%; - height: 0%; -} -.ant-drawer-top .ant-drawer-content-wrapper, -.ant-drawer-bottom .ant-drawer-content-wrapper { - width: 100%; -} -.ant-drawer-top.ant-drawer-open, -.ant-drawer-bottom.ant-drawer-open { - height: 100%; - -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); - transition: -webkit-transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); - transition: transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); - transition: transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1), -webkit-transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); -} -.ant-drawer-top { - top: 0; -} -.ant-drawer-top.ant-drawer-open .ant-drawer-content-wrapper { - -webkit-box-shadow: 0 6px 16px -8px rgba(0, 0, 0, 0.08), 0 9px 28px 0 rgba(0, 0, 0, 0.05), 0 12px 48px 16px rgba(0, 0, 0, 0.03); - box-shadow: 0 6px 16px -8px rgba(0, 0, 0, 0.08), 0 9px 28px 0 rgba(0, 0, 0, 0.05), 0 12px 48px 16px rgba(0, 0, 0, 0.03); -} -.ant-drawer-bottom { - bottom: 0; -} -.ant-drawer-bottom .ant-drawer-content-wrapper { - bottom: 0; -} -.ant-drawer-bottom.ant-drawer-open .ant-drawer-content-wrapper { - -webkit-box-shadow: 0 -6px 16px -8px rgba(0, 0, 0, 0.08), 0 -9px 28px 0 rgba(0, 0, 0, 0.05), 0 -12px 48px 16px rgba(0, 0, 0, 0.03); - box-shadow: 0 -6px 16px -8px rgba(0, 0, 0, 0.08), 0 -9px 28px 0 rgba(0, 0, 0, 0.05), 0 -12px 48px 16px rgba(0, 0, 0, 0.03); -} -.ant-drawer-bottom.ant-drawer-open.no-mask { - bottom: 1px; - -webkit-transform: translateY(1px); - transform: translateY(1px); -} -.ant-drawer.ant-drawer-open .ant-drawer-mask { - height: 100%; - opacity: 1; - -webkit-transition: none; - transition: none; - -webkit-animation: antdDrawerFadeIn 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); - animation: antdDrawerFadeIn 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); - pointer-events: auto; -} -.ant-drawer-title { - margin: 0; - color: rgba(0, 0, 0, 0.85); - font-weight: 500; - font-size: 16px; - line-height: 22px; -} -.ant-drawer-content { - position: relative; - z-index: 1; - overflow: auto; - background-color: #fff; - background-clip: padding-box; - border: 0; -} -.ant-drawer-close { - position: absolute; - top: 0; - right: 0; - z-index: 10; - display: block; - padding: 20px; - color: rgba(0, 0, 0, 0.45); - font-weight: 700; - font-size: 16px; - font-style: normal; - line-height: 1; - text-align: center; - text-transform: none; - text-decoration: none; - background: transparent; - border: 0; - outline: 0; - cursor: pointer; - -webkit-transition: color 0.3s; - transition: color 0.3s; - text-rendering: auto; -} -.ant-drawer-close:focus, -.ant-drawer-close:hover { - color: rgba(0, 0, 0, 0.75); - text-decoration: none; -} -.ant-drawer-header-no-title .ant-drawer-close { - margin-right: var(--scroll-bar); - /* stylelint-disable-next-line function-calc-no-invalid */ - padding-right: calc(20px - var(--scroll-bar)); -} -.ant-drawer-header { - position: relative; - padding: 16px 24px; - color: rgba(0, 0, 0, 0.65); - background: #fff; - border-bottom: 1px solid #f0f0f0; - border-radius: 2px 2px 0 0; -} -.ant-drawer-header-no-title { - color: rgba(0, 0, 0, 0.65); - background: #fff; -} -.ant-drawer-wrapper-body { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - width: 100%; - height: 100%; -} -.ant-drawer-body { - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - padding: 24px; - overflow: auto; - font-size: 14px; - line-height: 1.5715; - word-wrap: break-word; -} -.ant-drawer-footer { - -ms-flex-negative: 0; - flex-shrink: 0; - padding: 10px 10px; - border-top: 1px solid #f0f0f0; -} -.ant-drawer-mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 0; - background-color: rgba(0, 0, 0, 0.45); - opacity: 0; - filter: alpha(opacity=45); - -webkit-transition: opacity 0.3s linear, height 0s ease 0.3s; - transition: opacity 0.3s linear, height 0s ease 0.3s; - pointer-events: none; -} -.ant-drawer-open-content { - -webkit-box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); -} -.ant-drawer .ant-picker-clear { - background: #fff; -} -@-webkit-keyframes antdDrawerFadeIn { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } -} -@keyframes antdDrawerFadeIn { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } -} -.ant-drawer-rtl { - direction: rtl; -} -.ant-drawer-rtl .ant-drawer-close { - right: auto; - left: 0; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-form-item .ant-mentions, -.ant-form-item textarea.ant-input { - height: auto; -} -.ant-form-item .ant-upload { - background: transparent; -} -.ant-form-item .ant-upload.ant-upload-drag { - background: #fafafa; -} -.ant-form-item input[type='radio'], -.ant-form-item input[type='checkbox'] { - width: 14px; - height: 14px; -} -.ant-form-item .ant-radio-inline, -.ant-form-item .ant-checkbox-inline { - display: inline-block; - margin-left: 8px; - font-weight: normal; - vertical-align: middle; - cursor: pointer; -} -.ant-form-item .ant-radio-inline:first-child, -.ant-form-item .ant-checkbox-inline:first-child { - margin-left: 0; -} -.ant-form-item .ant-checkbox-vertical, -.ant-form-item .ant-radio-vertical { - display: block; -} -.ant-form-item .ant-checkbox-vertical + .ant-checkbox-vertical, -.ant-form-item .ant-radio-vertical + .ant-radio-vertical { - margin-left: 0; -} -.ant-form-item .ant-input-number + .ant-form-text { - margin-left: 8px; -} -.ant-form-item .ant-input-number-handler-wrap { - z-index: 2; -} -.ant-form-item .ant-select, -.ant-form-item .ant-cascader-picker { - width: 100%; -} -.ant-form-item .ant-input-group .ant-select, -.ant-form-item .ant-input-group .ant-cascader-picker { - width: auto; -} -.ant-form-inline { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; -} -.ant-form-inline .ant-form-item { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - margin-right: 16px; - margin-bottom: 0; -} -.ant-form-inline .ant-form-item-with-help { - margin-bottom: 24px; -} -.ant-form-inline .ant-form-item > .ant-form-item-label, -.ant-form-inline .ant-form-item > .ant-form-item-control { - display: inline-block; - vertical-align: top; -} -.ant-form-inline .ant-form-item > .ant-form-item-label { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; -} -.ant-form-inline .ant-form-item .ant-form-text { - display: inline-block; -} -.ant-form-inline .ant-form-item .ant-form-item-has-feedback { - display: inline-block; -} -.ant-form-horizontal .ant-form-item-label { - -webkit-box-flex: 0; - -ms-flex-positive: 0; - flex-grow: 0; -} -.ant-form-horizontal .ant-form-item-control { - -webkit-box-flex: 1; - -ms-flex: 1 1 0px; - flex: 1 1 0; -} -.ant-form-vertical .ant-form-item { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; -} -.ant-form-vertical .ant-form-item-label > label { - height: auto; -} -.ant-form-vertical .ant-form-item-label, -.ant-col-24.ant-form-item-label, -.ant-col-xl-24.ant-form-item-label { - margin: 0; - padding: 0 0 8px; - line-height: 1.5715; - white-space: initial; - text-align: left; -} -.ant-form-vertical .ant-form-item-label > label, -.ant-col-24.ant-form-item-label > label, -.ant-col-xl-24.ant-form-item-label > label { - margin: 0; -} -.ant-form-vertical .ant-form-item-label > label::after, -.ant-col-24.ant-form-item-label > label::after, -.ant-col-xl-24.ant-form-item-label > label::after { - display: none; -} -.ant-form-rtl.ant-form-vertical .ant-form-item-label, -.ant-form-rtl.ant-col-24.ant-form-item-label, -.ant-form-rtl.ant-col-xl-24.ant-form-item-label { - text-align: right; -} -@media (max-width: 575px) { - .ant-form-item .ant-form-item-label { - margin: 0; - padding: 0 0 8px; - line-height: 1.5715; - white-space: initial; - text-align: left; - } - .ant-form-item .ant-form-item-label > label { - margin: 0; - } - .ant-form-item .ant-form-item-label > label::after { - display: none; - } - .ant-form-rtl.ant-form-item .ant-form-item-label { - text-align: right; - } - .ant-form .ant-form-item { - -ms-flex-wrap: wrap; - flex-wrap: wrap; - } - .ant-form .ant-form-item .ant-form-item-label, - .ant-form .ant-form-item .ant-form-item-control { - -webkit-box-flex: 0; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .ant-col-xs-24.ant-form-item-label { - margin: 0; - padding: 0 0 8px; - line-height: 1.5715; - white-space: initial; - text-align: left; - } - .ant-col-xs-24.ant-form-item-label > label { - margin: 0; - } - .ant-col-xs-24.ant-form-item-label > label::after { - display: none; - } - .ant-form-rtl.ant-col-xs-24.ant-form-item-label { - text-align: right; - } -} -@media (max-width: 767px) { - .ant-col-sm-24.ant-form-item-label { - margin: 0; - padding: 0 0 8px; - line-height: 1.5715; - white-space: initial; - text-align: left; - } - .ant-col-sm-24.ant-form-item-label > label { - margin: 0; - } - .ant-col-sm-24.ant-form-item-label > label::after { - display: none; - } - .ant-form-rtl.ant-col-sm-24.ant-form-item-label { - text-align: right; - } -} -@media (max-width: 991px) { - .ant-col-md-24.ant-form-item-label { - margin: 0; - padding: 0 0 8px; - line-height: 1.5715; - white-space: initial; - text-align: left; - } - .ant-col-md-24.ant-form-item-label > label { - margin: 0; - } - .ant-col-md-24.ant-form-item-label > label::after { - display: none; - } - .ant-form-rtl.ant-col-md-24.ant-form-item-label { - text-align: right; - } -} -@media (max-width: 1199px) { - .ant-col-lg-24.ant-form-item-label { - margin: 0; - padding: 0 0 8px; - line-height: 1.5715; - white-space: initial; - text-align: left; - } - .ant-col-lg-24.ant-form-item-label > label { - margin: 0; - } - .ant-col-lg-24.ant-form-item-label > label::after { - display: none; - } - .ant-form-rtl.ant-col-lg-24.ant-form-item-label { - text-align: right; - } -} -@media (max-width: 1599px) { - .ant-col-xl-24.ant-form-item-label { - margin: 0; - padding: 0 0 8px; - line-height: 1.5715; - white-space: initial; - text-align: left; - } - .ant-col-xl-24.ant-form-item-label > label { - margin: 0; - } - .ant-col-xl-24.ant-form-item-label > label::after { - display: none; - } - .ant-form-rtl.ant-col-xl-24.ant-form-item-label { - text-align: right; - } -} -.ant-form-item { - /* Some non-status related component style is in `components.less` */ -} -.ant-form-item-has-feedback .ant-input { - padding-right: 24px; -} -.ant-form-item-has-feedback .ant-input-affix-wrapper .ant-input-suffix { - padding-right: 18px; -} -.ant-form-item-has-feedback .ant-input-search:not(.ant-input-search-enter-button) .ant-input-suffix { - right: 28px; -} -.ant-form-item-has-feedback .ant-switch { - margin: 2px 0 4px; -} -.ant-form-item-has-feedback > .ant-select .ant-select-arrow, -.ant-form-item-has-feedback > .ant-select .ant-select-selection__clear, -.ant-form-item-has-feedback :not(.ant-input-group-addon) > .ant-select .ant-select-arrow, -.ant-form-item-has-feedback :not(.ant-input-group-addon) > .ant-select .ant-select-selection__clear { - right: 28px; -} -.ant-form-item-has-feedback > .ant-select .ant-select-selection-selected-value, -.ant-form-item-has-feedback :not(.ant-input-group-addon) > .ant-select .ant-select-selection-selected-value { - padding-right: 42px; -} -.ant-form-item-has-feedback .ant-cascader-picker-arrow { - margin-right: 17px; -} -.ant-form-item-has-feedback .ant-cascader-picker-clear { - right: 28px; -} -.ant-form-item-has-feedback .ant-picker { - padding-right: 29.2px; -} -.ant-form-item-has-feedback .ant-picker-large { - padding-right: 29.2px; -} -.ant-form-item-has-feedback .ant-picker-small { - padding-right: 25.2px; -} -.ant-form-item-has-feedback.ant-form-item-has-success .ant-form-item-children-icon, -.ant-form-item-has-feedback.ant-form-item-has-warning .ant-form-item-children-icon, -.ant-form-item-has-feedback.ant-form-item-has-error .ant-form-item-children-icon, -.ant-form-item-has-feedback.ant-form-item-is-validating .ant-form-item-children-icon { - position: absolute; - top: 50%; - right: 0; - z-index: 1; - width: 32px; - height: 20px; - margin-top: -10px; - font-size: 14px; - line-height: 20px; - text-align: center; - visibility: visible; - -webkit-animation: zoomIn 0.3s cubic-bezier(0.12, 0.4, 0.29, 1.46); - animation: zoomIn 0.3s cubic-bezier(0.12, 0.4, 0.29, 1.46); - pointer-events: none; -} -.ant-form-item-has-feedback.ant-form-item-has-success .ant-form-item-children-icon svg, -.ant-form-item-has-feedback.ant-form-item-has-warning .ant-form-item-children-icon svg, -.ant-form-item-has-feedback.ant-form-item-has-error .ant-form-item-children-icon svg, -.ant-form-item-has-feedback.ant-form-item-is-validating .ant-form-item-children-icon svg { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - margin: auto; -} -.ant-form-item-has-success.ant-form-item-has-feedback .ant-form-item-children-icon { - color: #52c41a; - -webkit-animation-name: diffZoomIn1 !important; - animation-name: diffZoomIn1 !important; -} -.ant-form-item-has-warning .ant-form-item-explain, -.ant-form-item-has-warning .ant-form-item-split { - color: #faad14; -} -.ant-form-item-has-warning .ant-input, -.ant-form-item-has-warning .ant-input-affix-wrapper, -.ant-form-item-has-warning .ant-input:hover, -.ant-form-item-has-warning .ant-input-affix-wrapper:hover { - border-color: #faad14; -} -.ant-form-item-has-warning .ant-input:focus, -.ant-form-item-has-warning .ant-input-affix-wrapper:focus, -.ant-form-item-has-warning .ant-input-focused, -.ant-form-item-has-warning .ant-input-affix-wrapper-focused { - border-color: #ffc53d; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); - box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); -} -.ant-form-item-has-warning .ant-input:not(.ant-form-item-has-warning .ant-input-disabled) { - background-color: #fff; -} -.ant-form-item-has-warning .ant-input-affix-wrapper:not(.ant-form-item-has-warning .ant-input-affix-wrapper-disabled) { - background-color: #fff; -} -.ant-form-item-has-warning .ant-input-affix-wrapper input:focus { - -webkit-box-shadow: none !important; - box-shadow: none !important; -} -.ant-form-item-has-warning .ant-calendar-picker-open .ant-calendar-picker-input { - border-color: #ffc53d; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); - box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); -} -.ant-form-item-has-warning .ant-input-prefix { - color: #faad14; -} -.ant-form-item-has-warning .ant-input-group-addon { - color: #faad14; - border-color: #faad14; -} -.ant-form-item-has-warning .has-feedback { - color: #faad14; -} -.ant-form-item-has-warning.ant-form-item-has-feedback .ant-form-item-children-icon { - color: #faad14; - -webkit-animation-name: diffZoomIn3 !important; - animation-name: diffZoomIn3 !important; -} -.ant-form-item-has-warning .ant-select:not(.ant-select-borderless) .ant-select-selector { - border-color: #faad14 !important; -} -.ant-form-item-has-warning .ant-select:not(.ant-select-borderless).ant-select-open .ant-select-selector, -.ant-form-item-has-warning .ant-select:not(.ant-select-borderless).ant-select-focused .ant-select-selector { - border-color: #ffc53d; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); - box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); -} -.ant-form-item-has-warning .ant-input-number, -.ant-form-item-has-warning .ant-picker { - border-color: #faad14; -} -.ant-form-item-has-warning .ant-input-number-focused, -.ant-form-item-has-warning .ant-picker-focused, -.ant-form-item-has-warning .ant-input-number:focus, -.ant-form-item-has-warning .ant-picker:focus { - border-color: #ffc53d; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); - box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); -} -.ant-form-item-has-warning .ant-input-number:not([disabled]):hover, -.ant-form-item-has-warning .ant-picker:not([disabled]):hover { - border-color: #faad14; -} -.ant-form-item-has-warning .ant-cascader-picker:focus .ant-cascader-input { - border-color: #ffc53d; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); - box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); -} -.ant-form-item-has-error .ant-form-item-explain, -.ant-form-item-has-error .ant-form-item-split { - color: #ff4d4f; -} -.ant-form-item-has-error .ant-input, -.ant-form-item-has-error .ant-input-affix-wrapper, -.ant-form-item-has-error .ant-input:hover, -.ant-form-item-has-error .ant-input-affix-wrapper:hover { - border-color: #ff4d4f; -} -.ant-form-item-has-error .ant-input:focus, -.ant-form-item-has-error .ant-input-affix-wrapper:focus, -.ant-form-item-has-error .ant-input-focused, -.ant-form-item-has-error .ant-input-affix-wrapper-focused { - border-color: #ff7875; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2); - box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2); -} -.ant-form-item-has-error .ant-input:not(.ant-form-item-has-error .ant-input-disabled) { - background-color: #fff; -} -.ant-form-item-has-error .ant-input-affix-wrapper:not(.ant-form-item-has-error .ant-input-affix-wrapper-disabled) { - background-color: #fff; -} -.ant-form-item-has-error .ant-input-affix-wrapper input:focus { - -webkit-box-shadow: none !important; - box-shadow: none !important; -} -.ant-form-item-has-error .ant-calendar-picker-open .ant-calendar-picker-input { - border-color: #ff7875; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2); - box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2); -} -.ant-form-item-has-error .ant-input-prefix { - color: #ff4d4f; -} -.ant-form-item-has-error .ant-input-group-addon { - color: #ff4d4f; - border-color: #ff4d4f; -} -.ant-form-item-has-error .has-feedback { - color: #ff4d4f; -} -.ant-form-item-has-error.ant-form-item-has-feedback .ant-form-item-children-icon { - color: #ff4d4f; - -webkit-animation-name: diffZoomIn2 !important; - animation-name: diffZoomIn2 !important; -} -.ant-form-item-has-error .ant-select:not(.ant-select-borderless) .ant-select-selector { - border-color: #ff4d4f !important; -} -.ant-form-item-has-error .ant-select:not(.ant-select-borderless).ant-select-open .ant-select-selector, -.ant-form-item-has-error .ant-select:not(.ant-select-borderless).ant-select-focused .ant-select-selector { - border-color: #ff7875; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2); - box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2); -} -.ant-form-item-has-error .ant-input-group-addon .ant-select.ant-select-single:not(.ant-select-customize-input) .ant-select-selector { - border: 0; -} -.ant-form-item-has-error .ant-select.ant-select-auto-complete .ant-input:focus { - border-color: #ff4d4f; -} -.ant-form-item-has-error .ant-input-number, -.ant-form-item-has-error .ant-picker { - border-color: #ff4d4f; -} -.ant-form-item-has-error .ant-input-number-focused, -.ant-form-item-has-error .ant-picker-focused, -.ant-form-item-has-error .ant-input-number:focus, -.ant-form-item-has-error .ant-picker:focus { - border-color: #ff7875; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2); - box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2); -} -.ant-form-item-has-error .ant-input-number:not([disabled]):hover, -.ant-form-item-has-error .ant-picker:not([disabled]):hover { - border-color: #ff4d4f; -} -.ant-form-item-has-error .ant-mention-wrapper .ant-mention-editor, -.ant-form-item-has-error .ant-mention-wrapper .ant-mention-editor:not([disabled]):hover { - border-color: #ff4d4f; -} -.ant-form-item-has-error .ant-mention-wrapper.ant-mention-active:not([disabled]) .ant-mention-editor, -.ant-form-item-has-error .ant-mention-wrapper .ant-mention-editor:not([disabled]):focus { - border-color: #ff7875; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2); - box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2); -} -.ant-form-item-has-error .ant-cascader-picker:focus .ant-cascader-input { - border-color: #ff7875; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2); - box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2); -} -.ant-form-item-has-error .ant-transfer-list { - border-color: #ff4d4f; -} -.ant-form-item-has-error .ant-transfer-list-search:not([disabled]) { - border-color: #d9d9d9; -} -.ant-form-item-has-error .ant-transfer-list-search:not([disabled]):hover { - border-color: #40a9ff; - border-right-width: 1px !important; -} -.ant-form-item-has-error .ant-transfer-list-search:not([disabled]):focus { - border-color: #40a9ff; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); - box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); -} -.ant-form-item-has-error-leave .ant-form-item-explain { - color: #ff4d4f; -} -.ant-form-item-is-validating.ant-form-item-has-feedback .ant-form-item-children-icon { - display: inline-block; - color: #1890ff; -} -.ant-form { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; -} -.ant-form legend { - display: block; - width: 100%; - margin-bottom: 20px; - padding: 0; - color: rgba(0, 0, 0, 0.45); - font-size: 16px; - line-height: inherit; - border: 0; - border-bottom: 1px solid #d9d9d9; -} -.ant-form label { - font-size: 14px; -} -.ant-form input[type='search'] { - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.ant-form input[type='radio'], -.ant-form input[type='checkbox'] { - line-height: normal; -} -.ant-form input[type='file'] { - display: block; -} -.ant-form input[type='range'] { - display: block; - width: 100%; -} -.ant-form select[multiple], -.ant-form select[size] { - height: auto; -} -.ant-form input[type='file']:focus, -.ant-form input[type='radio']:focus, -.ant-form input[type='checkbox']:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.ant-form output { - display: block; - padding-top: 15px; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - line-height: 1.5715; -} -.ant-form .ant-form-text { - display: inline-block; - padding-right: 8px; -} -.ant-form-small .ant-form-item-label > label { - height: 24px; -} -.ant-form-small .ant-form-item-control-input { - min-height: 24px; -} -.ant-form-large .ant-form-item-label > label { - height: 40px; -} -.ant-form-large .ant-form-item-control-input { - min-height: 40px; -} -.ant-form-item { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - margin-bottom: 24px; - vertical-align: top; -} -.ant-form-item-with-help { - margin-bottom: 0; -} -.ant-form-item-hidden { - display: none; -} -.ant-form-item-label { - display: inline-block; - -webkit-box-flex: 0; - -ms-flex-positive: 0; - flex-grow: 0; - overflow: hidden; - white-space: nowrap; - text-align: right; - vertical-align: middle; -} -.ant-form-item-label-left { - text-align: left; -} -.ant-form-item-label > label { - position: relative; - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - height: 32px; - color: rgba(0, 0, 0, 0.85); - font-size: 14px; -} -.ant-form-item-label > label > .anticon { - font-size: 14px; - vertical-align: top; -} -.ant-form-item-label > label.ant-form-item-required::before { - display: inline-block; - margin-right: 4px; - color: #ff4d4f; - font-size: 14px; - font-family: SimSun, sans-serif; - line-height: 1; - content: '*'; -} -.ant-form-hide-required-mark .ant-form-item-label > label.ant-form-item-required::before { - display: none; -} -.ant-form-item-label > label::after { - content: ':'; - position: relative; - top: -0.5px; - margin: 0 8px 0 2px; -} -.ant-form-item-label > label.ant-form-item-no-colon::after { - content: ' '; -} -.ant-form-item-control { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; -} -.ant-form-item-control:first-child:not([class^='ant-col-']):not([class*=' ant-col-']) { - width: 100%; -} -.ant-form-item-control-input { - position: relative; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - min-height: 32px; -} -.ant-form-item-control-input-content { - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; - max-width: 100%; -} -.ant-form-item-explain, -.ant-form-item-extra { - clear: both; - min-height: 24px; - padding-top: 0px; - color: rgba(0, 0, 0, 0.45); - font-size: 14px; - line-height: 1.5715; - -webkit-transition: color 0.3s cubic-bezier(0.215, 0.61, 0.355, 1); - transition: color 0.3s cubic-bezier(0.215, 0.61, 0.355, 1); -} -.show-help-enter, -.show-help-appear { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.show-help-leave { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.show-help-enter.show-help-enter-active, -.show-help-appear.show-help-appear-active { - -webkit-animation-name: antShowHelpIn; - animation-name: antShowHelpIn; - -webkit-animation-play-state: running; - animation-play-state: running; -} -.show-help-leave.show-help-leave-active { - -webkit-animation-name: antShowHelpOut; - animation-name: antShowHelpOut; - -webkit-animation-play-state: running; - animation-play-state: running; - pointer-events: none; -} -.show-help-enter, -.show-help-appear { - opacity: 0; - -webkit-animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); - animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); -} -.show-help-leave { - -webkit-animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); - animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); -} -@-webkit-keyframes antShowHelpIn { - 0% { - -webkit-transform: translateY(-5px); - transform: translateY(-5px); - opacity: 0; - } - 100% { - -webkit-transform: translateY(0); - transform: translateY(0); - opacity: 1; - } -} -@keyframes antShowHelpIn { - 0% { - -webkit-transform: translateY(-5px); - transform: translateY(-5px); - opacity: 0; - } - 100% { - -webkit-transform: translateY(0); - transform: translateY(0); - opacity: 1; - } -} -@-webkit-keyframes antShowHelpOut { - to { - -webkit-transform: translateY(-5px); - transform: translateY(-5px); - opacity: 0; - } -} -@keyframes antShowHelpOut { - to { - -webkit-transform: translateY(-5px); - transform: translateY(-5px); - opacity: 0; - } -} -@-webkit-keyframes diffZoomIn1 { - 0% { - -webkit-transform: scale(0); - transform: scale(0); - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - } -} -@keyframes diffZoomIn1 { - 0% { - -webkit-transform: scale(0); - transform: scale(0); - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - } -} -@-webkit-keyframes diffZoomIn2 { - 0% { - -webkit-transform: scale(0); - transform: scale(0); - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - } -} -@keyframes diffZoomIn2 { - 0% { - -webkit-transform: scale(0); - transform: scale(0); - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - } -} -@-webkit-keyframes diffZoomIn3 { - 0% { - -webkit-transform: scale(0); - transform: scale(0); - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - } -} -@keyframes diffZoomIn3 { - 0% { - -webkit-transform: scale(0); - transform: scale(0); - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - } -} -.ant-form-rtl { - direction: rtl; -} -.ant-form-rtl .ant-form-item-label { - text-align: left; -} -.ant-form-rtl .ant-form-item-label > label.ant-form-item-required::before { - margin-right: 0; - margin-left: 4px; -} -.ant-form-rtl .ant-form-item-label > label::after { - margin: 0 2px 0 8px; -} -.ant-col-rtl .ant-form-item-control:first-child { - width: 100%; -} -.ant-form-rtl .ant-form-item-has-feedback .ant-input { - padding-right: 11px; - padding-left: 24px; -} -.ant-form-rtl .ant-form-item-has-feedback .ant-input-affix-wrapper .ant-input-suffix { - padding-right: 11px; - padding-left: 18px; -} -.ant-form-rtl .ant-form-item-has-feedback .ant-input-affix-wrapper .ant-input { - padding: 0; -} -.ant-form-rtl .ant-form-item-has-feedback .ant-input-search:not(.ant-input-search-enter-button) .ant-input-suffix { - right: auto; - left: 28px; -} -.ant-form-rtl .ant-form-item-has-feedback .ant-input-number { - padding-left: 18px; -} -.ant-form-rtl .ant-form-item-has-feedback > .ant-select .ant-select-arrow, -.ant-form-rtl .ant-form-item-has-feedback > .ant-select .ant-select-selection__clear, -.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon) > .ant-select .ant-select-arrow, -.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon) > .ant-select .ant-select-selection__clear { - right: auto; - left: 28px; -} -.ant-form-rtl .ant-form-item-has-feedback > .ant-select .ant-select-selection-selected-value, -.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon) > .ant-select .ant-select-selection-selected-value { - padding-right: 0; - padding-left: 42px; -} -.ant-form-rtl .ant-form-item-has-feedback .ant-cascader-picker-arrow { - margin-right: 0; - margin-left: 17px; -} -.ant-form-rtl .ant-form-item-has-feedback .ant-cascader-picker-clear { - right: auto; - left: 28px; -} -.ant-form-rtl .ant-form-item-has-feedback .ant-picker { - padding-right: 11px; - padding-left: 29.2px; -} -.ant-form-rtl .ant-form-item-has-feedback .ant-picker-large { - padding-right: 11px; - padding-left: 29.2px; -} -.ant-form-rtl .ant-form-item-has-feedback .ant-picker-small { - padding-right: 7px; - padding-left: 25.2px; -} -.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-success .ant-form-item-children-icon, -.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-warning .ant-form-item-children-icon, -.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-error .ant-form-item-children-icon, -.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-is-validating .ant-form-item-children-icon { - right: auto; - left: 0; -} -.ant-form-rtl.ant-form-inline .ant-form-item { - margin-right: 0; - margin-left: 16px; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-input-number { - -webkit-box-sizing: border-box; - box-sizing: border-box; - font-variant: tabular-nums; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - width: 100%; - min-width: 0; - padding: 4px 11px; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - line-height: 1.5715; - background-color: #fff; - background-image: none; - -webkit-transition: all 0.3s; - transition: all 0.3s; - display: inline-block; - width: 90px; - margin: 0; - padding: 0; - border: 1px solid #d9d9d9; - border-radius: 2px; -} -.ant-input-number::-moz-placeholder { - opacity: 1; -} -.ant-input-number::-webkit-input-placeholder { - color: #bfbfbf; -} -.ant-input-number:-ms-input-placeholder { - color: #bfbfbf; -} -.ant-input-number::-ms-input-placeholder { - color: #bfbfbf; -} -.ant-input-number::placeholder { - color: #bfbfbf; -} -.ant-input-number:-moz-placeholder-shown { - text-overflow: ellipsis; -} -.ant-input-number:-ms-input-placeholder { - text-overflow: ellipsis; -} -.ant-input-number:placeholder-shown { - text-overflow: ellipsis; -} -.ant-input-number:hover { - border-color: #40a9ff; - border-right-width: 1px !important; -} -.ant-input-number:focus, -.ant-input-number-focused { - border-color: #40a9ff; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); - box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); -} -.ant-input-number-disabled { - color: rgba(0, 0, 0, 0.25); - background-color: #f5f5f5; - cursor: not-allowed; - opacity: 1; -} -.ant-input-number-disabled:hover { - border-color: #d9d9d9; - border-right-width: 1px !important; -} -.ant-input-number[disabled] { - color: rgba(0, 0, 0, 0.25); - background-color: #f5f5f5; - cursor: not-allowed; - opacity: 1; -} -.ant-input-number[disabled]:hover { - border-color: #d9d9d9; - border-right-width: 1px !important; -} -textarea.ant-input-number { - max-width: 100%; - height: auto; - min-height: 32px; - line-height: 1.5715; - vertical-align: bottom; - -webkit-transition: all 0.3s, height 0s; - transition: all 0.3s, height 0s; -} -.ant-input-number-lg { - padding: 6.5px 11px; - font-size: 16px; -} -.ant-input-number-sm { - padding: 0px 7px; -} -.ant-input-number-handler { - position: relative; - display: block; - width: 100%; - height: 50%; - overflow: hidden; - color: rgba(0, 0, 0, 0.45); - font-weight: bold; - line-height: 0; - text-align: center; - -webkit-transition: all 0.1s linear; - transition: all 0.1s linear; -} -.ant-input-number-handler:active { - background: #f4f4f4; -} -.ant-input-number-handler:hover .ant-input-number-handler-up-inner, -.ant-input-number-handler:hover .ant-input-number-handler-down-inner { - color: #40a9ff; -} -.ant-input-number-handler-up-inner, -.ant-input-number-handler-down-inner { - display: inline-block; - color: inherit; - font-style: normal; - line-height: 0; - text-align: center; - text-transform: none; - vertical-align: -0.125em; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - position: absolute; - right: 4px; - width: 12px; - height: 12px; - color: rgba(0, 0, 0, 0.45); - line-height: 12px; - -webkit-transition: all 0.1s linear; - transition: all 0.1s linear; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.ant-input-number-handler-up-inner > *, -.ant-input-number-handler-down-inner > * { - line-height: 1; -} -.ant-input-number-handler-up-inner svg, -.ant-input-number-handler-down-inner svg { - display: inline-block; -} -.ant-input-number-handler-up-inner::before, -.ant-input-number-handler-down-inner::before { - display: none; -} -.ant-input-number-handler-up-inner .ant-input-number-handler-up-inner-icon, -.ant-input-number-handler-up-inner .ant-input-number-handler-down-inner-icon, -.ant-input-number-handler-down-inner .ant-input-number-handler-up-inner-icon, -.ant-input-number-handler-down-inner .ant-input-number-handler-down-inner-icon { - display: block; -} -.ant-input-number:hover { - border-color: #40a9ff; - border-right-width: 1px !important; -} -.ant-input-number:hover + .ant-form-item-children-icon { - opacity: 0; - -webkit-transition: opacity 0.24s linear 0.24s; - transition: opacity 0.24s linear 0.24s; -} -.ant-input-number-focused { - border-color: #40a9ff; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); - box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); -} -.ant-input-number-disabled { - color: rgba(0, 0, 0, 0.25); - background-color: #f5f5f5; - cursor: not-allowed; - opacity: 1; -} -.ant-input-number-disabled:hover { - border-color: #d9d9d9; - border-right-width: 1px !important; -} -.ant-input-number-disabled .ant-input-number-input { - cursor: not-allowed; -} -.ant-input-number-disabled .ant-input-number-handler-wrap { - display: none; -} -.ant-input-number-input { - width: 100%; - height: 30px; - padding: 0 11px; - text-align: left; - background-color: transparent; - border: 0; - border-radius: 2px; - outline: 0; - -webkit-transition: all 0.3s linear; - transition: all 0.3s linear; - -moz-appearance: textfield !important; -} -.ant-input-number-input::-moz-placeholder { - opacity: 1; -} -.ant-input-number-input::-webkit-input-placeholder { - color: #bfbfbf; -} -.ant-input-number-input:-ms-input-placeholder { - color: #bfbfbf; -} -.ant-input-number-input::-ms-input-placeholder { - color: #bfbfbf; -} -.ant-input-number-input::placeholder { - color: #bfbfbf; -} -.ant-input-number-input:-moz-placeholder-shown { - text-overflow: ellipsis; -} -.ant-input-number-input:-ms-input-placeholder { - text-overflow: ellipsis; -} -.ant-input-number-input:placeholder-shown { - text-overflow: ellipsis; -} -.ant-input-number-input[type='number']::-webkit-inner-spin-button, -.ant-input-number-input[type='number']::-webkit-outer-spin-button { - margin: 0; - -webkit-appearance: none; -} -.ant-input-number-lg { - padding: 0; - font-size: 16px; -} -.ant-input-number-lg input { - height: 38px; -} -.ant-input-number-sm { - padding: 0; -} -.ant-input-number-sm input { - height: 22px; - padding: 0 7px; -} -.ant-input-number-handler-wrap { - position: absolute; - top: 0; - right: 0; - width: 22px; - height: 100%; - background: #fff; - border-left: 1px solid #d9d9d9; - border-radius: 0 2px 2px 0; - opacity: 0; - -webkit-transition: opacity 0.24s linear 0.1s; - transition: opacity 0.24s linear 0.1s; -} -.ant-input-number-handler-wrap .ant-input-number-handler .ant-input-number-handler-up-inner, -.ant-input-number-handler-wrap .ant-input-number-handler .ant-input-number-handler-down-inner { - display: inline-block; - font-size: 7px; - min-width: auto; - margin-right: 0; -} -.ant-input-number-handler-wrap:hover .ant-input-number-handler { - height: 40%; -} -.ant-input-number:hover .ant-input-number-handler-wrap { - opacity: 1; -} -.ant-input-number-handler-up { - border-top-right-radius: 2px; - cursor: pointer; -} -.ant-input-number-handler-up-inner { - top: 50%; - margin-top: -5px; - text-align: center; -} -.ant-input-number-handler-up:hover { - height: 60% !important; -} -.ant-input-number-handler-down { - top: 0; - border-top: 1px solid #d9d9d9; - border-bottom-right-radius: 2px; - cursor: pointer; -} -.ant-input-number-handler-down-inner { - top: 50%; - text-align: center; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); -} -.ant-input-number-handler-down:hover { - height: 60% !important; -} -.ant-input-number-handler-up-disabled, -.ant-input-number-handler-down-disabled { - cursor: not-allowed; -} -.ant-input-number-handler-up-disabled:hover .ant-input-number-handler-up-inner, -.ant-input-number-handler-down-disabled:hover .ant-input-number-handler-down-inner { - color: rgba(0, 0, 0, 0.25); -} -.ant-input-number-rtl { - direction: rtl; -} -.ant-input-number-rtl .ant-input-number-handler-wrap { - right: auto; - left: 0; - border-right: 1px solid #d9d9d9; - border-left: 0; - border-radius: 2px 0 0 2px; -} -.ant-input-number-rtl .ant-input-number-input { - direction: ltr; - text-align: right; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-layout { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - /* fix firefox can't set height smaller than content on flex item */ - min-height: 0; - background: #f0f2f5; -} -.ant-layout, -.ant-layout * { - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.ant-layout.ant-layout-has-sider { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row; -} -.ant-layout.ant-layout-has-sider > .ant-layout, -.ant-layout.ant-layout-has-sider > .ant-layout-content { - overflow-x: hidden; -} -.ant-layout-header, -.ant-layout-footer { - -webkit-box-flex: 0; - -ms-flex: 0 0 auto; - flex: 0 0 auto; -} -.ant-layout-header { - height: 64px; - padding: 0 50px; - color: rgba(0, 0, 0, 0.65); - line-height: 64px; - background: #001529; -} -.ant-layout-footer { - padding: 24px 50px; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - background: #f0f2f5; -} -.ant-layout-content { - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; - /* fix firefox can't set height smaller than content on flex item */ - min-height: 0; -} -.ant-layout-sider { - position: relative; - /* fix firefox can't set width smaller than content on flex item */ - min-width: 0; - background: #001529; - -webkit-transition: all 0.2s; - transition: all 0.2s; -} -.ant-layout-sider-children { - height: 100%; - margin-top: -0.1px; - padding-top: 0.1px; -} -.ant-layout-sider-has-trigger { - padding-bottom: 48px; -} -.ant-layout-sider-right { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1; -} -.ant-layout-sider-trigger { - position: fixed; - bottom: 0; - z-index: 1; - height: 48px; - color: #fff; - line-height: 48px; - text-align: center; - background: #002140; - cursor: pointer; - -webkit-transition: all 0.2s; - transition: all 0.2s; -} -.ant-layout-sider-zero-width > * { - overflow: hidden; -} -.ant-layout-sider-zero-width-trigger { - position: absolute; - top: 64px; - right: -36px; - z-index: 1; - width: 36px; - height: 42px; - color: #fff; - font-size: 18px; - line-height: 42px; - text-align: center; - background: #001529; - border-radius: 0 2px 2px 0; - cursor: pointer; - -webkit-transition: background 0.3s ease; - transition: background 0.3s ease; -} -.ant-layout-sider-zero-width-trigger:hover { - background: #192c3e; -} -.ant-layout-sider-zero-width-trigger-right { - left: -36px; - border-radius: 2px 0 0 2px; -} -.ant-layout-sider-light { - background: #fff; -} -.ant-layout-sider-light .ant-layout-sider-trigger { - color: rgba(0, 0, 0, 0.65); - background: #fff; -} -.ant-layout-sider-light .ant-layout-sider-zero-width-trigger { - color: rgba(0, 0, 0, 0.65); - background: #fff; -} -.ant-layout-rtl { - direction: rtl; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-list { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; -} -.ant-list * { - outline: none; -} -.ant-list-pagination { - margin-top: 24px; - text-align: right; -} -.ant-list-pagination .ant-pagination-options { - text-align: left; -} -.ant-list-more { - margin-top: 12px; - text-align: center; -} -.ant-list-more button { - padding-right: 32px; - padding-left: 32px; -} -.ant-list-spin { - min-height: 40px; - text-align: center; -} -.ant-list-empty-text { - padding: 16px; - color: rgba(0, 0, 0, 0.25); - font-size: 14px; - text-align: center; -} -.ant-list-items { - margin: 0; - padding: 0; - list-style: none; -} -.ant-list-item { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; - padding: 12px 0; - color: rgba(0, 0, 0, 0.65); -} -.ant-list-item-meta { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 1; - -ms-flex: 1; - flex: 1; - -webkit-box-align: start; - -ms-flex-align: start; - align-items: flex-start; - max-width: 100%; -} -.ant-list-item-meta-avatar { - margin-right: 16px; -} -.ant-list-item-meta-content { - -webkit-box-flex: 1; - -ms-flex: 1 0; - flex: 1 0; - width: 0; - color: rgba(0, 0, 0, 0.65); -} -.ant-list-item-meta-title { - margin-bottom: 4px; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - line-height: 1.5715; -} -.ant-list-item-meta-title > a { - color: rgba(0, 0, 0, 0.65); - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-list-item-meta-title > a:hover { - color: #1890ff; -} -.ant-list-item-meta-description { - color: rgba(0, 0, 0, 0.45); - font-size: 14px; - line-height: 1.5715; -} -.ant-list-item-action { - -webkit-box-flex: 0; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - margin-left: 48px; - padding: 0; - font-size: 0; - list-style: none; -} -.ant-list-item-action > li { - position: relative; - display: inline-block; - padding: 0 8px; - color: rgba(0, 0, 0, 0.45); - font-size: 14px; - line-height: 1.5715; - text-align: center; - cursor: pointer; -} -.ant-list-item-action > li:first-child { - padding-left: 0; -} -.ant-list-item-action-split { - position: absolute; - top: 50%; - right: 0; - width: 1px; - height: 14px; - margin-top: -7px; - background-color: #f0f0f0; -} -.ant-list-header { - background: transparent; -} -.ant-list-footer { - background: transparent; -} -.ant-list-header, -.ant-list-footer { - padding-top: 12px; - padding-bottom: 12px; -} -.ant-list-empty { - padding: 16px 0; - color: rgba(0, 0, 0, 0.45); - font-size: 12px; - text-align: center; -} -.ant-list-split .ant-list-item { - border-bottom: 1px solid #f0f0f0; -} -.ant-list-split .ant-list-item:last-child { - border-bottom: none; -} -.ant-list-split .ant-list-header { - border-bottom: 1px solid #f0f0f0; -} -.ant-list-split.ant-list-empty .ant-list-footer { - border-top: 1px solid #f0f0f0; -} -.ant-list-loading .ant-list-spin-nested-loading { - min-height: 32px; -} -.ant-list-split.ant-list-something-after-last-item .ant-spin-container > .ant-list-items > .ant-list-item:last-child { - border-bottom: 1px solid #f0f0f0; -} -.ant-list-lg .ant-list-item { - padding: 16px 24px; -} -.ant-list-sm .ant-list-item { - padding: 8px 16px; -} -.ant-list-vertical .ant-list-item { - -webkit-box-align: initial; - -ms-flex-align: initial; - align-items: initial; -} -.ant-list-vertical .ant-list-item-main { - display: block; - -webkit-box-flex: 1; - -ms-flex: 1; - flex: 1; -} -.ant-list-vertical .ant-list-item-extra { - margin-left: 40px; -} -.ant-list-vertical .ant-list-item-meta { - margin-bottom: 16px; -} -.ant-list-vertical .ant-list-item-meta-title { - margin-bottom: 12px; - color: rgba(0, 0, 0, 0.85); - font-size: 16px; - line-height: 24px; -} -.ant-list-vertical .ant-list-item-action { - margin-top: 16px; - margin-left: auto; -} -.ant-list-vertical .ant-list-item-action > li { - padding: 0 16px; -} -.ant-list-vertical .ant-list-item-action > li:first-child { - padding-left: 0; -} -.ant-list-grid .ant-col > .ant-list-item { - display: block; - max-width: 100%; - margin-bottom: 16px; - padding-top: 0; - padding-bottom: 0; - border-bottom: none; -} -.ant-list-item-no-flex { - display: block; -} -.ant-list:not(.ant-list-vertical) .ant-list-item-no-flex .ant-list-item-action { - float: right; -} -.ant-list-bordered { - border: 1px solid #d9d9d9; - border-radius: 2px; -} -.ant-list-bordered .ant-list-header { - padding-right: 24px; - padding-left: 24px; -} -.ant-list-bordered .ant-list-footer { - padding-right: 24px; - padding-left: 24px; -} -.ant-list-bordered .ant-list-item { - padding-right: 24px; - padding-left: 24px; -} -.ant-list-bordered .ant-list-pagination { - margin: 16px 24px; -} -.ant-list-bordered.ant-list-sm .ant-list-item { - padding: 8px 16px; -} -.ant-list-bordered.ant-list-sm .ant-list-header, -.ant-list-bordered.ant-list-sm .ant-list-footer { - padding: 8px 16px; -} -.ant-list-bordered.ant-list-lg .ant-list-item { - padding: 16px 24px; -} -.ant-list-bordered.ant-list-lg .ant-list-header, -.ant-list-bordered.ant-list-lg .ant-list-footer { - padding: 16px 24px; -} -@media screen and (max-width: 768px) { - .ant-list-item-action { - margin-left: 24px; - } - .ant-list-vertical .ant-list-item-extra { - margin-left: 24px; - } -} -@media screen and (max-width: 576px) { - .ant-list-item { - -ms-flex-wrap: wrap; - flex-wrap: wrap; - } - .ant-list-item-action { - margin-left: 12px; - } - .ant-list-vertical .ant-list-item { - -ms-flex-wrap: wrap-reverse; - flex-wrap: wrap-reverse; - } - .ant-list-vertical .ant-list-item-main { - min-width: 220px; - } - .ant-list-vertical .ant-list-item-extra { - margin: auto auto 16px; - } -} -.ant-list-rtl { - direction: rtl; - text-align: right; -} -.ant-list-rtl .ReactVirtualized__List .ant-list-item { - direction: rtl; -} -.ant-list-rtl .ant-list-pagination { - text-align: left; -} -.ant-list-rtl .ant-list-item-meta-avatar { - margin-right: 0; - margin-left: 16px; -} -.ant-list-rtl .ant-list-item-action { - margin-right: 48px; - margin-left: 0; -} -.ant-list-rtl .ant-list-item-action > li:first-child { - padding-right: 0; - padding-left: 8px; -} -.ant-list-rtl .ant-list-item-action-split { - right: auto; - left: 0; -} -.ant-list-rtl.ant-list-vertical .ant-list-item-extra { - margin-right: 40px; - margin-left: 0; -} -.ant-list-rtl.ant-list-vertical .ant-list-item-action { - margin-right: auto; -} -.ant-list-rtl .ant-list-vertical .ant-list-item-action > li:first-child { - padding-right: 0; - padding-left: 16px; -} -.ant-list-rtl .ant-list:not(.ant-list-vertical) .ant-list-item-no-flex .ant-list-item-action { - float: left; -} -@media screen and (max-width: 768px) { - .ant-list-rtl .ant-list-item-action { - margin-right: 24px; - margin-left: 0; - } - .ant-list-rtl .ant-list-vertical .ant-list-item-extra { - margin-right: 24px; - margin-left: 0; - } -} -@media screen and (max-width: 576px) { - .ant-list-rtl .ant-list-item-action { - margin-right: 22px; - margin-left: 0; - } - .ant-list-rtl.ant-list-vertical .ant-list-item-extra { - margin: auto auto 16px; - } -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-spin { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: absolute; - display: none; - color: #1890ff; - text-align: center; - vertical-align: middle; - opacity: 0; - -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); - transition: -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); - transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); - transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86), -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); -} -.ant-spin-spinning { - position: static; - display: inline-block; - opacity: 1; -} -.ant-spin-nested-loading { - position: relative; -} -.ant-spin-nested-loading > div > .ant-spin { - position: absolute; - top: 0; - left: 0; - z-index: 4; - display: block; - width: 100%; - height: 100%; - max-height: 400px; -} -.ant-spin-nested-loading > div > .ant-spin .ant-spin-dot { - position: absolute; - top: 50%; - left: 50%; - margin: -10px; -} -.ant-spin-nested-loading > div > .ant-spin .ant-spin-text { - position: absolute; - top: 50%; - width: 100%; - padding-top: 5px; - text-shadow: 0 1px 2px #fff; -} -.ant-spin-nested-loading > div > .ant-spin.ant-spin-show-text .ant-spin-dot { - margin-top: -20px; -} -.ant-spin-nested-loading > div > .ant-spin-sm .ant-spin-dot { - margin: -7px; -} -.ant-spin-nested-loading > div > .ant-spin-sm .ant-spin-text { - padding-top: 2px; -} -.ant-spin-nested-loading > div > .ant-spin-sm.ant-spin-show-text .ant-spin-dot { - margin-top: -17px; -} -.ant-spin-nested-loading > div > .ant-spin-lg .ant-spin-dot { - margin: -16px; -} -.ant-spin-nested-loading > div > .ant-spin-lg .ant-spin-text { - padding-top: 11px; -} -.ant-spin-nested-loading > div > .ant-spin-lg.ant-spin-show-text .ant-spin-dot { - margin-top: -26px; -} -.ant-spin-container { - position: relative; - -webkit-transition: opacity 0.3s; - transition: opacity 0.3s; -} -.ant-spin-container::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 10; - display: none \9; - width: 100%; - height: 100%; - background: #fff; - opacity: 0; - -webkit-transition: all 0.3s; - transition: all 0.3s; - content: ''; - pointer-events: none; -} -.ant-spin-blur { - clear: both; - overflow: hidden; - opacity: 0.5; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - pointer-events: none; -} -.ant-spin-blur::after { - opacity: 0.4; - pointer-events: auto; -} -.ant-spin-tip { - color: rgba(0, 0, 0, 0.45); -} -.ant-spin-dot { - position: relative; - display: inline-block; - font-size: 20px; - width: 1em; - height: 1em; -} -.ant-spin-dot-item { - position: absolute; - display: block; - width: 9px; - height: 9px; - background-color: #1890ff; - border-radius: 100%; - -webkit-transform: scale(0.75); - transform: scale(0.75); - -webkit-transform-origin: 50% 50%; - transform-origin: 50% 50%; - opacity: 0.3; - -webkit-animation: antSpinMove 1s infinite linear alternate; - animation: antSpinMove 1s infinite linear alternate; -} -.ant-spin-dot-item:nth-child(1) { - top: 0; - left: 0; -} -.ant-spin-dot-item:nth-child(2) { - top: 0; - right: 0; - -webkit-animation-delay: 0.4s; - animation-delay: 0.4s; -} -.ant-spin-dot-item:nth-child(3) { - right: 0; - bottom: 0; - -webkit-animation-delay: 0.8s; - animation-delay: 0.8s; -} -.ant-spin-dot-item:nth-child(4) { - bottom: 0; - left: 0; - -webkit-animation-delay: 1.2s; - animation-delay: 1.2s; -} -.ant-spin-dot-spin { - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - -webkit-animation: antRotate 1.2s infinite linear; - animation: antRotate 1.2s infinite linear; -} -.ant-spin-sm .ant-spin-dot { - font-size: 14px; -} -.ant-spin-sm .ant-spin-dot i { - width: 6px; - height: 6px; -} -.ant-spin-lg .ant-spin-dot { - font-size: 32px; -} -.ant-spin-lg .ant-spin-dot i { - width: 14px; - height: 14px; -} -.ant-spin.ant-spin-show-text .ant-spin-text { - display: block; -} -@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) { - /* IE10+ */ - .ant-spin-blur { - background: #fff; - opacity: 0.5; - } -} -@-webkit-keyframes antSpinMove { - to { - opacity: 1; - } -} -@keyframes antSpinMove { - to { - opacity: 1; - } -} -@-webkit-keyframes antRotate { - to { - -webkit-transform: rotate(405deg); - transform: rotate(405deg); - } -} -@keyframes antRotate { - to { - -webkit-transform: rotate(405deg); - transform: rotate(405deg); - } -} -.ant-spin-rtl { - direction: rtl; -} -.ant-spin-rtl .ant-spin-dot-spin { - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - -webkit-animation-name: antRotateRtl; - animation-name: antRotateRtl; -} -@-webkit-keyframes antRotateRtl { - to { - -webkit-transform: rotate(-405deg); - transform: rotate(-405deg); - } -} -@keyframes antRotateRtl { - to { - -webkit-transform: rotate(-405deg); - transform: rotate(-405deg); - } -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-pagination { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; -} -.ant-pagination ul, -.ant-pagination ol { - margin: 0; - padding: 0; - list-style: none; -} -.ant-pagination::after { - display: block; - clear: both; - height: 0; - overflow: hidden; - visibility: hidden; - content: ' '; -} -.ant-pagination-total-text { - display: inline-block; - height: 32px; - margin-right: 8px; - line-height: 30px; - vertical-align: middle; -} -.ant-pagination-item { - display: inline-block; - min-width: 32px; - height: 32px; - margin-right: 8px; - font-family: Arial; - line-height: 30px; - text-align: center; - vertical-align: middle; - list-style: none; - background-color: #fff; - border: 1px solid #d9d9d9; - border-radius: 2px; - outline: 0; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.ant-pagination-item a { - display: block; - padding: 0 6px; - color: rgba(0, 0, 0, 0.65); - -webkit-transition: none; - transition: none; -} -.ant-pagination-item a:hover { - text-decoration: none; -} -.ant-pagination-item:focus, -.ant-pagination-item:hover { - border-color: #1890ff; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-pagination-item:focus a, -.ant-pagination-item:hover a { - color: #1890ff; -} -.ant-pagination-item-active { - font-weight: 500; - background: #fff; - border-color: #1890ff; -} -.ant-pagination-item-active a { - color: #1890ff; -} -.ant-pagination-item-active:focus, -.ant-pagination-item-active:hover { - border-color: #40a9ff; -} -.ant-pagination-item-active:focus a, -.ant-pagination-item-active:hover a { - color: #40a9ff; -} -.ant-pagination-jump-prev, -.ant-pagination-jump-next { - outline: 0; -} -.ant-pagination-jump-prev .ant-pagination-item-container, -.ant-pagination-jump-next .ant-pagination-item-container { - position: relative; -} -.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon, -.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon { - color: #1890ff; - font-size: 12px; - letter-spacing: -1px; - opacity: 0; - -webkit-transition: all 0.2s; - transition: all 0.2s; -} -.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon-svg, -.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon-svg { - top: 0; - right: 0; - bottom: 0; - left: 0; - margin: auto; -} -.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-ellipsis, -.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-ellipsis { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - display: block; - margin: auto; - color: rgba(0, 0, 0, 0.25); - letter-spacing: 2px; - text-align: center; - text-indent: 0.13em; - opacity: 1; - -webkit-transition: all 0.2s; - transition: all 0.2s; -} -.ant-pagination-jump-prev:focus .ant-pagination-item-link-icon, -.ant-pagination-jump-next:focus .ant-pagination-item-link-icon, -.ant-pagination-jump-prev:hover .ant-pagination-item-link-icon, -.ant-pagination-jump-next:hover .ant-pagination-item-link-icon { - opacity: 1; -} -.ant-pagination-jump-prev:focus .ant-pagination-item-ellipsis, -.ant-pagination-jump-next:focus .ant-pagination-item-ellipsis, -.ant-pagination-jump-prev:hover .ant-pagination-item-ellipsis, -.ant-pagination-jump-next:hover .ant-pagination-item-ellipsis { - opacity: 0; -} -.ant-pagination-prev, -.ant-pagination-jump-prev, -.ant-pagination-jump-next { - margin-right: 8px; -} -.ant-pagination-prev, -.ant-pagination-next, -.ant-pagination-jump-prev, -.ant-pagination-jump-next { - display: inline-block; - min-width: 32px; - height: 32px; - color: rgba(0, 0, 0, 0.65); - font-family: Arial; - line-height: 32px; - text-align: center; - vertical-align: middle; - list-style: none; - border-radius: 2px; - cursor: pointer; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-pagination-prev, -.ant-pagination-next { - outline: 0; -} -.ant-pagination-prev button, -.ant-pagination-next button { - color: rgba(0, 0, 0, 0.65); - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.ant-pagination-prev:hover button, -.ant-pagination-next:hover button { - border-color: #40a9ff; -} -.ant-pagination-prev .ant-pagination-item-link, -.ant-pagination-next .ant-pagination-item-link { - display: block; - width: 100%; - height: 100%; - font-size: 12px; - text-align: center; - background-color: #fff; - border: 1px solid #d9d9d9; - border-radius: 2px; - outline: none; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-pagination-prev:focus .ant-pagination-item-link, -.ant-pagination-next:focus .ant-pagination-item-link, -.ant-pagination-prev:hover .ant-pagination-item-link, -.ant-pagination-next:hover .ant-pagination-item-link { - color: #1890ff; - border-color: #1890ff; -} -.ant-pagination-disabled, -.ant-pagination-disabled:hover, -.ant-pagination-disabled:focus { - cursor: not-allowed; -} -.ant-pagination-disabled .ant-pagination-item-link, -.ant-pagination-disabled:hover .ant-pagination-item-link, -.ant-pagination-disabled:focus .ant-pagination-item-link { - color: rgba(0, 0, 0, 0.25); - border-color: #d9d9d9; - cursor: not-allowed; -} -.ant-pagination-slash { - margin: 0 10px 0 5px; -} -.ant-pagination-options { - display: inline-block; - margin-left: 16px; - vertical-align: middle; -} -@media all and (-ms-high-contrast: none) { - .ant-pagination-options *::-ms-backdrop, - .ant-pagination-options { - vertical-align: top; - } -} -.ant-pagination-options-size-changer.ant-select { - display: inline-block; - width: auto; - margin-right: 8px; -} -.ant-pagination-options-quick-jumper { - display: inline-block; - height: 32px; - line-height: 32px; - vertical-align: top; -} -.ant-pagination-options-quick-jumper input { - position: relative; - display: inline-block; - width: 100%; - min-width: 0; - padding: 4px 11px; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - line-height: 1.5715; - background-color: #fff; - background-image: none; - border: 1px solid #d9d9d9; - border-radius: 2px; - -webkit-transition: all 0.3s; - transition: all 0.3s; - width: 50px; - margin: 0 8px; -} -.ant-pagination-options-quick-jumper input::-moz-placeholder { - opacity: 1; -} -.ant-pagination-options-quick-jumper input::-webkit-input-placeholder { - color: #bfbfbf; -} -.ant-pagination-options-quick-jumper input:-ms-input-placeholder { - color: #bfbfbf; -} -.ant-pagination-options-quick-jumper input::-ms-input-placeholder { - color: #bfbfbf; -} -.ant-pagination-options-quick-jumper input::placeholder { - color: #bfbfbf; -} -.ant-pagination-options-quick-jumper input:-moz-placeholder-shown { - text-overflow: ellipsis; -} -.ant-pagination-options-quick-jumper input:-ms-input-placeholder { - text-overflow: ellipsis; -} -.ant-pagination-options-quick-jumper input:placeholder-shown { - text-overflow: ellipsis; -} -.ant-pagination-options-quick-jumper input:hover { - border-color: #40a9ff; - border-right-width: 1px !important; -} -.ant-pagination-options-quick-jumper input:focus, -.ant-pagination-options-quick-jumper input-focused { - border-color: #40a9ff; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); - box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); -} -.ant-pagination-options-quick-jumper input-disabled { - color: rgba(0, 0, 0, 0.25); - background-color: #f5f5f5; - cursor: not-allowed; - opacity: 1; -} -.ant-pagination-options-quick-jumper input-disabled:hover { - border-color: #d9d9d9; - border-right-width: 1px !important; -} -.ant-pagination-options-quick-jumper input[disabled] { - color: rgba(0, 0, 0, 0.25); - background-color: #f5f5f5; - cursor: not-allowed; - opacity: 1; -} -.ant-pagination-options-quick-jumper input[disabled]:hover { - border-color: #d9d9d9; - border-right-width: 1px !important; -} -textarea.ant-pagination-options-quick-jumper input { - max-width: 100%; - height: auto; - min-height: 32px; - line-height: 1.5715; - vertical-align: bottom; - -webkit-transition: all 0.3s, height 0s; - transition: all 0.3s, height 0s; -} -.ant-pagination-options-quick-jumper input-lg { - padding: 6.5px 11px; - font-size: 16px; -} -.ant-pagination-options-quick-jumper input-sm { - padding: 0px 7px; -} -.ant-pagination-simple .ant-pagination-prev, -.ant-pagination-simple .ant-pagination-next { - height: 24px; - line-height: 24px; - vertical-align: top; -} -.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link, -.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link { - height: 24px; - background-color: transparent; - border: 0; -} -.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link::after, -.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link::after { - height: 24px; - line-height: 24px; -} -.ant-pagination-simple .ant-pagination-simple-pager { - display: inline-block; - height: 24px; - margin-right: 8px; -} -.ant-pagination-simple .ant-pagination-simple-pager input { - -webkit-box-sizing: border-box; - box-sizing: border-box; - height: 100%; - margin-right: 8px; - padding: 0 6px; - text-align: center; - background-color: #fff; - border: 1px solid #d9d9d9; - border-radius: 2px; - outline: none; - -webkit-transition: border-color 0.3s; - transition: border-color 0.3s; -} -.ant-pagination-simple .ant-pagination-simple-pager input:hover { - border-color: #1890ff; -} -.ant-pagination.mini .ant-pagination-total-text, -.ant-pagination.mini .ant-pagination-simple-pager { - height: 24px; - line-height: 24px; -} -.ant-pagination.mini .ant-pagination-item { - min-width: 24px; - height: 24px; - margin: 0; - line-height: 22px; -} -.ant-pagination.mini .ant-pagination-item:not(.ant-pagination-item-active) { - background: transparent; - border-color: transparent; -} -.ant-pagination.mini .ant-pagination-prev, -.ant-pagination.mini .ant-pagination-next { - min-width: 24px; - height: 24px; - margin: 0; - line-height: 24px; -} -.ant-pagination.mini .ant-pagination-prev .ant-pagination-item-link, -.ant-pagination.mini .ant-pagination-next .ant-pagination-item-link { - background: transparent; - border-color: transparent; -} -.ant-pagination.mini .ant-pagination-prev .ant-pagination-item-link::after, -.ant-pagination.mini .ant-pagination-next .ant-pagination-item-link::after { - height: 24px; - line-height: 24px; -} -.ant-pagination.mini .ant-pagination-jump-prev, -.ant-pagination.mini .ant-pagination-jump-next { - height: 24px; - margin-right: 0; - line-height: 24px; -} -.ant-pagination.mini .ant-pagination-options { - margin-left: 2px; -} -.ant-pagination.mini .ant-pagination-options-size-changer { - top: 0px; -} -.ant-pagination.mini .ant-pagination-options-quick-jumper { - height: 24px; - line-height: 24px; -} -.ant-pagination.mini .ant-pagination-options-quick-jumper input { - padding: 0px 7px; - width: 44px; -} -.ant-pagination.ant-pagination-disabled { - cursor: not-allowed; -} -.ant-pagination.ant-pagination-disabled .ant-pagination-item { - background: #f5f5f5; - border-color: #d9d9d9; - cursor: not-allowed; -} -.ant-pagination.ant-pagination-disabled .ant-pagination-item a { - color: rgba(0, 0, 0, 0.25); - background: transparent; - border: none; - cursor: not-allowed; -} -.ant-pagination.ant-pagination-disabled .ant-pagination-item-active { - background: #dbdbdb; - border-color: transparent; -} -.ant-pagination.ant-pagination-disabled .ant-pagination-item-active a { - color: #fff; -} -.ant-pagination.ant-pagination-disabled .ant-pagination-item-link { - color: rgba(0, 0, 0, 0.25); - background: #f5f5f5; - border-color: #d9d9d9; - cursor: not-allowed; -} -.ant-pagination.ant-pagination-disabled .ant-pagination-item-link-icon { - opacity: 0; -} -.ant-pagination.ant-pagination-disabled .ant-pagination-item-ellipsis { - opacity: 1; -} -@media only screen and (max-width: 992px) { - .ant-pagination-item-after-jump-prev, - .ant-pagination-item-before-jump-next { - display: none; - } -} -@media only screen and (max-width: 576px) { - .ant-pagination-options { - display: none; - } -} -.ant-pagination-rtl { - direction: rtl; -} -.ant-pagination-rtl .ant-pagination-total-text { - margin-right: 0; - margin-left: 8px; -} -.ant-pagination-rtl .ant-pagination-item { - margin-right: 0; - margin-left: 8px; -} -.ant-pagination-rtl .ant-pagination-prev, -.ant-pagination-rtl .ant-pagination-jump-prev, -.ant-pagination-rtl .ant-pagination-jump-next { - margin-right: 0; - margin-left: 8px; -} -.ant-pagination-rtl .ant-pagination-slash { - margin: 0 5px 0 10px; -} -.ant-pagination-rtl .ant-pagination-options { - margin-right: 16px; - margin-left: 0; -} -.ant-pagination-rtl .ant-pagination-options-size-changer.ant-select { - margin-right: 0; - margin-left: 8px; -} -.ant-pagination-rtl.ant-pagination-simple .ant-pagination-simple-pager { - margin-right: 0; - margin-left: 8px; -} -.ant-pagination-rtl.ant-pagination-simple .ant-pagination-simple-pager input { - margin-right: 0; - margin-left: 8px; -} -.ant-pagination-rtl.ant-pagination.mini .ant-pagination-options { - margin-right: 2px; - margin-left: 0; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-mentions { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - font-variant: tabular-nums; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - width: 100%; - min-width: 0; - padding: 4px 11px; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - background-color: #fff; - background-image: none; - border: 1px solid #d9d9d9; - border-radius: 2px; - -webkit-transition: all 0.3s; - transition: all 0.3s; - position: relative; - display: inline-block; - height: auto; - padding: 0; - overflow: hidden; - line-height: 1.5715; - white-space: pre-wrap; - vertical-align: bottom; -} -.ant-mentions::-moz-placeholder { - opacity: 1; -} -.ant-mentions::-webkit-input-placeholder { - color: #bfbfbf; -} -.ant-mentions:-ms-input-placeholder { - color: #bfbfbf; -} -.ant-mentions::-ms-input-placeholder { - color: #bfbfbf; -} -.ant-mentions::placeholder { - color: #bfbfbf; -} -.ant-mentions:-moz-placeholder-shown { - text-overflow: ellipsis; -} -.ant-mentions:-ms-input-placeholder { - text-overflow: ellipsis; -} -.ant-mentions:placeholder-shown { - text-overflow: ellipsis; -} -.ant-mentions:hover { - border-color: #40a9ff; - border-right-width: 1px !important; -} -.ant-mentions:focus, -.ant-mentions-focused { - border-color: #40a9ff; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); - box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); -} -.ant-mentions-disabled { - color: rgba(0, 0, 0, 0.25); - background-color: #f5f5f5; - cursor: not-allowed; - opacity: 1; -} -.ant-mentions-disabled:hover { - border-color: #d9d9d9; - border-right-width: 1px !important; -} -.ant-mentions[disabled] { - color: rgba(0, 0, 0, 0.25); - background-color: #f5f5f5; - cursor: not-allowed; - opacity: 1; -} -.ant-mentions[disabled]:hover { - border-color: #d9d9d9; - border-right-width: 1px !important; -} -textarea.ant-mentions { - max-width: 100%; - height: auto; - min-height: 32px; - line-height: 1.5715; - vertical-align: bottom; - -webkit-transition: all 0.3s, height 0s; - transition: all 0.3s, height 0s; -} -.ant-mentions-lg { - padding: 6.5px 11px; - font-size: 16px; -} -.ant-mentions-sm { - padding: 0px 7px; -} -.ant-mentions-disabled > textarea { - color: rgba(0, 0, 0, 0.25); - background-color: #f5f5f5; - cursor: not-allowed; - opacity: 1; -} -.ant-mentions-disabled > textarea:hover { - border-color: #d9d9d9; - border-right-width: 1px !important; -} -.ant-mentions-focused { - border-color: #40a9ff; - border-right-width: 1px !important; - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); - box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); -} -.ant-mentions > textarea, -.ant-mentions-measure { - min-height: 30px; - margin: 0; - padding: 4px 11px; - overflow: inherit; - overflow-x: hidden; - overflow-y: auto; - font-weight: inherit; - font-size: inherit; - font-family: inherit; - font-style: inherit; - font-variant: inherit; - font-size-adjust: inherit; - font-stretch: inherit; - line-height: inherit; - direction: inherit; - letter-spacing: inherit; - white-space: inherit; - text-align: inherit; - vertical-align: top; - word-wrap: break-word; - word-break: inherit; - -moz-tab-size: inherit; - -o-tab-size: inherit; - tab-size: inherit; -} -.ant-mentions > textarea { - width: 100%; - border: none; - outline: none; - resize: none; -} -.ant-mentions > textarea::-moz-placeholder { - opacity: 1; -} -.ant-mentions > textarea::-webkit-input-placeholder { - color: #bfbfbf; -} -.ant-mentions > textarea:-ms-input-placeholder { - color: #bfbfbf; -} -.ant-mentions > textarea::-ms-input-placeholder { - color: #bfbfbf; -} -.ant-mentions > textarea::placeholder { - color: #bfbfbf; -} -.ant-mentions > textarea:-moz-placeholder-shown { - text-overflow: ellipsis; -} -.ant-mentions > textarea:-ms-input-placeholder { - text-overflow: ellipsis; -} -.ant-mentions > textarea:placeholder-shown { - text-overflow: ellipsis; -} -.ant-mentions > textarea:-moz-read-only { - cursor: default; -} -.ant-mentions > textarea:read-only { - cursor: default; -} -.ant-mentions-measure { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: -1; - color: transparent; - pointer-events: none; -} -.ant-mentions-measure > span { - display: inline-block; - min-height: 1em; -} -.ant-mentions-dropdown { - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: absolute; - top: -9999px; - left: -9999px; - z-index: 1050; - -webkit-box-sizing: border-box; - box-sizing: border-box; - font-size: 14px; - font-variant: initial; - background-color: #fff; - border-radius: 2px; - outline: none; - -webkit-box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); -} -.ant-mentions-dropdown-hidden { - display: none; -} -.ant-mentions-dropdown-menu { - max-height: 250px; - margin-bottom: 0; - padding-left: 0; - overflow: auto; - list-style: none; - outline: none; -} -.ant-mentions-dropdown-menu-item { - position: relative; - display: block; - min-width: 100px; - padding: 5px 12px; - overflow: hidden; - color: rgba(0, 0, 0, 0.65); - font-weight: normal; - line-height: 1.5715; - white-space: nowrap; - text-overflow: ellipsis; - cursor: pointer; - -webkit-transition: background 0.3s ease; - transition: background 0.3s ease; -} -.ant-mentions-dropdown-menu-item:hover { - background-color: #f5f5f5; -} -.ant-mentions-dropdown-menu-item:first-child { - border-radius: 2px 2px 0 0; -} -.ant-mentions-dropdown-menu-item:last-child { - border-radius: 0 0 2px 2px; -} -.ant-mentions-dropdown-menu-item-disabled { - color: rgba(0, 0, 0, 0.25); - cursor: not-allowed; -} -.ant-mentions-dropdown-menu-item-disabled:hover { - color: rgba(0, 0, 0, 0.25); - background-color: #fff; - cursor: not-allowed; -} -.ant-mentions-dropdown-menu-item-selected { - color: rgba(0, 0, 0, 0.65); - font-weight: 600; - background-color: #fafafa; -} -.ant-mentions-dropdown-menu-item-active { - background-color: #f5f5f5; -} -.ant-mentions-rtl { - direction: rtl; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-message { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: fixed; - top: 16px; - left: 0; - z-index: 1010; - width: 100%; - pointer-events: none; -} -.ant-message-notice { - padding: 8px; - text-align: center; -} -.ant-message-notice:first-child { - margin-top: -8px; -} -.ant-message-notice-content { - display: inline-block; - padding: 10px 16px; - background: #fff; - border-radius: 2px; - -webkit-box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - pointer-events: all; -} -.ant-message-success .anticon { - color: #52c41a; -} -.ant-message-error .anticon { - color: #ff4d4f; -} -.ant-message-warning .anticon { - color: #faad14; -} -.ant-message-info .anticon, -.ant-message-loading .anticon { - color: #1890ff; -} -.ant-message .anticon { - position: relative; - top: 1px; - margin-right: 8px; - font-size: 16px; -} -.ant-message-notice.move-up-leave.move-up-leave-active { - -webkit-animation-name: MessageMoveOut; - animation-name: MessageMoveOut; - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; -} -@-webkit-keyframes MessageMoveOut { - 0% { - max-height: 150px; - padding: 8px; - opacity: 1; - } - 100% { - max-height: 0; - padding: 0; - opacity: 0; - } -} -@keyframes MessageMoveOut { - 0% { - max-height: 150px; - padding: 8px; - opacity: 1; - } - 100% { - max-height: 0; - padding: 0; - opacity: 0; - } -} -.ant-message-rtl { - direction: rtl; -} -.ant-message-rtl span { - direction: rtl; -} -.ant-message-rtl .anticon { - margin-right: 0; - margin-left: 8px; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-modal { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - top: 100px; - width: auto; - margin: 0 auto; - padding-bottom: 24px; - pointer-events: none; -} -.ant-modal-wrap { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1000; - overflow: auto; - outline: 0; - -webkit-overflow-scrolling: touch; -} -.ant-modal-title { - margin: 0; - color: rgba(0, 0, 0, 0.85); - font-weight: 500; - font-size: 16px; - line-height: 22px; - word-wrap: break-word; -} -.ant-modal-content { - position: relative; - background-color: #fff; - background-clip: padding-box; - border: 0; - border-radius: 2px; - -webkit-box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - pointer-events: auto; -} -.ant-modal-close { - position: absolute; - top: 0; - right: 0; - z-index: 10; - padding: 0; - color: rgba(0, 0, 0, 0.45); - font-weight: 700; - line-height: 1; - text-decoration: none; - background: transparent; - border: 0; - outline: 0; - cursor: pointer; - -webkit-transition: color 0.3s; - transition: color 0.3s; -} -.ant-modal-close-x { - display: block; - width: 56px; - height: 56px; - font-size: 16px; - font-style: normal; - line-height: 56px; - text-align: center; - text-transform: none; - text-rendering: auto; -} -.ant-modal-close:focus, -.ant-modal-close:hover { - color: rgba(0, 0, 0, 0.75); - text-decoration: none; -} -.ant-modal-header { - padding: 16px 24px; - color: rgba(0, 0, 0, 0.65); - background: #fff; - border-bottom: 1px solid #f0f0f0; - border-radius: 2px 2px 0 0; -} -.ant-modal-body { - padding: 24px; - font-size: 14px; - line-height: 1.5715; - word-wrap: break-word; -} -.ant-modal-footer { - padding: 10px 16px; - text-align: right; - background: transparent; - border-top: 1px solid #f0f0f0; - border-radius: 0 0 2px 2px; -} -.ant-modal-footer button + button { - margin-bottom: 0; - margin-left: 8px; -} -.ant-modal.zoom-enter, -.ant-modal.zoom-appear { - -webkit-transform: none; - transform: none; - opacity: 0; - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.ant-modal-mask { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1000; - height: 100%; - background-color: rgba(0, 0, 0, 0.45); - filter: alpha(opacity=50); -} -.ant-modal-mask-hidden { - display: none; -} -.ant-modal-open { - overflow: hidden; -} -.ant-modal-centered { - text-align: center; -} -.ant-modal-centered::before { - display: inline-block; - width: 0; - height: 100%; - vertical-align: middle; - content: ''; -} -.ant-modal-centered .ant-modal { - top: 0; - display: inline-block; - text-align: left; - vertical-align: middle; -} -@media (max-width: 767px) { - .ant-modal { - max-width: calc(100vw - 16px); - margin: 8px auto; - } - .ant-modal-centered .ant-modal { - -webkit-box-flex: 1; - -ms-flex: 1; - flex: 1; - } -} -.ant-modal-confirm .ant-modal-header { - display: none; -} -.ant-modal-confirm .ant-modal-close { - display: none; -} -.ant-modal-confirm .ant-modal-body { - padding: 32px 32px 24px; -} -.ant-modal-confirm-body-wrapper::before { - display: table; - content: ''; -} -.ant-modal-confirm-body-wrapper::after { - display: table; - clear: both; - content: ''; -} -.ant-modal-confirm-body .ant-modal-confirm-title { - display: block; - overflow: hidden; - color: rgba(0, 0, 0, 0.85); - font-weight: 500; - font-size: 16px; - line-height: 1.4; -} -.ant-modal-confirm-body .ant-modal-confirm-content { - margin-top: 8px; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; -} -.ant-modal-confirm-body > .anticon { - float: left; - margin-right: 16px; - font-size: 22px; -} -.ant-modal-confirm-body > .anticon + .ant-modal-confirm-title + .ant-modal-confirm-content { - margin-left: 38px; -} -.ant-modal-confirm .ant-modal-confirm-btns { - float: right; - margin-top: 24px; -} -.ant-modal-confirm .ant-modal-confirm-btns button + button { - margin-bottom: 0; - margin-left: 8px; -} -.ant-modal-confirm-error .ant-modal-confirm-body > .anticon { - color: #ff4d4f; -} -.ant-modal-confirm-warning .ant-modal-confirm-body > .anticon, -.ant-modal-confirm-confirm .ant-modal-confirm-body > .anticon { - color: #faad14; -} -.ant-modal-confirm-info .ant-modal-confirm-body > .anticon { - color: #1890ff; -} -.ant-modal-confirm-success .ant-modal-confirm-body > .anticon { - color: #52c41a; -} -.ant-modal-wrap-rtl { - direction: rtl; -} -.ant-modal-wrap-rtl .ant-modal-close { - right: initial; - left: 0; -} -.ant-modal-wrap-rtl .ant-modal-footer { - text-align: left; -} -.ant-modal-wrap-rtl .ant-modal-footer button + button { - margin-right: 8px; - margin-left: 0; -} -.ant-modal-wrap-rtl .ant-modal-confirm-body { - direction: rtl; -} -.ant-modal-wrap-rtl .ant-modal-confirm-body > .anticon { - float: right; - margin-right: 0; - margin-left: 16px; -} -.ant-modal-wrap-rtl .ant-modal-confirm-body > .anticon + .ant-modal-confirm-title + .ant-modal-confirm-content { - margin-right: 38px; - margin-left: 0; -} -.ant-modal-wrap-rtl .ant-modal-confirm-btns { - float: left; -} -.ant-modal-wrap-rtl .ant-modal-confirm-btns button + button { - margin-right: 8px; - margin-left: 0; -} -.ant-modal-wrap-rtl.ant-modal-centered .ant-modal { - text-align: right; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-notification { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: fixed; - z-index: 1010; - max-width: calc(100vw - 32px); - margin-right: 24px; -} -.ant-notification-topLeft, -.ant-notification-bottomLeft { - margin-right: 0; - margin-left: 24px; -} -.ant-notification-topLeft .ant-notification-fade-enter.ant-notification-fade-enter-active, -.ant-notification-bottomLeft .ant-notification-fade-enter.ant-notification-fade-enter-active, -.ant-notification-topLeft .ant-notification-fade-appear.ant-notification-fade-appear-active, -.ant-notification-bottomLeft .ant-notification-fade-appear.ant-notification-fade-appear-active { - -webkit-animation-name: NotificationLeftFadeIn; - animation-name: NotificationLeftFadeIn; -} -.ant-notification-close-icon { - font-size: 14px; - cursor: pointer; -} -.ant-notification-hook-holder, -.ant-notification-notice { - position: relative; - width: 384px; - margin-bottom: 16px; - margin-left: auto; - overflow: hidden; - background: #fff; - border-radius: 2px; - -webkit-box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); -} -.ant-notification-topLeft .ant-notification-hook-holder, -.ant-notification-topLeft .ant-notification-notice, -.ant-notification-bottomLeft .ant-notification-hook-holder, -.ant-notification-bottomLeft .ant-notification-notice { - margin-right: auto; - margin-left: 0; -} -.ant-notification-hook-holder > .ant-notification-notice { - margin-bottom: 0; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-notification-notice { - padding: 16px 24px; - line-height: 1.5715; -} -.ant-notification-notice-message { - display: inline-block; - margin-bottom: 8px; - color: rgba(0, 0, 0, 0.85); - font-size: 16px; - line-height: 24px; -} -.ant-notification-notice-message-single-line-auto-margin { - display: block; - width: calc(384px - 24px * 2 - 24px - 48px - 100%); - max-width: 4px; - background-color: transparent; - pointer-events: none; -} -.ant-notification-notice-message-single-line-auto-margin::before { - display: block; - content: ''; -} -.ant-notification-notice-description { - font-size: 14px; -} -.ant-notification-notice-closable .ant-notification-notice-message { - padding-right: 24px; -} -.ant-notification-notice-with-icon .ant-notification-notice-message { - margin-bottom: 4px; - margin-left: 48px; - font-size: 16px; -} -.ant-notification-notice-with-icon .ant-notification-notice-description { - margin-left: 48px; - font-size: 14px; -} -.ant-notification-notice-icon { - position: absolute; - margin-left: 4px; - font-size: 24px; - line-height: 24px; -} -.anticon.ant-notification-notice-icon-success { - color: #52c41a; -} -.anticon.ant-notification-notice-icon-info { - color: #1890ff; -} -.anticon.ant-notification-notice-icon-warning { - color: #faad14; -} -.anticon.ant-notification-notice-icon-error { - color: #ff4d4f; -} -.ant-notification-notice-close { - position: absolute; - top: 16px; - right: 22px; - color: rgba(0, 0, 0, 0.45); - outline: none; -} -.ant-notification-notice-close:hover { - color: rgba(0, 0, 0, 0.67); -} -.ant-notification-notice-btn { - float: right; - margin-top: 16px; -} -.ant-notification .notification-fade-effect { - -webkit-animation-duration: 0.24s; - animation-duration: 0.24s; - -webkit-animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); - animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); - -webkit-animation-fill-mode: both; - animation-fill-mode: both; -} -.ant-notification-fade-enter, -.ant-notification-fade-appear { - opacity: 0; - -webkit-animation-duration: 0.24s; - animation-duration: 0.24s; - -webkit-animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); - animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.ant-notification-fade-leave { - -webkit-animation-duration: 0.24s; - animation-duration: 0.24s; - -webkit-animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); - animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-duration: 0.2s; - animation-duration: 0.2s; - -webkit-animation-play-state: paused; - animation-play-state: paused; -} -.ant-notification-fade-enter.ant-notification-fade-enter-active, -.ant-notification-fade-appear.ant-notification-fade-appear-active { - -webkit-animation-name: NotificationFadeIn; - animation-name: NotificationFadeIn; - -webkit-animation-play-state: running; - animation-play-state: running; -} -.ant-notification-fade-leave.ant-notification-fade-leave-active { - -webkit-animation-name: NotificationFadeOut; - animation-name: NotificationFadeOut; - -webkit-animation-play-state: running; - animation-play-state: running; -} -@-webkit-keyframes NotificationFadeIn { - 0% { - left: 384px; - opacity: 0; - } - 100% { - left: 0; - opacity: 1; - } -} -@keyframes NotificationFadeIn { - 0% { - left: 384px; - opacity: 0; - } - 100% { - left: 0; - opacity: 1; - } -} -@-webkit-keyframes NotificationLeftFadeIn { - 0% { - right: 384px; - opacity: 0; - } - 100% { - right: 0; - opacity: 1; - } -} -@keyframes NotificationLeftFadeIn { - 0% { - right: 384px; - opacity: 0; - } - 100% { - right: 0; - opacity: 1; - } -} -@-webkit-keyframes NotificationFadeOut { - 0% { - max-height: 150px; - margin-bottom: 16px; - padding-top: 16px; - padding-bottom: 16px; - opacity: 1; - } - 100% { - max-height: 0; - margin-bottom: 0; - padding-top: 0; - padding-bottom: 0; - opacity: 0; - } -} -@keyframes NotificationFadeOut { - 0% { - max-height: 150px; - margin-bottom: 16px; - padding-top: 16px; - padding-bottom: 16px; - opacity: 1; - } - 100% { - max-height: 0; - margin-bottom: 0; - padding-top: 0; - padding-bottom: 0; - opacity: 0; - } -} -.ant-notification-rtl { - direction: rtl; -} -.ant-notification-rtl .ant-notification-notice-closable .ant-notification-notice-message { - padding-right: 0; - padding-left: 24px; -} -.ant-notification-rtl .ant-notification-notice-with-icon .ant-notification-notice-message { - margin-right: 48px; - margin-left: 0; -} -.ant-notification-rtl .ant-notification-notice-with-icon .ant-notification-notice-description { - margin-right: 48px; - margin-left: 0; -} -.ant-notification-rtl .ant-notification-notice-icon { - margin-right: 4px; - margin-left: 0; -} -.ant-notification-rtl .ant-notification-notice-close { - right: auto; - left: 22px; -} -.ant-notification-rtl .ant-notification-notice-btn { - float: left; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-page-header { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - padding: 16px 24px; - background-color: #fff; -} -.ant-page-header-ghost { - background-color: inherit; -} -.ant-page-header.has-breadcrumb { - padding-top: 12px; -} -.ant-page-header.has-footer { - padding-bottom: 0; -} -.ant-page-header-back { - margin-right: 16px; - font-size: 16px; - line-height: 1; -} -.ant-page-header-back-button { - color: #1890ff; - text-decoration: none; - outline: none; - -webkit-transition: color 0.3s; - transition: color 0.3s; - color: #000; - cursor: pointer; -} -.ant-page-header-back-button:focus, -.ant-page-header-back-button:hover { - color: #40a9ff; -} -.ant-page-header-back-button:active { - color: #096dd9; -} -.ant-page-header .ant-divider-vertical { - height: 14px; - margin: 0 12px; - vertical-align: middle; -} -.ant-breadcrumb + .ant-page-header-heading { - margin-top: 8px; -} -.ant-page-header-heading { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; -} -.ant-page-header-heading-left { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - margin: 4px 0; - overflow: hidden; -} -.ant-page-header-heading-title { - margin-right: 12px; - margin-bottom: 0; - color: rgba(0, 0, 0, 0.85); - font-weight: 600; - font-size: 20px; - line-height: 32px; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} -.ant-page-header-heading .ant-avatar { - margin-right: 12px; -} -.ant-page-header-heading-sub-title { - margin-right: 12px; - color: rgba(0, 0, 0, 0.45); - font-size: 14px; - line-height: 1.5715; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} -.ant-page-header-heading-extra { - margin: 4px 0; - white-space: nowrap; -} -.ant-page-header-heading-extra > * { - margin-left: 12px; - white-space: unset; -} -.ant-page-header-heading-extra > *:first-child { - margin-left: 0; -} -.ant-page-header-content { - padding-top: 12px; -} -.ant-page-header-footer { - margin-top: 16px; -} -.ant-page-header-footer .ant-tabs > .ant-tabs-nav { - margin: 0; -} -.ant-page-header-footer .ant-tabs > .ant-tabs-nav::before { - border: none; -} -.ant-page-header-footer .ant-tabs .ant-tabs-tab { - padding: 8px 0; - font-size: 16px; -} -.ant-page-header-compact .ant-page-header-heading { - -ms-flex-wrap: wrap; - flex-wrap: wrap; -} -.ant-page-header-rtl { - direction: rtl; -} -.ant-page-header-rtl .ant-page-header-back { - float: right; - margin-right: 0; - margin-left: 16px; -} -.ant-page-header-rtl .ant-page-header-heading-title { - margin-right: 0; - margin-left: 12px; -} -.ant-page-header-rtl .ant-page-header-heading .ant-avatar { - margin-right: 0; - margin-left: 12px; -} -.ant-page-header-rtl .ant-page-header-heading-sub-title { - float: right; - margin-right: 0; - margin-left: 12px; -} -.ant-page-header-rtl .ant-page-header-heading-tags { - float: right; -} -.ant-page-header-rtl .ant-page-header-heading-extra { - float: left; -} -.ant-page-header-rtl .ant-page-header-heading-extra > * { - margin-right: 12px; - margin-left: 0; -} -.ant-page-header-rtl .ant-page-header-heading-extra > *:first-child { - margin-right: 0; -} -.ant-page-header-rtl .ant-page-header-footer .ant-tabs-bar .ant-tabs-nav { - float: right; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-popover { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: absolute; - top: 0; - left: 0; - z-index: 1030; - font-weight: normal; - white-space: normal; - text-align: left; - cursor: auto; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; -} -.ant-popover::after { - position: absolute; - background: rgba(255, 255, 255, 0.01); - content: ''; -} -.ant-popover-hidden { - display: none; -} -.ant-popover-placement-top, -.ant-popover-placement-topLeft, -.ant-popover-placement-topRight { - padding-bottom: 10px; -} -.ant-popover-placement-right, -.ant-popover-placement-rightTop, -.ant-popover-placement-rightBottom { - padding-left: 10px; -} -.ant-popover-placement-bottom, -.ant-popover-placement-bottomLeft, -.ant-popover-placement-bottomRight { - padding-top: 10px; -} -.ant-popover-placement-left, -.ant-popover-placement-leftTop, -.ant-popover-placement-leftBottom { - padding-right: 10px; -} -.ant-popover-inner { - background-color: #fff; - background-clip: padding-box; - border-radius: 2px; - -webkit-box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - -webkit-box-shadow: 0 0 8px rgba(0, 0, 0, 0.15) \9; - box-shadow: 0 0 8px rgba(0, 0, 0, 0.15) \9; -} -@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { - .ant-popover { - /* IE10+ */ - } - .ant-popover-inner { - -webkit-box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - } -} -.ant-popover-title { - min-width: 177px; - min-height: 32px; - margin: 0; - padding: 5px 16px 4px; - color: rgba(0, 0, 0, 0.85); - font-weight: 500; - border-bottom: 1px solid #f0f0f0; -} -.ant-popover-inner-content { - padding: 12px 16px; - color: rgba(0, 0, 0, 0.65); -} -.ant-popover-message { - position: relative; - padding: 4px 0 12px; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; -} -.ant-popover-message > .anticon { - position: absolute; - top: 8.0005px; - color: #faad14; - font-size: 14px; -} -.ant-popover-message-title { - padding-left: 22px; -} -.ant-popover-buttons { - margin-bottom: 4px; - text-align: right; -} -.ant-popover-buttons button { - margin-left: 8px; -} -.ant-popover-arrow { - position: absolute; - display: block; - width: 8.48528137px; - height: 8.48528137px; - background: transparent; - border-style: solid; - border-width: 4.24264069px; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); -} -.ant-popover-placement-top > .ant-popover-content > .ant-popover-arrow, -.ant-popover-placement-topLeft > .ant-popover-content > .ant-popover-arrow, -.ant-popover-placement-topRight > .ant-popover-content > .ant-popover-arrow { - bottom: 6.2px; - border-top-color: transparent; - border-right-color: #fff; - border-bottom-color: #fff; - border-left-color: transparent; - -webkit-box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07); - box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07); -} -.ant-popover-placement-top > .ant-popover-content > .ant-popover-arrow { - left: 50%; - -webkit-transform: translateX(-50%) rotate(45deg); - transform: translateX(-50%) rotate(45deg); -} -.ant-popover-placement-topLeft > .ant-popover-content > .ant-popover-arrow { - left: 16px; -} -.ant-popover-placement-topRight > .ant-popover-content > .ant-popover-arrow { - right: 16px; -} -.ant-popover-placement-right > .ant-popover-content > .ant-popover-arrow, -.ant-popover-placement-rightTop > .ant-popover-content > .ant-popover-arrow, -.ant-popover-placement-rightBottom > .ant-popover-content > .ant-popover-arrow { - left: 6px; - border-top-color: transparent; - border-right-color: transparent; - border-bottom-color: #fff; - border-left-color: #fff; - -webkit-box-shadow: -3px 3px 7px rgba(0, 0, 0, 0.07); - box-shadow: -3px 3px 7px rgba(0, 0, 0, 0.07); -} -.ant-popover-placement-right > .ant-popover-content > .ant-popover-arrow { - top: 50%; - -webkit-transform: translateY(-50%) rotate(45deg); - transform: translateY(-50%) rotate(45deg); -} -.ant-popover-placement-rightTop > .ant-popover-content > .ant-popover-arrow { - top: 12px; -} -.ant-popover-placement-rightBottom > .ant-popover-content > .ant-popover-arrow { - bottom: 12px; -} -.ant-popover-placement-bottom > .ant-popover-content > .ant-popover-arrow, -.ant-popover-placement-bottomLeft > .ant-popover-content > .ant-popover-arrow, -.ant-popover-placement-bottomRight > .ant-popover-content > .ant-popover-arrow { - top: 6px; - border-top-color: #fff; - border-right-color: transparent; - border-bottom-color: transparent; - border-left-color: #fff; - -webkit-box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.06); - box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.06); -} -.ant-popover-placement-bottom > .ant-popover-content > .ant-popover-arrow { - left: 50%; - -webkit-transform: translateX(-50%) rotate(45deg); - transform: translateX(-50%) rotate(45deg); -} -.ant-popover-placement-bottomLeft > .ant-popover-content > .ant-popover-arrow { - left: 16px; -} -.ant-popover-placement-bottomRight > .ant-popover-content > .ant-popover-arrow { - right: 16px; -} -.ant-popover-placement-left > .ant-popover-content > .ant-popover-arrow, -.ant-popover-placement-leftTop > .ant-popover-content > .ant-popover-arrow, -.ant-popover-placement-leftBottom > .ant-popover-content > .ant-popover-arrow { - right: 6px; - border-top-color: #fff; - border-right-color: #fff; - border-bottom-color: transparent; - border-left-color: transparent; - -webkit-box-shadow: 3px -3px 7px rgba(0, 0, 0, 0.07); - box-shadow: 3px -3px 7px rgba(0, 0, 0, 0.07); -} -.ant-popover-placement-left > .ant-popover-content > .ant-popover-arrow { - top: 50%; - -webkit-transform: translateY(-50%) rotate(45deg); - transform: translateY(-50%) rotate(45deg); -} -.ant-popover-placement-leftTop > .ant-popover-content > .ant-popover-arrow { - top: 12px; -} -.ant-popover-placement-leftBottom > .ant-popover-content > .ant-popover-arrow { - bottom: 12px; -} -.ant-popover-rtl { - direction: rtl; - text-align: right; -} -.ant-popover-rtl .ant-popover-message-title { - padding-right: 22px; - padding-left: 16px; -} -.ant-popover-rtl .ant-popover-buttons { - text-align: left; -} -.ant-popover-rtl .ant-popover-buttons button { - margin-right: 8px; - margin-left: 0; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-popconfirm { - z-index: 1060; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-progress { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - display: inline-block; -} -.ant-progress-line { - position: relative; - width: 100%; - font-size: 14px; -} -.ant-progress-steps { - display: inline-block; -} -.ant-progress-steps-outer { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} -.ant-progress-steps-item { - -ms-flex-negative: 0; - flex-shrink: 0; - min-width: 2px; - margin-right: 2px; - background: #f3f3f3; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-progress-steps-item-active { - background: #1890ff; -} -.ant-progress-small.ant-progress-line, -.ant-progress-small.ant-progress-line .ant-progress-text .anticon { - font-size: 12px; -} -.ant-progress-outer { - display: inline-block; - width: 100%; - margin-right: 0; - padding-right: 0; -} -.ant-progress-show-info .ant-progress-outer { - margin-right: calc(-2em - 8px); - padding-right: calc(2em + 8px); -} -.ant-progress-inner { - position: relative; - display: inline-block; - width: 100%; - overflow: hidden; - vertical-align: middle; - background-color: #f5f5f5; - border-radius: 100px; -} -.ant-progress-circle-trail { - stroke: #f5f5f5; -} -.ant-progress-circle-path { - -webkit-animation: ant-progress-appear 0.3s; - animation: ant-progress-appear 0.3s; -} -.ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path { - stroke: #1890ff; -} -.ant-progress-success-bg, -.ant-progress-bg { - position: relative; - background-color: #1890ff; - border-radius: 100px; - -webkit-transition: all 0.4s cubic-bezier(0.08, 0.82, 0.17, 1) 0s; - transition: all 0.4s cubic-bezier(0.08, 0.82, 0.17, 1) 0s; -} -.ant-progress-success-bg { - position: absolute; - top: 0; - left: 0; - background-color: #52c41a; -} -.ant-progress-text { - display: inline-block; - width: 2em; - margin-left: 8px; - color: rgba(0, 0, 0, 0.45); - font-size: 1em; - line-height: 1; - white-space: nowrap; - text-align: left; - vertical-align: middle; - word-break: normal; -} -.ant-progress-text .anticon { - font-size: 14px; -} -.ant-progress-status-active .ant-progress-bg::before { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: #fff; - border-radius: 10px; - opacity: 0; - -webkit-animation: ant-progress-active 2.4s cubic-bezier(0.23, 1, 0.32, 1) infinite; - animation: ant-progress-active 2.4s cubic-bezier(0.23, 1, 0.32, 1) infinite; - content: ''; -} -.ant-progress-status-exception .ant-progress-bg { - background-color: #ff4d4f; -} -.ant-progress-status-exception .ant-progress-text { - color: #ff4d4f; -} -.ant-progress-status-exception .ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path { - stroke: #ff4d4f; -} -.ant-progress-status-success .ant-progress-bg { - background-color: #52c41a; -} -.ant-progress-status-success .ant-progress-text { - color: #52c41a; -} -.ant-progress-status-success .ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path { - stroke: #52c41a; -} -.ant-progress-circle .ant-progress-inner { - position: relative; - line-height: 1; - background-color: transparent; -} -.ant-progress-circle .ant-progress-text { - position: absolute; - top: 50%; - left: 50%; - width: 100%; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 1em; - line-height: 1; - white-space: normal; - text-align: center; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); -} -.ant-progress-circle .ant-progress-text .anticon { - font-size: 1.16666667em; -} -.ant-progress-circle.ant-progress-status-exception .ant-progress-text { - color: #ff4d4f; -} -.ant-progress-circle.ant-progress-status-success .ant-progress-text { - color: #52c41a; -} -@-webkit-keyframes ant-progress-active { - 0% { - width: 0; - opacity: 0.1; - } - 20% { - width: 0; - opacity: 0.5; - } - 100% { - width: 100%; - opacity: 0; - } -} -@keyframes ant-progress-active { - 0% { - width: 0; - opacity: 0.1; - } - 20% { - width: 0; - opacity: 0.5; - } - 100% { - width: 100%; - opacity: 0; - } -} -.ant-progress-rtl { - direction: rtl; -} -.ant-progress-rtl.ant-progress-show-info .ant-progress-outer { - margin-right: 0; - margin-left: calc(-2em - 8px); - padding-right: 0; - padding-left: calc(2em + 8px); -} -.ant-progress-rtl .ant-progress-success-bg { - right: 0; - left: auto; -} -.ant-progress-rtl.ant-progress-line .ant-progress-text, -.ant-progress-rtl.ant-progress-steps .ant-progress-text { - margin-right: 8px; - margin-left: 0; - text-align: right; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-rate { - -webkit-box-sizing: border-box; - box-sizing: border-box; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - display: inline-block; - margin: 0; - padding: 0; - color: #fadb14; - font-size: 20px; - line-height: unset; - list-style: none; - outline: none; -} -.ant-rate-disabled .ant-rate-star { - cursor: default; -} -.ant-rate-disabled .ant-rate-star:hover { - -webkit-transform: scale(1); - transform: scale(1); -} -.ant-rate-star { - position: relative; - display: inline-block; - margin: 0; - padding: 0; - color: inherit; - cursor: pointer; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-rate-star:not(:last-child) { - margin-right: 8px; -} -.ant-rate-star > div:focus { - outline: 0; -} -.ant-rate-star > div:hover, -.ant-rate-star > div:focus { - -webkit-transform: scale(1.1); - transform: scale(1.1); -} -.ant-rate-star-first, -.ant-rate-star-second { - color: #f0f0f0; - -webkit-transition: all 0.3s; - transition: all 0.3s; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.ant-rate-star-first .anticon, -.ant-rate-star-second .anticon { - vertical-align: middle; -} -.ant-rate-star-first { - position: absolute; - top: 0; - left: 0; - width: 50%; - height: 100%; - overflow: hidden; - opacity: 0; -} -.ant-rate-star-half .ant-rate-star-first, -.ant-rate-star-half .ant-rate-star-second { - opacity: 1; -} -.ant-rate-star-half .ant-rate-star-first, -.ant-rate-star-full .ant-rate-star-second { - color: inherit; -} -.ant-rate-text { - display: inline-block; - margin: 0 8px; - font-size: 14px; -} -.ant-rate-rtl { - direction: rtl; -} -.ant-rate-rtl .ant-rate-star:not(:last-child) { - margin-right: 0; - margin-left: 8px; -} -.ant-rate-rtl .ant-rate-star-first { - right: 0; - left: auto; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-result { - padding: 48px 32px; -} -.ant-result-success .ant-result-icon > .anticon { - color: #52c41a; -} -.ant-result-error .ant-result-icon > .anticon { - color: #ff4d4f; -} -.ant-result-info .ant-result-icon > .anticon { - color: #1890ff; -} -.ant-result-warning .ant-result-icon > .anticon { - color: #faad14; -} -.ant-result-image { - width: 250px; - height: 295px; - margin: auto; -} -.ant-result-icon { - margin-bottom: 24px; - text-align: center; -} -.ant-result-icon > .anticon { - font-size: 72px; -} -.ant-result-title { - color: rgba(0, 0, 0, 0.85); - font-size: 24px; - line-height: 1.8; - text-align: center; -} -.ant-result-subtitle { - color: rgba(0, 0, 0, 0.45); - font-size: 14px; - line-height: 1.6; - text-align: center; -} -.ant-result-extra { - margin: 24px 0 0 0; - text-align: center; -} -.ant-result-extra > * { - margin-right: 8px; -} -.ant-result-extra > *:last-child { - margin-right: 0; -} -.ant-result-content { - margin-top: 24px; - padding: 24px 40px; - background-color: #fafafa; -} -.ant-result-rtl { - direction: rtl; -} -.ant-result-rtl .ant-result-extra > * { - margin-right: 0; - margin-left: 8px; -} -.ant-result-rtl .ant-result-extra > *:last-child { - margin-left: 0; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-skeleton { - display: table; - width: 100%; -} -.ant-skeleton-header { - display: table-cell; - padding-right: 16px; - vertical-align: top; -} -.ant-skeleton-header .ant-skeleton-avatar { - display: inline-block; - vertical-align: top; - background: #f2f2f2; - width: 32px; - height: 32px; - line-height: 32px; -} -.ant-skeleton-header .ant-skeleton-avatar.ant-skeleton-avatar-circle { - border-radius: 50%; -} -.ant-skeleton-header .ant-skeleton-avatar-lg { - width: 40px; - height: 40px; - line-height: 40px; -} -.ant-skeleton-header .ant-skeleton-avatar-lg.ant-skeleton-avatar-circle { - border-radius: 50%; -} -.ant-skeleton-header .ant-skeleton-avatar-sm { - width: 24px; - height: 24px; - line-height: 24px; -} -.ant-skeleton-header .ant-skeleton-avatar-sm.ant-skeleton-avatar-circle { - border-radius: 50%; -} -.ant-skeleton-content { - display: table-cell; - width: 100%; - vertical-align: top; -} -.ant-skeleton-content .ant-skeleton-title { - width: 100%; - height: 16px; - margin-top: 16px; - background: #f2f2f2; -} -.ant-skeleton-content .ant-skeleton-title + .ant-skeleton-paragraph { - margin-top: 24px; -} -.ant-skeleton-content .ant-skeleton-paragraph { - padding: 0; -} -.ant-skeleton-content .ant-skeleton-paragraph > li { - width: 100%; - height: 16px; - list-style: none; - background: #f2f2f2; -} -.ant-skeleton-content .ant-skeleton-paragraph > li:last-child:not(:first-child):not(:nth-child(2)) { - width: 61%; -} -.ant-skeleton-content .ant-skeleton-paragraph > li + li { - margin-top: 16px; -} -.ant-skeleton-with-avatar .ant-skeleton-content .ant-skeleton-title { - margin-top: 12px; -} -.ant-skeleton-with-avatar .ant-skeleton-content .ant-skeleton-title + .ant-skeleton-paragraph { - margin-top: 28px; -} -.ant-skeleton-round .ant-skeleton-content .ant-skeleton-title, -.ant-skeleton-round .ant-skeleton-content .ant-skeleton-paragraph > li { - border-radius: 100px; -} -.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-title, -.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-paragraph > li { - background: -webkit-gradient(linear, left top, right top, color-stop(25%, #f2f2f2), color-stop(37%, #e6e6e6), color-stop(63%, #f2f2f2)); - background: linear-gradient(90deg, #f2f2f2 25%, #e6e6e6 37%, #f2f2f2 63%); - background-size: 400% 100%; - -webkit-animation: ant-skeleton-loading 1.4s ease infinite; - animation: ant-skeleton-loading 1.4s ease infinite; -} -.ant-skeleton.ant-skeleton-active .ant-skeleton-avatar { - background: -webkit-gradient(linear, left top, right top, color-stop(25%, #f2f2f2), color-stop(37%, #e6e6e6), color-stop(63%, #f2f2f2)); - background: linear-gradient(90deg, #f2f2f2 25%, #e6e6e6 37%, #f2f2f2 63%); - background-size: 400% 100%; - -webkit-animation: ant-skeleton-loading 1.4s ease infinite; - animation: ant-skeleton-loading 1.4s ease infinite; -} -.ant-skeleton.ant-skeleton-active .ant-skeleton-button { - background: -webkit-gradient(linear, left top, right top, color-stop(25%, #f2f2f2), color-stop(37%, #e6e6e6), color-stop(63%, #f2f2f2)); - background: linear-gradient(90deg, #f2f2f2 25%, #e6e6e6 37%, #f2f2f2 63%); - background-size: 400% 100%; - -webkit-animation: ant-skeleton-loading 1.4s ease infinite; - animation: ant-skeleton-loading 1.4s ease infinite; -} -.ant-skeleton.ant-skeleton-active .ant-skeleton-input { - background: -webkit-gradient(linear, left top, right top, color-stop(25%, #f2f2f2), color-stop(37%, #e6e6e6), color-stop(63%, #f2f2f2)); - background: linear-gradient(90deg, #f2f2f2 25%, #e6e6e6 37%, #f2f2f2 63%); - background-size: 400% 100%; - -webkit-animation: ant-skeleton-loading 1.4s ease infinite; - animation: ant-skeleton-loading 1.4s ease infinite; -} -.ant-skeleton.ant-skeleton-active .ant-skeleton-image { - background: -webkit-gradient(linear, left top, right top, color-stop(25%, #f2f2f2), color-stop(37%, #e6e6e6), color-stop(63%, #f2f2f2)); - background: linear-gradient(90deg, #f2f2f2 25%, #e6e6e6 37%, #f2f2f2 63%); - background-size: 400% 100%; - -webkit-animation: ant-skeleton-loading 1.4s ease infinite; - animation: ant-skeleton-loading 1.4s ease infinite; -} -.ant-skeleton-element { - display: inline-block; - width: auto; -} -.ant-skeleton-element .ant-skeleton-button { - display: inline-block; - vertical-align: top; - background: #f2f2f2; - border-radius: 2px; - width: 64px; - height: 32px; - line-height: 32px; -} -.ant-skeleton-element .ant-skeleton-button.ant-skeleton-button-circle { - width: 32px; - border-radius: 50%; -} -.ant-skeleton-element .ant-skeleton-button.ant-skeleton-button-round { - border-radius: 32px; -} -.ant-skeleton-element .ant-skeleton-button-lg { - width: 80px; - height: 40px; - line-height: 40px; -} -.ant-skeleton-element .ant-skeleton-button-lg.ant-skeleton-button-circle { - width: 40px; - border-radius: 50%; -} -.ant-skeleton-element .ant-skeleton-button-lg.ant-skeleton-button-round { - border-radius: 40px; -} -.ant-skeleton-element .ant-skeleton-button-sm { - width: 48px; - height: 24px; - line-height: 24px; -} -.ant-skeleton-element .ant-skeleton-button-sm.ant-skeleton-button-circle { - width: 24px; - border-radius: 50%; -} -.ant-skeleton-element .ant-skeleton-button-sm.ant-skeleton-button-round { - border-radius: 24px; -} -.ant-skeleton-element .ant-skeleton-avatar { - display: inline-block; - vertical-align: top; - background: #f2f2f2; - width: 32px; - height: 32px; - line-height: 32px; -} -.ant-skeleton-element .ant-skeleton-avatar.ant-skeleton-avatar-circle { - border-radius: 50%; -} -.ant-skeleton-element .ant-skeleton-avatar-lg { - width: 40px; - height: 40px; - line-height: 40px; -} -.ant-skeleton-element .ant-skeleton-avatar-lg.ant-skeleton-avatar-circle { - border-radius: 50%; -} -.ant-skeleton-element .ant-skeleton-avatar-sm { - width: 24px; - height: 24px; - line-height: 24px; -} -.ant-skeleton-element .ant-skeleton-avatar-sm.ant-skeleton-avatar-circle { - border-radius: 50%; -} -.ant-skeleton-element .ant-skeleton-input { - display: inline-block; - vertical-align: top; - background: #f2f2f2; - width: 100%; - height: 32px; - line-height: 32px; -} -.ant-skeleton-element .ant-skeleton-input-lg { - width: 100%; - height: 40px; - line-height: 40px; -} -.ant-skeleton-element .ant-skeleton-input-sm { - width: 100%; - height: 24px; - line-height: 24px; -} -.ant-skeleton-element .ant-skeleton-image { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - vertical-align: top; - background: #f2f2f2; - width: 96px; - height: 96px; - line-height: 96px; -} -.ant-skeleton-element .ant-skeleton-image.ant-skeleton-image-circle { - border-radius: 50%; -} -.ant-skeleton-element .ant-skeleton-image-path { - fill: #bfbfbf; -} -.ant-skeleton-element .ant-skeleton-image-svg { - width: 48px; - height: 48px; - line-height: 48px; - max-width: 192px; - max-height: 192px; -} -.ant-skeleton-element .ant-skeleton-image-svg.ant-skeleton-image-circle { - border-radius: 50%; -} -@-webkit-keyframes ant-skeleton-loading { - 0% { - background-position: 100% 50%; - } - 100% { - background-position: 0 50%; - } -} -@keyframes ant-skeleton-loading { - 0% { - background-position: 100% 50%; - } - 100% { - background-position: 0 50%; - } -} -.ant-skeleton-rtl { - direction: rtl; -} -.ant-skeleton-rtl .ant-skeleton-header { - padding-right: 0; - padding-left: 16px; -} -.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-title, -.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-paragraph > li { - -webkit-animation-name: ant-skeleton-loading-rtl; - animation-name: ant-skeleton-loading-rtl; -} -.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-avatar { - -webkit-animation-name: ant-skeleton-loading-rtl; - animation-name: ant-skeleton-loading-rtl; -} -@-webkit-keyframes ant-skeleton-loading-rtl { - 0% { - background-position: 0% 50%; - } - 100% { - background-position: 100% 50%; - } -} -@keyframes ant-skeleton-loading-rtl { - 0% { - background-position: 0% 50%; - } - 100% { - background-position: 100% 50%; - } -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-slider { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - height: 12px; - margin: 10px 6px 10px; - padding: 4px 0; - cursor: pointer; - -ms-touch-action: none; - touch-action: none; -} -.ant-slider-vertical { - width: 12px; - height: 100%; - margin: 6px 10px; - padding: 0 4px; -} -.ant-slider-vertical .ant-slider-rail { - width: 4px; - height: 100%; -} -.ant-slider-vertical .ant-slider-track { - width: 4px; -} -.ant-slider-vertical .ant-slider-handle { - margin-top: -6px; - margin-left: -5px; -} -.ant-slider-vertical .ant-slider-mark { - top: 0; - left: 12px; - width: 18px; - height: 100%; -} -.ant-slider-vertical .ant-slider-mark-text { - left: 4px; - white-space: nowrap; -} -.ant-slider-vertical .ant-slider-step { - width: 4px; - height: 100%; -} -.ant-slider-vertical .ant-slider-dot { - top: auto; - left: 2px; - margin-bottom: -4px; -} -.ant-slider-tooltip .ant-tooltip-inner { - min-width: unset; -} -.ant-slider-rtl.ant-slider-vertical .ant-slider-handle { - margin-right: -5px; - margin-left: 0; -} -.ant-slider-rtl.ant-slider-vertical .ant-slider-mark { - right: 12px; - left: auto; -} -.ant-slider-rtl.ant-slider-vertical .ant-slider-mark-text { - right: 4px; - left: auto; -} -.ant-slider-rtl.ant-slider-vertical .ant-slider-dot { - right: 2px; - left: auto; -} -.ant-slider-with-marks { - margin-bottom: 28px; -} -.ant-slider-rail { - position: absolute; - width: 100%; - height: 4px; - background-color: #f5f5f5; - border-radius: 2px; - -webkit-transition: background-color 0.3s; - transition: background-color 0.3s; -} -.ant-slider-track { - position: absolute; - height: 4px; - background-color: #91d5ff; - border-radius: 2px; - -webkit-transition: background-color 0.3s; - transition: background-color 0.3s; -} -.ant-slider-handle { - position: absolute; - width: 14px; - height: 14px; - margin-top: -5px; - background-color: #fff; - border: solid 2px #91d5ff; - border-radius: 50%; - -webkit-box-shadow: 0; - box-shadow: 0; - cursor: pointer; - -webkit-transition: border-color 0.3s, -webkit-box-shadow 0.6s, -webkit-transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28); - transition: border-color 0.3s, -webkit-box-shadow 0.6s, -webkit-transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28); - transition: border-color 0.3s, box-shadow 0.6s, transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28); - transition: border-color 0.3s, box-shadow 0.6s, transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28), -webkit-box-shadow 0.6s, -webkit-transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28); -} -.ant-slider-handle-dragging.ant-slider-handle-dragging.ant-slider-handle-dragging { - border-color: #46a6ff; - -webkit-box-shadow: 0 0 0 5px rgba(24, 144, 255, 0.12); - box-shadow: 0 0 0 5px rgba(24, 144, 255, 0.12); -} -.ant-slider-handle:focus { - border-color: #46a6ff; - outline: none; - -webkit-box-shadow: 0 0 0 5px rgba(24, 144, 255, 0.12); - box-shadow: 0 0 0 5px rgba(24, 144, 255, 0.12); -} -.ant-slider-handle.ant-tooltip-open { - border-color: #1890ff; -} -.ant-slider:hover .ant-slider-rail { - background-color: #e1e1e1; -} -.ant-slider:hover .ant-slider-track { - background-color: #69c0ff; -} -.ant-slider:hover .ant-slider-handle:not(.ant-tooltip-open) { - border-color: #69c0ff; -} -.ant-slider-mark { - position: absolute; - top: 14px; - left: 0; - width: 100%; - font-size: 14px; -} -.ant-slider-mark-text { - position: absolute; - display: inline-block; - color: rgba(0, 0, 0, 0.45); - text-align: center; - word-break: keep-all; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.ant-slider-mark-text-active { - color: rgba(0, 0, 0, 0.65); -} -.ant-slider-step { - position: absolute; - width: 100%; - height: 4px; - background: transparent; -} -.ant-slider-dot { - position: absolute; - top: -2px; - width: 8px; - height: 8px; - margin-left: -4px; - background-color: #fff; - border: 2px solid #f0f0f0; - border-radius: 50%; - cursor: pointer; -} -.ant-slider-dot:first-child { - margin-left: -4px; -} -.ant-slider-dot:last-child { - margin-left: -4px; -} -.ant-slider-dot-active { - border-color: #8cc8ff; -} -.ant-slider-disabled { - cursor: not-allowed; -} -.ant-slider-disabled .ant-slider-track { - background-color: rgba(0, 0, 0, 0.25) !important; -} -.ant-slider-disabled .ant-slider-handle, -.ant-slider-disabled .ant-slider-dot { - background-color: #fff; - border-color: rgba(0, 0, 0, 0.25) !important; - -webkit-box-shadow: none; - box-shadow: none; - cursor: not-allowed; -} -.ant-slider-disabled .ant-slider-mark-text, -.ant-slider-disabled .ant-slider-dot { - cursor: not-allowed !important; -} -.ant-slider-rtl { - direction: rtl; -} -.ant-slider-rtl .ant-slider-mark { - right: 0; - left: auto; -} -.ant-slider-rtl .ant-slider-dot { - margin-right: -4px; - margin-left: 0; -} -.ant-slider-rtl .ant-slider-dot:first-child { - margin-right: -4px; - margin-left: 0; -} -.ant-slider-rtl .ant-slider-dot:last-child { - margin-right: -4px; - margin-left: 0; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-space { - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; -} -.ant-space-vertical { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; -} -.ant-space-align-center { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} -.ant-space-align-start { - -webkit-box-align: start; - -ms-flex-align: start; - align-items: flex-start; -} -.ant-space-align-end { - -webkit-box-align: end; - -ms-flex-align: end; - align-items: flex-end; -} -.ant-space-align-baseline { - -webkit-box-align: baseline; - -ms-flex-align: baseline; - align-items: baseline; -} -.ant-space-rtl { - direction: rtl; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-statistic { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; -} -.ant-statistic-title { - margin-bottom: 4px; - color: rgba(0, 0, 0, 0.45); - font-size: 14px; -} -.ant-statistic-content { - color: rgba(0, 0, 0, 0.85); - font-size: 24px; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; -} -.ant-statistic-content-value { - display: inline-block; - direction: ltr; -} -.ant-statistic-content-value-decimal { - font-size: 16px; -} -.ant-statistic-content-prefix, -.ant-statistic-content-suffix { - display: inline-block; -} -.ant-statistic-content-prefix { - margin-right: 4px; -} -.ant-statistic-content-suffix { - margin-left: 4px; - font-size: 16px; -} -.ant-statistic-rtl { - direction: rtl; -} -.ant-statistic-rtl .ant-statistic-content-prefix { - margin-right: 0; - margin-left: 4px; -} -.ant-statistic-rtl .ant-statistic-content-suffix { - margin-right: 4px; - margin-left: 0; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-steps { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - width: 100%; - font-size: 0; - text-align: initial; -} -.ant-steps-item { - position: relative; - display: inline-block; - -webkit-box-flex: 1; - -ms-flex: 1; - flex: 1; - overflow: hidden; - vertical-align: top; -} -.ant-steps-item-container { - outline: none; -} -.ant-steps-item:last-child { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; -} -.ant-steps-item:last-child > .ant-steps-item-container > .ant-steps-item-tail, -.ant-steps-item:last-child > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after { - display: none; -} -.ant-steps-item-icon, -.ant-steps-item-content { - display: inline-block; - vertical-align: top; -} -.ant-steps-item-icon { - width: 32px; - height: 32px; - margin: 0 8px 0 0; - font-size: 16px; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; - line-height: 32px; - text-align: center; - border: 1px solid rgba(0, 0, 0, 0.25); - border-radius: 32px; - -webkit-transition: background-color 0.3s, border-color 0.3s; - transition: background-color 0.3s, border-color 0.3s; -} -.ant-steps-item-icon > .ant-steps-icon { - position: relative; - top: -1px; - color: #1890ff; - line-height: 1; -} -.ant-steps-item-tail { - position: absolute; - top: 12px; - left: 0; - width: 100%; - padding: 0 10px; -} -.ant-steps-item-tail::after { - display: inline-block; - width: 100%; - height: 1px; - background: #f0f0f0; - border-radius: 1px; - -webkit-transition: background 0.3s; - transition: background 0.3s; - content: ''; -} -.ant-steps-item-title { - position: relative; - display: inline-block; - padding-right: 16px; - color: rgba(0, 0, 0, 0.65); - font-size: 16px; - line-height: 32px; -} -.ant-steps-item-title::after { - position: absolute; - top: 16px; - left: 100%; - display: block; - width: 9999px; - height: 1px; - background: #f0f0f0; - content: ''; -} -.ant-steps-item-subtitle { - display: inline; - margin-left: 8px; - color: rgba(0, 0, 0, 0.45); - font-weight: normal; - font-size: 14px; -} -.ant-steps-item-description { - color: rgba(0, 0, 0, 0.45); - font-size: 14px; -} -.ant-steps-item-wait .ant-steps-item-icon { - background-color: #fff; - border-color: rgba(0, 0, 0, 0.25); -} -.ant-steps-item-wait .ant-steps-item-icon > .ant-steps-icon { - color: rgba(0, 0, 0, 0.25); -} -.ant-steps-item-wait .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot { - background: rgba(0, 0, 0, 0.25); -} -.ant-steps-item-wait > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title { - color: rgba(0, 0, 0, 0.45); -} -.ant-steps-item-wait > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after { - background-color: #f0f0f0; -} -.ant-steps-item-wait > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-description { - color: rgba(0, 0, 0, 0.45); -} -.ant-steps-item-wait > .ant-steps-item-container > .ant-steps-item-tail::after { - background-color: #f0f0f0; -} -.ant-steps-item-process .ant-steps-item-icon { - background-color: #fff; - border-color: #1890ff; -} -.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon { - color: #1890ff; -} -.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot { - background: #1890ff; -} -.ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title { - color: rgba(0, 0, 0, 0.85); -} -.ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after { - background-color: #f0f0f0; -} -.ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-description { - color: rgba(0, 0, 0, 0.65); -} -.ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-tail::after { - background-color: #f0f0f0; -} -.ant-steps-item-process .ant-steps-item-icon { - background: #1890ff; -} -.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon { - color: #fff; -} -.ant-steps-item-process .ant-steps-item-title { - font-weight: 500; -} -.ant-steps-item-finish .ant-steps-item-icon { - background-color: #fff; - border-color: #1890ff; -} -.ant-steps-item-finish .ant-steps-item-icon > .ant-steps-icon { - color: #1890ff; -} -.ant-steps-item-finish .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot { - background: #1890ff; -} -.ant-steps-item-finish > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title { - color: rgba(0, 0, 0, 0.65); -} -.ant-steps-item-finish > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after { - background-color: #1890ff; -} -.ant-steps-item-finish > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-description { - color: rgba(0, 0, 0, 0.45); -} -.ant-steps-item-finish > .ant-steps-item-container > .ant-steps-item-tail::after { - background-color: #1890ff; -} -.ant-steps-item-error .ant-steps-item-icon { - background-color: #fff; - border-color: #ff4d4f; -} -.ant-steps-item-error .ant-steps-item-icon > .ant-steps-icon { - color: #ff4d4f; -} -.ant-steps-item-error .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot { - background: #ff4d4f; -} -.ant-steps-item-error > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title { - color: #ff4d4f; -} -.ant-steps-item-error > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after { - background-color: #f0f0f0; -} -.ant-steps-item-error > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-description { - color: #ff4d4f; -} -.ant-steps-item-error > .ant-steps-item-container > .ant-steps-item-tail::after { - background-color: #f0f0f0; -} -.ant-steps-item.ant-steps-next-error .ant-steps-item-title::after { - background: #ff4d4f; -} -.ant-steps-item-disabled { - cursor: not-allowed; -} -.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button'] { - cursor: pointer; -} -.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button'] .ant-steps-item-title, -.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button'] .ant-steps-item-subtitle, -.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button'] .ant-steps-item-description, -.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button'] .ant-steps-item-icon .ant-steps-icon { - -webkit-transition: color 0.3s; - transition: color 0.3s; -} -.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button']:hover .ant-steps-item-title, -.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button']:hover .ant-steps-item-subtitle, -.ant-steps .ant-steps-item:not(.ant-steps-item-active) > .ant-steps-item-container[role='button']:hover .ant-steps-item-description { - color: #1890ff; -} -.ant-steps .ant-steps-item:not(.ant-steps-item-active):not(.ant-steps-item-process) > .ant-steps-item-container[role='button']:hover .ant-steps-item-icon { - border-color: #1890ff; -} -.ant-steps .ant-steps-item:not(.ant-steps-item-active):not(.ant-steps-item-process) > .ant-steps-item-container[role='button']:hover .ant-steps-item-icon .ant-steps-icon { - color: #1890ff; -} -.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item { - margin-right: 16px; - white-space: nowrap; -} -.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child { - margin-right: 0; -} -.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child .ant-steps-item-title { - padding-right: 0; -} -.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-tail { - display: none; -} -.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-description { - max-width: 140px; - white-space: normal; -} -.ant-steps-item-custom .ant-steps-item-icon { - height: auto; - background: none; - border: 0; -} -.ant-steps-item-custom .ant-steps-item-icon > .ant-steps-icon { - top: 0px; - left: 0.5px; - width: 32px; - height: 32px; - font-size: 24px; - line-height: 32px; -} -.ant-steps-item-custom.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon { - color: #1890ff; -} -.ant-steps:not(.ant-steps-vertical) .ant-steps-item-custom .ant-steps-item-icon { - width: auto; - background: none; -} -.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item { - margin-right: 12px; -} -.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child { - margin-right: 0; -} -.ant-steps-small .ant-steps-item-icon { - width: 24px; - height: 24px; - margin: 0 8px 0 0; - font-size: 12px; - line-height: 24px; - text-align: center; - border-radius: 24px; -} -.ant-steps-small .ant-steps-item-title { - padding-right: 12px; - font-size: 14px; - line-height: 24px; -} -.ant-steps-small .ant-steps-item-title::after { - top: 12px; -} -.ant-steps-small .ant-steps-item-description { - color: rgba(0, 0, 0, 0.45); - font-size: 14px; -} -.ant-steps-small .ant-steps-item-tail { - top: 8px; -} -.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon { - width: inherit; - height: inherit; - line-height: inherit; - background: none; - border: 0; - border-radius: 0; -} -.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon > .ant-steps-icon { - font-size: 24px; - line-height: 24px; - -webkit-transform: none; - transform: none; -} -.ant-steps-vertical { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; -} -.ant-steps-vertical .ant-steps-item { - display: block; - -webkit-box-flex: 1; - -ms-flex: 1 0 auto; - flex: 1 0 auto; - overflow: visible; -} -.ant-steps-vertical .ant-steps-item-icon { - float: left; - margin-right: 16px; -} -.ant-steps-vertical .ant-steps-item-content { - display: block; - min-height: 48px; - overflow: hidden; -} -.ant-steps-vertical .ant-steps-item-title { - line-height: 32px; -} -.ant-steps-vertical .ant-steps-item-description { - padding-bottom: 12px; -} -.ant-steps-vertical > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail { - position: absolute; - top: 0; - left: 16px; - width: 1px; - height: 100%; - padding: 38px 0 6px; -} -.ant-steps-vertical > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail::after { - width: 1px; - height: 100%; -} -.ant-steps-vertical > .ant-steps-item:not(:last-child) > .ant-steps-item-container > .ant-steps-item-tail { - display: block; -} -.ant-steps-vertical > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after { - display: none; -} -.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-tail { - position: absolute; - top: 0; - left: 12px; - padding: 30px 0 6px; -} -.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-title { - line-height: 24px; -} -.ant-steps-rtl.ant-steps-vertical .ant-steps-item-icon { - float: right; - margin-right: 0; - margin-left: 16px; -} -.ant-steps-rtl.ant-steps-vertical > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail { - right: 16px; - left: auto; -} -.ant-steps-rtl.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-tail { - right: 12px; - left: auto; -} -@media (max-width: 480px) { - .ant-steps-horizontal.ant-steps-label-horizontal { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - } - .ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item { - display: block; - -webkit-box-flex: 1; - -ms-flex: 1 0 auto; - flex: 1 0 auto; - overflow: visible; - } - .ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-icon { - float: left; - margin-right: 16px; - } - .ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-content { - display: block; - min-height: 48px; - overflow: hidden; - } - .ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-title { - line-height: 32px; - } - .ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-description { - padding-bottom: 12px; - } - .ant-steps-horizontal.ant-steps-label-horizontal > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail { - position: absolute; - top: 0; - left: 16px; - width: 1px; - height: 100%; - padding: 38px 0 6px; - } - .ant-steps-horizontal.ant-steps-label-horizontal > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail::after { - width: 1px; - height: 100%; - } - .ant-steps-horizontal.ant-steps-label-horizontal > .ant-steps-item:not(:last-child) > .ant-steps-item-container > .ant-steps-item-tail { - display: block; - } - .ant-steps-horizontal.ant-steps-label-horizontal > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after { - display: none; - } - .ant-steps-horizontal.ant-steps-label-horizontal.ant-steps-small .ant-steps-item-container .ant-steps-item-tail { - position: absolute; - top: 0; - left: 12px; - padding: 30px 0 6px; - } - .ant-steps-horizontal.ant-steps-label-horizontal.ant-steps-small .ant-steps-item-container .ant-steps-item-title { - line-height: 24px; - } - .ant-steps-rtl.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-icon { - float: right; - margin-right: 0; - margin-left: 16px; - } - .ant-steps-rtl.ant-steps-horizontal.ant-steps-label-horizontal > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail { - right: 16px; - left: auto; - } - .ant-steps-rtl.ant-steps-horizontal.ant-steps-label-horizontal.ant-steps-small .ant-steps-item-container .ant-steps-item-tail { - right: 12px; - left: auto; - } -} -.ant-steps-label-vertical .ant-steps-item { - overflow: visible; -} -.ant-steps-label-vertical .ant-steps-item-tail { - margin-left: 58px; - padding: 3.5px 24px; -} -.ant-steps-label-vertical .ant-steps-item-content { - display: block; - width: 116px; - margin-top: 8px; - text-align: center; -} -.ant-steps-label-vertical .ant-steps-item-icon { - display: inline-block; - margin-left: 42px; -} -.ant-steps-label-vertical .ant-steps-item-title { - padding-right: 0; - padding-left: 0; -} -.ant-steps-label-vertical .ant-steps-item-title::after { - display: none; -} -.ant-steps-label-vertical .ant-steps-item-subtitle { - display: block; - margin-bottom: 4px; - margin-left: 0; - line-height: 1.5715; -} -.ant-steps-label-vertical.ant-steps-small:not(.ant-steps-dot) .ant-steps-item-icon { - margin-left: 46px; -} -.ant-steps-dot .ant-steps-item-title, -.ant-steps-dot.ant-steps-small .ant-steps-item-title { - line-height: 1.5715; -} -.ant-steps-dot .ant-steps-item-tail, -.ant-steps-dot.ant-steps-small .ant-steps-item-tail { - top: 2px; - width: 100%; - margin: 0 0 0 70px; - padding: 0; -} -.ant-steps-dot .ant-steps-item-tail::after, -.ant-steps-dot.ant-steps-small .ant-steps-item-tail::after { - width: calc(100% - 20px); - height: 3px; - margin-left: 12px; -} -.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot, -.ant-steps-dot.ant-steps-small .ant-steps-item:first-child .ant-steps-icon-dot { - left: 2px; -} -.ant-steps-dot .ant-steps-item-icon, -.ant-steps-dot.ant-steps-small .ant-steps-item-icon { - width: 8px; - height: 8px; - margin-left: 67px; - padding-right: 0; - line-height: 8px; - background: transparent; - border: 0; -} -.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot, -.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot { - position: relative; - float: left; - width: 100%; - height: 100%; - border-radius: 100px; - -webkit-transition: all 0.3s; - transition: all 0.3s; - /* expand hover area */ -} -.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot::after, -.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot::after { - position: absolute; - top: -12px; - left: -26px; - width: 60px; - height: 32px; - background: rgba(0, 0, 0, 0.001); - content: ''; -} -.ant-steps-dot .ant-steps-item-process .ant-steps-item-icon, -.ant-steps-dot.ant-steps-small .ant-steps-item-process .ant-steps-item-icon { - position: relative; - top: -1px; - width: 10px; - height: 10px; - line-height: 10px; -} -.ant-steps-vertical.ant-steps-dot .ant-steps-item-icon { - margin-top: 8px; - margin-left: 0; - background: none; -} -.ant-steps-vertical.ant-steps-dot .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail { - top: 2px; - left: -9px; - margin: 0; - padding: 22px 0 4px; -} -.ant-steps-vertical.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot { - left: 0; -} -.ant-steps-vertical.ant-steps-dot .ant-steps-item-process .ant-steps-icon-dot { - left: -2px; -} -.ant-steps-navigation { - padding-top: 12px; -} -.ant-steps-navigation.ant-steps-small .ant-steps-item-container { - margin-left: -12px; -} -.ant-steps-navigation .ant-steps-item { - overflow: visible; - text-align: center; -} -.ant-steps-navigation .ant-steps-item-container { - display: inline-block; - height: 100%; - margin-left: -16px; - padding-bottom: 12px; - text-align: left; - -webkit-transition: opacity 0.3s; - transition: opacity 0.3s; -} -.ant-steps-navigation .ant-steps-item-container .ant-steps-item-content { - max-width: auto; -} -.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title { - max-width: 100%; - padding-right: 0; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} -.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title::after { - display: none; -} -.ant-steps-navigation .ant-steps-item:not(.ant-steps-item-active) .ant-steps-item-container[role='button'] { - cursor: pointer; -} -.ant-steps-navigation .ant-steps-item:not(.ant-steps-item-active) .ant-steps-item-container[role='button']:hover { - opacity: 0.85; -} -.ant-steps-navigation .ant-steps-item:last-child { - -webkit-box-flex: 1; - -ms-flex: 1; - flex: 1; -} -.ant-steps-navigation .ant-steps-item:last-child::after { - display: none; -} -.ant-steps-navigation .ant-steps-item::after { - position: absolute; - top: 50%; - left: 100%; - display: inline-block; - width: 12px; - height: 12px; - margin-top: -14px; - margin-left: -2px; - border: 1px solid rgba(0, 0, 0, 0.25); - border-bottom: none; - border-left: none; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - content: ''; -} -.ant-steps-navigation .ant-steps-item::before { - position: absolute; - bottom: 0; - left: 50%; - display: inline-block; - width: 0; - height: 2px; - background-color: #1890ff; - -webkit-transition: width 0.3s, left 0.3s; - transition: width 0.3s, left 0.3s; - -webkit-transition-timing-function: ease-out; - transition-timing-function: ease-out; - content: ''; -} -.ant-steps-navigation .ant-steps-item.ant-steps-item-active::before { - left: 0; - width: 100%; -} -@media (max-width: 480px) { - .ant-steps-navigation > .ant-steps-item { - margin-right: 0 !important; - } - .ant-steps-navigation > .ant-steps-item::before { - display: none; - } - .ant-steps-navigation > .ant-steps-item.ant-steps-item-active::before { - top: 0; - right: 0; - left: unset; - display: block; - width: 3px; - height: calc(100% - 24px); - } - .ant-steps-navigation > .ant-steps-item::after { - position: relative; - top: -2px; - left: 50%; - display: block; - width: 8px; - height: 8px; - margin-bottom: 8px; - text-align: center; - -webkit-transform: rotate(135deg); - transform: rotate(135deg); - } - .ant-steps-navigation > .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail { - visibility: hidden; - } -} -.ant-steps-rtl { - direction: rtl; -} -.ant-steps.ant-steps-rtl .ant-steps-item-icon { - margin-right: 0; - margin-left: 8px; -} -.ant-steps-rtl .ant-steps-item-tail { - right: 0; - left: auto; -} -.ant-steps-rtl .ant-steps-item-title { - padding-right: 0; - padding-left: 16px; -} -.ant-steps-rtl .ant-steps-item-title::after { - right: 100%; - left: auto; -} -.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item { - margin-right: 0; - margin-left: 16px; -} -.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child { - margin-left: 0; -} -.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child .ant-steps-item-title { - padding-left: 0; -} -.ant-steps-rtl .ant-steps-item-custom .ant-steps-item-icon > .ant-steps-icon { - right: 0.5px; - left: auto; -} -.ant-steps-rtl.ant-steps-navigation.ant-steps-small .ant-steps-item-container { - margin-right: -12px; - margin-left: 0; -} -.ant-steps-rtl.ant-steps-navigation .ant-steps-item-container { - margin-right: -16px; - margin-left: 0; - text-align: right; -} -.ant-steps-rtl.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title { - padding-left: 0; -} -.ant-steps-rtl.ant-steps-navigation .ant-steps-item::after { - right: 100%; - left: auto; - margin-right: -2px; - margin-left: 0; - -webkit-transform: rotate(225deg); - transform: rotate(225deg); -} -.ant-steps-rtl.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item { - margin-right: 0; - margin-left: 12px; -} -.ant-steps-rtl.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child { - margin-left: 0; -} -.ant-steps-rtl.ant-steps-small .ant-steps-item-title { - padding-right: 0; - padding-left: 12px; -} -.ant-steps-rtl.ant-steps-label-vertical .ant-steps-item-title { - padding-left: 0; -} -.ant-steps-rtl.ant-steps-dot .ant-steps-item-tail, -.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-tail { - margin: 0 70px 0 0; -} -.ant-steps-rtl.ant-steps-dot .ant-steps-item-tail::after, -.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-tail::after { - margin-right: 12px; - margin-left: 0; -} -.ant-steps-rtl.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot, -.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item:first-child .ant-steps-icon-dot { - right: 2px; - left: auto; -} -.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon, -.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon { - margin-right: 67px; - margin-left: 0; -} -.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot, -.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot { - /* expand hover area */ -} -.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot, -.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot { - float: right; -} -.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot::after, -.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot::after { - right: -26px; - left: auto; -} -.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item-icon { - margin-right: 0; - margin-left: 16px; -} -.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item > .ant-steps-item-container > .ant-steps-item-tail { - right: -9px; - left: auto; -} -.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot { - right: 0; - left: auto; -} -.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item-process .ant-steps-icon-dot { - right: -2px; - left: auto; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-switch { - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - display: inline-block; - -webkit-box-sizing: border-box; - box-sizing: border-box; - min-width: 44px; - height: 22px; - line-height: 22px; - vertical-align: middle; - background-color: rgba(0, 0, 0, 0.25); - border: 0; - border-radius: 100px; - cursor: pointer; - -webkit-transition: all 0.2s; - transition: all 0.2s; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.ant-switch:focus { - outline: 0; - -webkit-box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.1); - box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.1); -} -.ant-switch-checked:focus { - -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); - box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); -} -.ant-switch:focus:hover { - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-switch-checked { - background-color: #1890ff; -} -.ant-switch-loading, -.ant-switch-disabled { - cursor: not-allowed; - opacity: 0.4; -} -.ant-switch-loading *, -.ant-switch-disabled * { - -webkit-box-shadow: none; - box-shadow: none; - cursor: not-allowed; -} -.ant-switch-inner { - display: block; - margin: 0 7px 0 25px; - color: #fff; - font-size: 12px; - -webkit-transition: margin 0.2s; - transition: margin 0.2s; -} -.ant-switch-checked .ant-switch-inner { - margin: 0 25px 0 7px; -} -.ant-switch-handle { - position: absolute; - top: 2px; - left: 2px; - width: 18px; - height: 18px; - -webkit-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} -.ant-switch-handle::before { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background-color: #fff; - border-radius: 9px; - -webkit-box-shadow: 0 2px 4px 0 rgba(0, 35, 11, 0.2); - box-shadow: 0 2px 4px 0 rgba(0, 35, 11, 0.2); - -webkit-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; - content: ''; -} -.ant-switch-checked .ant-switch-handle { - left: calc(100% - 18px - 2px); -} -.ant-switch:not(.ant-switch-disabled):active .ant-switch-handle::before { - right: -30%; - left: 0; -} -.ant-switch:not(.ant-switch-disabled):active.ant-switch-checked .ant-switch-handle::before { - right: 0; - left: -30%; -} -.ant-switch-loading-icon { - position: absolute; - top: 50%; - left: 50%; - color: rgba(0, 0, 0, 0.65); - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); -} -.ant-switch-checked .ant-switch-loading-icon { - color: #1890ff; -} -.ant-switch-small { - min-width: 28px; - height: 16px; - line-height: 16px; -} -.ant-switch-small .ant-switch-inner { - margin: 0 5px 0 18px; - font-size: 12px; -} -.ant-switch-small .ant-switch-handle { - width: 12px; - height: 12px; -} -.ant-switch-small .ant-switch-loading-icon { - -webkit-transform: translate(-50%, -50%) scale(0.66667); - transform: translate(-50%, -50%) scale(0.66667); -} -.ant-switch-small.ant-switch-checked .ant-switch-inner { - margin: 0 18px 0 5px; -} -.ant-switch-small.ant-switch-checked .ant-switch-handle { - left: calc(100% - 12px - 2px); -} -.ant-switch-rtl { - direction: rtl; -} -.ant-switch-rtl .ant-switch-inner { - margin: 0 25px 0 7px; -} -.ant-switch-rtl .ant-switch-handle { - right: 2px; - left: auto; -} -.ant-switch-rtl:not(.ant-switch-rtl-disabled):active .ant-switch-handle::before { - right: 0; - left: -30%; -} -.ant-switch-rtl:not(.ant-switch-rtl-disabled):active.ant-switch-checked .ant-switch-handle::before { - right: -30%; - left: 0; -} -.ant-switch-rtl.ant-switch-checked .ant-switch-inner { - margin: 0 7px 0 25px; -} -.ant-switch-rtl.ant-switch-checked .ant-switch-handle { - right: calc(100% - 18px - 2px); -} -.ant-switch-rtl.ant-switch-small.ant-switch-checked .ant-switch-handle { - right: calc(100% - 12px - 2px); -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-table.ant-table-middle { - font-size: 14px; -} -.ant-table.ant-table-middle .ant-table-title, -.ant-table.ant-table-middle .ant-table-footer, -.ant-table.ant-table-middle .ant-table-thead > tr > th, -.ant-table.ant-table-middle .ant-table-tbody > tr > td, -.ant-table.ant-table-middle tfoot > tr > th, -.ant-table.ant-table-middle tfoot > tr > td { - padding: 12px 8px; -} -.ant-table.ant-table-middle .ant-table-thead th.ant-table-column-has-sorters { - padding: 0; -} -.ant-table.ant-table-middle .ant-table-thead .ant-table-filter-column { - margin: -12px -8px; -} -.ant-table.ant-table-middle .ant-table-thead .ant-table-filter-column-title { - padding: 12px 2.3em 12px 8px; -} -.ant-table.ant-table-middle .ant-table-thead .ant-table-column-sorters { - padding: 12px 8px; -} -.ant-table.ant-table-middle .ant-table-expanded-row-fixed { - margin: -12px -8px; -} -.ant-table.ant-table-middle .ant-table-tbody .ant-table-wrapper:only-child .ant-table { - margin: -12px -8px -12px 25px; -} -.ant-table.ant-table-small { - font-size: 14px; -} -.ant-table.ant-table-small .ant-table-title, -.ant-table.ant-table-small .ant-table-footer, -.ant-table.ant-table-small .ant-table-thead > tr > th, -.ant-table.ant-table-small .ant-table-tbody > tr > td, -.ant-table.ant-table-small tfoot > tr > th, -.ant-table.ant-table-small tfoot > tr > td { - padding: 8px 8px; -} -.ant-table.ant-table-small .ant-table-thead th.ant-table-column-has-sorters { - padding: 0; -} -.ant-table.ant-table-small .ant-table-thead .ant-table-filter-column { - margin: -8px -8px; -} -.ant-table.ant-table-small .ant-table-thead .ant-table-filter-column-title { - padding: 8px 2.3em 8px 8px; -} -.ant-table.ant-table-small .ant-table-thead .ant-table-column-sorters { - padding: 8px 8px; -} -.ant-table.ant-table-small .ant-table-expanded-row-fixed { - margin: -8px -8px; -} -.ant-table.ant-table-small .ant-table-tbody .ant-table-wrapper:only-child .ant-table { - margin: -8px -8px -8px 25px; -} -.ant-table-small .ant-table-thead > tr > th { - background-color: #fafafa; -} -.ant-table-small .ant-table-selection-column { - width: 46px; - min-width: 46px; -} -.ant-table.ant-table-bordered > .ant-table-title { - border: 1px solid #f0f0f0; - border-bottom: 0; -} -.ant-table.ant-table-bordered > .ant-table-container { - border: 1px solid #f0f0f0; - border-right: 0; - border-bottom: 0; -} -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > thead > tr > th, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > thead > tr > th, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > thead > tr > th, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tbody > tr > td, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tbody > tr > td, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tbody > tr > td, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tfoot > tr > th, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tfoot > tr > th, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tfoot > tr > th, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tfoot > tr > td, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tfoot > tr > td, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tfoot > tr > td { - border-right: 1px solid #f0f0f0; -} -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > thead > tr:not(:last-child) > th, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > thead > tr:not(:last-child) > th, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > thead > tr:not(:last-child) > th { - border-bottom: 1px solid #f0f0f0; -} -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > thead > tr > .ant-table-cell-fix-right-first::after, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > thead > tr > .ant-table-cell-fix-right-first::after, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > thead > tr > .ant-table-cell-fix-right-first::after, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tbody > tr > .ant-table-cell-fix-right-first::after, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tbody > tr > .ant-table-cell-fix-right-first::after, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tbody > tr > .ant-table-cell-fix-right-first::after, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tfoot > tr > .ant-table-cell-fix-right-first::after, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tfoot > tr > .ant-table-cell-fix-right-first::after, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tfoot > tr > .ant-table-cell-fix-right-first::after { - border-right: 1px solid #f0f0f0; -} -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tbody > tr > td > .ant-table-expanded-row-fixed, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tbody > tr > td > .ant-table-expanded-row-fixed, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tbody > tr > td > .ant-table-expanded-row-fixed { - margin: -16px -17px; -} -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table > tbody > tr > td > .ant-table-expanded-row-fixed::after, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table > tbody > tr > td > .ant-table-expanded-row-fixed::after, -.ant-table.ant-table-bordered > .ant-table-container > .ant-table-body > table > tbody > tr > td > .ant-table-expanded-row-fixed::after { - position: absolute; - top: 0; - right: 1px; - bottom: 0; - border-right: 1px solid #f0f0f0; - content: ''; -} -.ant-table.ant-table-bordered.ant-table-scroll-horizontal > .ant-table-container > .ant-table-body > table > tbody > tr.ant-table-expanded-row > td, -.ant-table.ant-table-bordered.ant-table-scroll-horizontal > .ant-table-container > .ant-table-body > table > tbody > tr.ant-table-placeholder > td { - border-right: 0; -} -.ant-table.ant-table-bordered.ant-table-middle > .ant-table-container > .ant-table-content > table > tbody > tr > td > .ant-table-expanded-row-fixed, -.ant-table.ant-table-bordered.ant-table-middle > .ant-table-container > .ant-table-body > table > tbody > tr > td > .ant-table-expanded-row-fixed { - margin: -12px -9px; -} -.ant-table.ant-table-bordered.ant-table-small > .ant-table-container > .ant-table-content > table > tbody > tr > td > .ant-table-expanded-row-fixed, -.ant-table.ant-table-bordered.ant-table-small > .ant-table-container > .ant-table-body > table > tbody > tr > td > .ant-table-expanded-row-fixed { - margin: -8px -9px; -} -.ant-table.ant-table-bordered > .ant-table-footer { - border: 1px solid #f0f0f0; - border-top: 0; -} -.ant-table-cell .ant-table-container:first-child { - border-top: 0; -} -.ant-table-cell-scrollbar { - -webkit-box-shadow: 0 1px 0 1px #fafafa; - box-shadow: 0 1px 0 1px #fafafa; -} -.ant-table-wrapper { - max-width: 100%; -} -.ant-table-wrapper::before { - display: table; - content: ''; -} -.ant-table-wrapper::after { - display: table; - clear: both; - content: ''; -} -.ant-table { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - z-index: 0; - clear: both; - font-size: 14px; - background: #fff; - border-radius: 2px; -} -.ant-table table { - width: 100%; - text-align: left; - border-radius: 2px 2px 0 0; - border-collapse: separate; - border-spacing: 0; -} -.ant-table-thead > tr > th, -.ant-table-tbody > tr > td, -.ant-table tfoot > tr > th, -.ant-table tfoot > tr > td { - position: relative; - padding: 16px 16px; - overflow-wrap: break-word; -} -.ant-table-cell-ellipsis { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - word-break: keep-all; -} -.ant-table-cell-ellipsis.ant-table-cell-fix-left-last, -.ant-table-cell-ellipsis.ant-table-cell-fix-right-first { - overflow: visible; -} -.ant-table-cell-ellipsis.ant-table-cell-fix-left-last .ant-table-cell-content, -.ant-table-cell-ellipsis.ant-table-cell-fix-right-first .ant-table-cell-content { - display: block; - overflow: hidden; - text-overflow: ellipsis; -} -.ant-table-title { - padding: 16px 16px; -} -.ant-table-footer { - padding: 16px 16px; - color: rgba(0, 0, 0, 0.85); - background: #fafafa; -} -.ant-table-thead > tr > th { - color: rgba(0, 0, 0, 0.85); - font-weight: 500; - text-align: left; - background: #fafafa; - border-bottom: 1px solid #f0f0f0; - -webkit-transition: background 0.3s ease; - transition: background 0.3s ease; -} -.ant-table-thead > tr > th[colspan]:not([colspan='1']) { - text-align: center; -} -.ant-table-thead > tr:not(:last-child) > th[colspan] { - border-bottom: 0; -} -.ant-table-tbody > tr > td { - border-bottom: 1px solid #f0f0f0; - -webkit-transition: background 0.3s; - transition: background 0.3s; -} -.ant-table-tbody > tr.ant-table-row:hover > td { - background: #fafafa; -} -.ant-table-tbody > tr.ant-table-row-selected > td { - background: #e6f7ff; - border-color: rgba(0, 0, 0, 0.03); -} -.ant-table-tbody > tr.ant-table-row-selected:hover > td { - background: #dcf4ff; -} -.ant-table-tbody > tr .ant-table-wrapper:only-child .ant-table { - margin: -16px -16px -16px 33px; -} -.ant-table-tbody > tr .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td { - border-bottom: 0; -} -.ant-table-tbody > tr .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td:first-child, -.ant-table-tbody > tr .ant-table-wrapper:only-child .ant-table-tbody > tr:last-child > td:last-child { - border-radius: 0; -} -.ant-table tfoot > tr > th, -.ant-table tfoot > tr > td { - border-bottom: 1px solid #f0f0f0; -} -.ant-table-pagination.ant-pagination { - margin: 16px 0; -} -.ant-table-pagination-left { - float: left; -} -.ant-table-pagination-center { - text-align: center; -} -.ant-table-pagination-right { - float: right; -} -.ant-table-thead th.ant-table-column-has-sorters { - padding: 0; - cursor: pointer; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-table-thead th.ant-table-column-has-sorters:hover { - background: #f2f2f2; -} -.ant-table-thead th.ant-table-column-has-sorters:hover .ant-table-filter-trigger-container { - background: #f7f7f7; -} -.ant-table-thead th.ant-table-column-sort { - background: #f5f5f5; -} -td.ant-table-column-sort { - background: #fafafa; -} -.ant-table-column-sorters-with-tooltip { - display: inline-block; - width: 100%; -} -.ant-table-column-sorters { - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - padding: 16px 16px; -} -.ant-table-column-sorter { - margin-top: 0.15em; - margin-bottom: -0.15em; - margin-left: 8px; - color: #bfbfbf; -} -.ant-table-column-sorter-full { - margin-top: -0.2em; - margin-bottom: 0; -} -.ant-table-column-sorter-inner { - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} -.ant-table-column-sorter-up, -.ant-table-column-sorter-down { - display: inline-block; - font-size: 11px; -} -.ant-table-column-sorter-up.active, -.ant-table-column-sorter-down.active { - color: #1890ff; -} -.ant-table-column-sorter-up + .ant-table-column-sorter-down { - margin-top: -0.3em; -} -.ant-table-filter-column { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - margin: -16px -16px; -} -.ant-table-filter-column-title { - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; - padding: 16px 2.3em 16px 16px; -} -.ant-table-thead tr th.ant-table-column-has-sorters .ant-table-filter-column { - margin: 0; -} -.ant-table-thead tr th.ant-table-column-has-sorters .ant-table-filter-column-title { - padding: 0 2.3em 0 0; -} -.ant-table-filter-trigger-container { - position: absolute; - top: 0; - right: 0; - bottom: 0; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; - -ms-flex-item-align: stretch; - align-self: stretch; - cursor: pointer; - -webkit-transition: background-color 0.3s; - transition: background-color 0.3s; -} -.ant-table-filter-trigger-container-open, -.ant-table-filter-trigger-container:hover, -.ant-table-thead th.ant-table-column-has-sorters:hover .ant-table-filter-trigger-container:hover { - background: #e5e5e5; -} -.ant-table-filter-trigger { - display: block; - width: 2.3em; - color: #bfbfbf; - font-size: 12px; - -webkit-transition: color 0.3s; - transition: color 0.3s; -} -.ant-table-filter-trigger .anticon { - position: absolute; - top: 50%; - left: 50%; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); -} -.ant-table-filter-trigger-container-open .ant-table-filter-trigger, -.ant-table-filter-trigger:hover { - color: rgba(0, 0, 0, 0.45); -} -.ant-table-filter-trigger.active { - color: #1890ff; -} -.ant-table-filter-dropdown { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - min-width: 120px; - background-color: #fff; - border-radius: 2px; - -webkit-box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); - box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); -} -.ant-table-filter-dropdown .ant-dropdown-menu { - max-height: 264px; - overflow-x: hidden; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; -} -.ant-table-filter-dropdown-submenu > ul { - max-height: calc(100vh - 130px); - overflow-x: hidden; - overflow-y: auto; -} -.ant-table-filter-dropdown .ant-checkbox-wrapper + span, -.ant-table-filter-dropdown-submenu .ant-checkbox-wrapper + span { - padding-left: 8px; -} -.ant-table-filter-dropdown-btns { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; - padding: 7px 8px 7px 3px; - overflow: hidden; - background-color: inherit; - border-top: 1px solid #f0f0f0; -} -.ant-table .ant-table-selection-col { - width: 60px; -} -table tr th.ant-table-selection-column, -table tr td.ant-table-selection-column { - padding-right: 8px; - padding-left: 8px; - text-align: center; -} -table tr th.ant-table-selection-column .ant-radio-wrapper, -table tr td.ant-table-selection-column .ant-radio-wrapper { - margin-right: 0; -} -.ant-table-selection { - position: relative; -} -.ant-table-selection-extra { - position: absolute; - top: 0; - right: 0; - cursor: pointer; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-table-selection-extra .anticon { - display: inline-block; - font-size: 10px; - color: #bfbfbf; -} -.ant-table-selection-extra .anticon:hover { - color: #a6a6a6; -} -.ant-table-expand-icon-col { - width: 48px; -} -.ant-table-row-expand-icon-cell { - text-align: center; -} -.ant-table-row-indent { - float: left; - height: 1px; -} -.ant-table-row-expand-icon { - color: #1890ff; - text-decoration: none; - cursor: pointer; - -webkit-transition: color 0.3s; - transition: color 0.3s; - position: relative; - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - float: left; - -webkit-box-sizing: border-box; - box-sizing: border-box; - width: 17px; - height: 17px; - padding: 0; - color: inherit; - line-height: 12px; - vertical-align: -2px; - background: #fff; - border: 1px solid #f0f0f0; - border-radius: 2px; - outline: none; - -webkit-transition: all 0.3s; - transition: all 0.3s; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.ant-table-row-expand-icon:focus, -.ant-table-row-expand-icon:hover { - color: #40a9ff; -} -.ant-table-row-expand-icon:active { - color: #096dd9; -} -.ant-table-row-expand-icon:focus, -.ant-table-row-expand-icon:hover, -.ant-table-row-expand-icon:active { - border-color: currentColor; -} -.ant-table-row-expand-icon::before, -.ant-table-row-expand-icon::after { - position: absolute; - background: currentColor; - -webkit-transition: -webkit-transform 0.3s ease-out; - transition: -webkit-transform 0.3s ease-out; - transition: transform 0.3s ease-out; - transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out; - content: ''; -} -.ant-table-row-expand-icon::before { - top: 7px; - right: 3px; - left: 3px; - height: 1px; -} -.ant-table-row-expand-icon::after { - top: 3px; - bottom: 3px; - left: 7px; - width: 1px; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); -} -.ant-table-row-expand-icon-collapsed::before { - -webkit-transform: rotate(-180deg); - transform: rotate(-180deg); -} -.ant-table-row-expand-icon-collapsed::after { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); -} -.ant-table-row-expand-icon-spaced { - background: transparent; - border: 0; - visibility: hidden; -} -.ant-table-row-expand-icon-spaced::before, -.ant-table-row-expand-icon-spaced::after { - display: none; - content: none; -} -.ant-table-row-indent + .ant-table-row-expand-icon { - margin-top: 2.5005px; - margin-right: 8px; -} -tr.ant-table-expanded-row > td, -tr.ant-table-expanded-row:hover > td { - background: #fbfbfb; -} -tr.ant-table-expanded-row .ant-descriptions-view table { - width: auto; -} -.ant-table .ant-table-expanded-row-fixed { - position: relative; - margin: -16px -16px; - padding: 16px 16px; -} -.ant-table-tbody > tr.ant-table-placeholder { - text-align: center; -} -.ant-table-empty .ant-table-tbody > tr.ant-table-placeholder { - color: rgba(0, 0, 0, 0.25); -} -.ant-table-tbody > tr.ant-table-placeholder:hover > td { - background: #fff; -} -.ant-table-cell-fix-left, -.ant-table-cell-fix-right { - position: -webkit-sticky !important; - position: sticky !important; - z-index: 2; - background: #fff; -} -.ant-table-cell-fix-left-first::after, -.ant-table-cell-fix-left-last::after { - position: absolute; - top: 0; - right: 0; - bottom: -1px; - width: 30px; - -webkit-transform: translateX(100%); - transform: translateX(100%); - -webkit-transition: -webkit-box-shadow 0.3s; - transition: -webkit-box-shadow 0.3s; - transition: box-shadow 0.3s; - transition: box-shadow 0.3s, -webkit-box-shadow 0.3s; - content: ''; - pointer-events: none; -} -.ant-table-cell-fix-right-first::after, -.ant-table-cell-fix-right-last::after { - position: absolute; - top: 0; - bottom: -1px; - left: 0; - width: 30px; - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - -webkit-transition: -webkit-box-shadow 0.3s; - transition: -webkit-box-shadow 0.3s; - transition: box-shadow 0.3s; - transition: box-shadow 0.3s, -webkit-box-shadow 0.3s; - content: ''; - pointer-events: none; -} -.ant-table .ant-table-container::before, -.ant-table .ant-table-container::after { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - width: 30px; - -webkit-transition: -webkit-box-shadow 0.3s; - transition: -webkit-box-shadow 0.3s; - transition: box-shadow 0.3s; - transition: box-shadow 0.3s, -webkit-box-shadow 0.3s; - content: ''; - pointer-events: none; -} -.ant-table .ant-table-container::before { - left: 0; -} -.ant-table .ant-table-container::after { - right: 0; -} -.ant-table-ping-left:not(.ant-table-has-fix-left) .ant-table-container { - position: relative; -} -.ant-table-ping-left:not(.ant-table-has-fix-left) .ant-table-container::before { - -webkit-box-shadow: inset 10px 0 8px -8px rgba(0, 0, 0, 0.15); - box-shadow: inset 10px 0 8px -8px rgba(0, 0, 0, 0.15); -} -.ant-table-ping-left .ant-table-cell-fix-left-first::after, -.ant-table-ping-left .ant-table-cell-fix-left-last::after { - -webkit-box-shadow: inset 10px 0 8px -8px rgba(0, 0, 0, 0.15); - box-shadow: inset 10px 0 8px -8px rgba(0, 0, 0, 0.15); -} -.ant-table-ping-right:not(.ant-table-has-fix-right) .ant-table-container { - position: relative; -} -.ant-table-ping-right:not(.ant-table-has-fix-right) .ant-table-container::after { - -webkit-box-shadow: inset -10px 0 8px -8px rgba(0, 0, 0, 0.15); - box-shadow: inset -10px 0 8px -8px rgba(0, 0, 0, 0.15); -} -.ant-table-ping-right .ant-table-cell-fix-right-first::after, -.ant-table-ping-right .ant-table-cell-fix-right-last::after { - -webkit-box-shadow: inset -10px 0 8px -8px rgba(0, 0, 0, 0.15); - box-shadow: inset -10px 0 8px -8px rgba(0, 0, 0, 0.15); -} -@media all and (-ms-high-contrast: none) { - .ant-table-ping-left .ant-table-cell-fix-left-last::after { - -webkit-box-shadow: none !important; - box-shadow: none !important; - } - .ant-table-ping-right .ant-table-cell-fix-right-first::after { - -webkit-box-shadow: none !important; - box-shadow: none !important; - } -} -.ant-table { - /* title + table */ - /* table */ - /* table + footer */ -} -.ant-table-title { - border-radius: 2px 2px 0 0; -} -.ant-table-title + .ant-table-container { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.ant-table-title + .ant-table-container table > thead > tr:first-child th:first-child { - border-radius: 0; -} -.ant-table-title + .ant-table-container table > thead > tr:first-child th:last-child { - border-radius: 0; -} -.ant-table-container { - border-top-left-radius: 2px; - border-top-right-radius: 2px; -} -.ant-table-container table > thead > tr:first-child th:first-child { - border-top-left-radius: 2px; -} -.ant-table-container table > thead > tr:first-child th:last-child { - border-top-right-radius: 2px; -} -.ant-table-footer { - border-radius: 0 0 2px 2px; -} -.ant-table-wrapper-rtl { - direction: rtl; -} -.ant-table-rtl { - direction: rtl; -} -.ant-table-wrapper-rtl .ant-table table { - text-align: right; -} -.ant-table-wrapper-rtl .ant-table-thead > tr > th[colspan]:not([colspan='1']) { - text-align: center; -} -.ant-table-wrapper-rtl .ant-table-thead > tr > th { - text-align: right; -} -.ant-table-tbody > tr .ant-table-wrapper:only-child .ant-table-rtl { - margin: -16px 33px -16px -16px; -} -.ant-table-wrapper.ant-table-wrapper-rtl .ant-table-pagination { - float: left; -} -.ant-table-wrapper.ant-table-wrapper-rtl .ant-table-pagination-left { - float: left; -} -.ant-table-wrapper.ant-table-wrapper-rtl .ant-table-pagination-right { - float: right; -} -.ant-table-wrapper.ant-table-wrapper-rtl .ant-table-pagination-center { - float: initial; - text-align: center; -} -.ant-table-wrapper-rtl .ant-table-column-sorter { - margin-right: 8px; - margin-left: 0; -} -.ant-table-wrapper-rtl .ant-table-filter-column-title { - padding: 16px 16px 16px 2.3em; -} -.ant-table-rtl .ant-table-thead tr th.ant-table-column-has-sorters .ant-table-filter-column-title { - padding: 0 0 0 2.3em; -} -.ant-table-wrapper-rtl .ant-table-filter-trigger-container { - right: auto; - left: 0; -} -.ant-dropdown-rtl .ant-table-filter-dropdown .ant-checkbox-wrapper + span, -.ant-dropdown-rtl .ant-table-filter-dropdown-submenu .ant-checkbox-wrapper + span, -.ant-dropdown-menu-submenu-rtl.ant-table-filter-dropdown .ant-checkbox-wrapper + span, -.ant-dropdown-menu-submenu-rtl.ant-table-filter-dropdown-submenu .ant-checkbox-wrapper + span { - padding-right: 8px; - padding-left: 0; -} -.ant-table-wrapper-rtl .ant-table-selection { - text-align: center; -} -.ant-table-wrapper-rtl .ant-table-selection-extra { - right: auto; - left: 0; -} -.ant-table-wrapper-rtl .ant-table-row-indent { - float: right; -} -.ant-table-wrapper-rtl .ant-table-row-expand-icon { - float: right; -} -.ant-table-wrapper-rtl .ant-table-row-indent + .ant-table-row-expand-icon { - margin-right: 0; - margin-left: 8px; -} -.ant-table-wrapper-rtl .ant-table-row-expand-icon::after { - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg); -} -.ant-table-wrapper-rtl .ant-table-row-expand-icon-collapsed::before { - -webkit-transform: rotate(180deg); - transform: rotate(180deg); -} -.ant-table-wrapper-rtl .ant-table-row-expand-icon-collapsed::after { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-timeline { - -webkit-box-sizing: border-box; - box-sizing: border-box; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - margin: 0; - padding: 0; - list-style: none; -} -.ant-timeline-item { - position: relative; - margin: 0; - padding-bottom: 20px; - font-size: 14px; - list-style: none; -} -.ant-timeline-item-tail { - position: absolute; - top: 10px; - left: 4px; - height: calc(100% - 10px); - border-left: 2px solid #f0f0f0; -} -.ant-timeline-item-pending .ant-timeline-item-head { - font-size: 12px; - background-color: transparent; -} -.ant-timeline-item-pending .ant-timeline-item-tail { - display: none; -} -.ant-timeline-item-head { - position: absolute; - width: 10px; - height: 10px; - background-color: #fff; - border: 2px solid transparent; - border-radius: 100px; -} -.ant-timeline-item-head-blue { - color: #1890ff; - border-color: #1890ff; -} -.ant-timeline-item-head-red { - color: #ff4d4f; - border-color: #ff4d4f; -} -.ant-timeline-item-head-green { - color: #52c41a; - border-color: #52c41a; -} -.ant-timeline-item-head-gray { - color: rgba(0, 0, 0, 0.25); - border-color: rgba(0, 0, 0, 0.25); -} -.ant-timeline-item-head-custom { - position: absolute; - top: 5.5px; - left: 5px; - width: auto; - height: auto; - margin-top: 0; - padding: 3px 1px; - line-height: 1; - text-align: center; - border: 0; - border-radius: 0; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); -} -.ant-timeline-item-content { - position: relative; - top: -7.001px; - margin: 0 0 0 26px; - word-break: break-word; -} -.ant-timeline-item-last > .ant-timeline-item-tail { - display: none; -} -.ant-timeline-item-last > .ant-timeline-item-content { - min-height: 48px; -} -.ant-timeline.ant-timeline-alternate .ant-timeline-item-tail, -.ant-timeline.ant-timeline-right .ant-timeline-item-tail, -.ant-timeline.ant-timeline-label .ant-timeline-item-tail, -.ant-timeline.ant-timeline-alternate .ant-timeline-item-head, -.ant-timeline.ant-timeline-right .ant-timeline-item-head, -.ant-timeline.ant-timeline-label .ant-timeline-item-head, -.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom, -.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom, -.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom { - left: 50%; -} -.ant-timeline.ant-timeline-alternate .ant-timeline-item-head, -.ant-timeline.ant-timeline-right .ant-timeline-item-head, -.ant-timeline.ant-timeline-label .ant-timeline-item-head { - margin-left: -4px; -} -.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom, -.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom, -.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom { - margin-left: 1px; -} -.ant-timeline.ant-timeline-alternate .ant-timeline-item-left .ant-timeline-item-content, -.ant-timeline.ant-timeline-right .ant-timeline-item-left .ant-timeline-item-content, -.ant-timeline.ant-timeline-label .ant-timeline-item-left .ant-timeline-item-content { - left: calc(50% - 4px); - width: calc(50% - 14px); - text-align: left; -} -.ant-timeline.ant-timeline-alternate .ant-timeline-item-right .ant-timeline-item-content, -.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content, -.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-content { - width: calc(50% - 12px); - margin: 0; - text-align: right; -} -.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-tail, -.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head, -.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head-custom { - left: calc(100% - 4px - 2px); -} -.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content { - width: calc(100% - 18px); -} -.ant-timeline.ant-timeline-pending .ant-timeline-item-last .ant-timeline-item-tail { - display: block; - height: calc(100% - 14px); - border-left: 2px dotted #f0f0f0; -} -.ant-timeline.ant-timeline-reverse .ant-timeline-item-last .ant-timeline-item-tail { - display: none; -} -.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-tail { - top: 15px; - display: block; - height: calc(100% - 15px); - border-left: 2px dotted #f0f0f0; -} -.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-content { - min-height: 48px; -} -.ant-timeline.ant-timeline-label .ant-timeline-item-label { - position: absolute; - top: -7.001px; - width: calc(50% - 12px); - text-align: right; -} -.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-label { - left: calc(50% + 14px); - width: calc(50% - 14px); - text-align: left; -} -.ant-timeline-rtl { - direction: rtl; -} -.ant-timeline-rtl .ant-timeline-item-tail { - right: 4px; - left: auto; - border-right: 2px solid #f0f0f0; - border-left: none; -} -.ant-timeline-rtl .ant-timeline-item-head-custom { - right: 5px; - left: auto; - -webkit-transform: translate(50%, -50%); - transform: translate(50%, -50%); -} -.ant-timeline-rtl .ant-timeline-item-content { - margin: 0 18px 0 0; -} -.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-tail, -.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-tail, -.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-tail, -.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head, -.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head, -.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head, -.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom, -.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom, -.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom { - right: 50%; - left: auto; -} -.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head, -.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head, -.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head { - margin-right: -4px; - margin-left: 0; -} -.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom, -.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom, -.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom { - margin-right: 1px; - margin-left: 0; -} -.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-left .ant-timeline-item-content, -.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-left .ant-timeline-item-content, -.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-left .ant-timeline-item-content { - right: calc(50% - 4px); - left: auto; - text-align: right; -} -.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-right .ant-timeline-item-content, -.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content, -.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-content { - text-align: left; -} -.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-tail, -.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head, -.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head-custom { - right: 0; - left: auto; -} -.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content { - width: 100%; - margin-right: 18px; - text-align: right; -} -.ant-timeline-rtl.ant-timeline.ant-timeline-pending .ant-timeline-item-last .ant-timeline-item-tail { - border-right: 2px dotted #f0f0f0; - border-left: none; -} -.ant-timeline-rtl.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-tail { - border-right: 2px dotted #f0f0f0; - border-left: none; -} -.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-label { - text-align: left; -} -.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-label { - right: calc(50% + 14px); - text-align: right; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -@-webkit-keyframes antCheckboxEffect { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 0.5; - } - 100% { - -webkit-transform: scale(1.6); - transform: scale(1.6); - opacity: 0; - } -} -@keyframes antCheckboxEffect { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 0.5; - } - 100% { - -webkit-transform: scale(1.6); - transform: scale(1.6); - opacity: 0; - } -} -.ant-transfer-customize-list .ant-transfer-list { - -webkit-box-flex: 1; - -ms-flex: 1 1 50%; - flex: 1 1 50%; - width: auto; - height: auto; - min-height: 200px; -} -.ant-transfer-customize-list .ant-table-wrapper .ant-table-small { - border: 0; - border-radius: 0; -} -.ant-transfer-customize-list .ant-table-wrapper .ant-table-small > .ant-table-content > .ant-table-body > table > .ant-table-thead > tr > th { - background: #fafafa; -} -.ant-transfer-customize-list .ant-table-wrapper .ant-table-small > .ant-table-content .ant-table-row:last-child td { - border-bottom: 1px solid #f0f0f0; -} -.ant-transfer-customize-list .ant-table-wrapper .ant-table-small .ant-table-body { - margin: 0; -} -.ant-transfer-customize-list .ant-table-wrapper .ant-table-pagination.ant-pagination { - margin: 16px 0 4px; -} -.ant-transfer-customize-list .ant-input[disabled] { - background-color: transparent; -} -.ant-transfer { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; -} -.ant-transfer-disabled .ant-transfer-list { - background: #f5f5f5; -} -.ant-transfer-list { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - width: 180px; - height: 200px; - border: 1px solid #d9d9d9; - border-radius: 2px; -} -.ant-transfer-list-with-pagination { - width: 250px; - height: auto; -} -.ant-transfer-list-search { - padding-right: 24px; - padding-left: 8px; -} -.ant-transfer-list-search-action { - position: absolute; - top: 12px; - right: 12px; - bottom: 12px; - width: 28px; - color: rgba(0, 0, 0, 0.25); - line-height: 32px; - text-align: center; -} -.ant-transfer-list-search-action .anticon { - color: rgba(0, 0, 0, 0.25); - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-transfer-list-search-action .anticon:hover { - color: rgba(0, 0, 0, 0.45); -} -span.ant-transfer-list-search-action { - pointer-events: none; -} -.ant-transfer-list-header { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - height: 40px; - padding: 8px 12px 9px; - color: rgba(0, 0, 0, 0.65); - background: #fff; - border-bottom: 1px solid #f0f0f0; - border-radius: 2px 2px 0 0; -} -.ant-transfer-list-header > *:not(:last-child) { - margin-right: 4px; -} -.ant-transfer-list-header > * { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; -} -.ant-transfer-list-header-title { - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; - overflow: hidden; - white-space: nowrap; - text-align: right; - text-overflow: ellipsis; -} -.ant-transfer-list-header-dropdown { - -webkit-transform: translateY(10%); - transform: translateY(10%); - cursor: pointer; - display: inline-block; - font-size: 10px; -} -.ant-transfer-list-body { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - overflow: hidden; - font-size: 14px; -} -.ant-transfer-list-body-search-wrapper { - position: relative; - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - padding: 12px; -} -.ant-transfer-list-content { - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; - margin: 0; - padding: 0; - overflow: auto; - list-style: none; -} -.ant-transfer-list-content-item { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - min-height: 32px; - padding: 6px 12px; - overflow: hidden; - line-height: 20px; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-transfer-list-content-item > *:not(:last-child) { - margin-right: 8px; -} -.ant-transfer-list-content-item > * { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; -} -.ant-transfer-list-content-item-text { - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} -.ant-transfer-list-content-item-remove { - color: #1890ff; - text-decoration: none; - outline: none; - cursor: pointer; - -webkit-transition: color 0.3s; - transition: color 0.3s; - position: relative; - color: #d9d9d9; -} -.ant-transfer-list-content-item-remove:focus, -.ant-transfer-list-content-item-remove:hover { - color: #40a9ff; -} -.ant-transfer-list-content-item-remove:active { - color: #096dd9; -} -.ant-transfer-list-content-item-remove::after { - position: absolute; - top: -6px; - right: -50%; - bottom: -6px; - left: -50%; - content: ''; -} -.ant-transfer-list-content-item-remove:hover { - color: #40a9ff; -} -.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover { - background-color: #f5f5f5; - cursor: pointer; -} -.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled).ant-transfer-list-content-item-checked:hover { - background-color: #dcf4ff; -} -.ant-transfer-list-content-show-remove .ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover { - background: transparent; - cursor: default; -} -.ant-transfer-list-content-item-checked { - background-color: #e6f7ff; -} -.ant-transfer-list-content-item-disabled { - color: rgba(0, 0, 0, 0.25); - cursor: not-allowed; -} -.ant-transfer-list-pagination { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - -ms-flex-item-align: end; - align-self: flex-end; - padding: 8px 0; -} -.ant-transfer-list-body-not-found { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 100%; - margin: auto 0; - color: rgba(0, 0, 0, 0.25); - text-align: center; -} -.ant-transfer-list-footer { - border-top: 1px solid #f0f0f0; -} -.ant-transfer-operation { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - -ms-flex-item-align: center; - align-self: center; - margin: 0 8px; - overflow: hidden; - vertical-align: middle; -} -.ant-transfer-operation .ant-btn { - display: block; -} -.ant-transfer-operation .ant-btn:first-child { - margin-bottom: 4px; -} -.ant-transfer-operation .ant-btn .anticon { - font-size: 12px; -} -.ant-transfer .ant-empty-image { - max-height: -2px; -} -.ant-transfer-rtl { - direction: rtl; -} -.ant-transfer-rtl .ant-transfer-list-search { - padding-right: 8px; - padding-left: 24px; -} -.ant-transfer-rtl .ant-transfer-list-search-action { - right: auto; - left: 12px; -} -.ant-transfer-rtl .ant-transfer-list-header > *:not(:last-child) { - margin-right: 0; - margin-left: 4px; -} -.ant-transfer-rtl .ant-transfer-list-header { - right: 0; - left: auto; -} -.ant-transfer-rtl .ant-transfer-list-header-title { - text-align: left; -} -.ant-transfer-rtl .ant-transfer-list-content-item > *:not(:last-child) { - margin-right: 0; - margin-left: 8px; -} -.ant-transfer-rtl .ant-transfer-list-footer { - right: 0; - left: auto; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-tree-treenode-leaf-last .ant-tree-switcher-leaf-line::before { - height: 14px !important; -} -@-webkit-keyframes antCheckboxEffect { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 0.5; - } - 100% { - -webkit-transform: scale(1.6); - transform: scale(1.6); - opacity: 0; - } -} -@keyframes antCheckboxEffect { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 0.5; - } - 100% { - -webkit-transform: scale(1.6); - transform: scale(1.6); - opacity: 0; - } -} -.ant-select-tree-checkbox { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - top: -0.09em; - display: inline-block; - line-height: 1; - white-space: nowrap; - vertical-align: middle; - outline: none; - cursor: pointer; -} -.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-inner, -.ant-select-tree-checkbox:hover .ant-select-tree-checkbox-inner, -.ant-select-tree-checkbox-input:focus + .ant-select-tree-checkbox-inner { - border-color: #1890ff; -} -.ant-select-tree-checkbox-checked::after { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - border: 1px solid #1890ff; - border-radius: 2px; - visibility: hidden; - -webkit-animation: antCheckboxEffect 0.36s ease-in-out; - animation: antCheckboxEffect 0.36s ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; - content: ''; -} -.ant-select-tree-checkbox:hover::after, -.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox::after { - visibility: visible; -} -.ant-select-tree-checkbox-inner { - position: relative; - top: 0; - left: 0; - display: block; - width: 16px; - height: 16px; - direction: ltr; - background-color: #fff; - border: 1px solid #d9d9d9; - border-radius: 2px; - border-collapse: separate; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-select-tree-checkbox-inner::after { - position: absolute; - top: 50%; - left: 22%; - display: table; - width: 5.71428571px; - height: 9.14285714px; - border: 2px solid #fff; - border-top: 0; - border-left: 0; - -webkit-transform: rotate(45deg) scale(0) translate(-50%, -50%); - transform: rotate(45deg) scale(0) translate(-50%, -50%); - opacity: 0; - -webkit-transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s; - transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s; - content: ' '; -} -.ant-select-tree-checkbox-input { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - width: 100%; - height: 100%; - cursor: pointer; - opacity: 0; -} -.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner::after { - position: absolute; - display: table; - border: 2px solid #fff; - border-top: 0; - border-left: 0; - -webkit-transform: rotate(45deg) scale(1) translate(-50%, -50%); - transform: rotate(45deg) scale(1) translate(-50%, -50%); - opacity: 1; - -webkit-transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s; - transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s; - content: ' '; -} -.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner { - background-color: #1890ff; - border-color: #1890ff; -} -.ant-select-tree-checkbox-disabled { - cursor: not-allowed; -} -.ant-select-tree-checkbox-disabled.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner::after { - border-color: rgba(0, 0, 0, 0.25); - -webkit-animation-name: none; - animation-name: none; -} -.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-input { - cursor: not-allowed; -} -.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner { - background-color: #f5f5f5; - border-color: #d9d9d9 !important; -} -.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner::after { - border-color: #f5f5f5; - border-collapse: separate; - -webkit-animation-name: none; - animation-name: none; -} -.ant-select-tree-checkbox-disabled + span { - color: rgba(0, 0, 0, 0.25); - cursor: not-allowed; -} -.ant-select-tree-checkbox-disabled:hover::after, -.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-disabled::after { - visibility: hidden; -} -.ant-select-tree-checkbox-wrapper { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - display: inline-block; - line-height: unset; - cursor: pointer; -} -.ant-select-tree-checkbox-wrapper.ant-select-tree-checkbox-wrapper-disabled { - cursor: not-allowed; -} -.ant-select-tree-checkbox-wrapper + .ant-select-tree-checkbox-wrapper { - margin-left: 8px; -} -.ant-select-tree-checkbox + span { - padding-right: 8px; - padding-left: 8px; -} -.ant-select-tree-checkbox-group { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - display: inline-block; -} -.ant-select-tree-checkbox-group-item { - display: inline-block; - margin-right: 8px; -} -.ant-select-tree-checkbox-group-item:last-child { - margin-right: 0; -} -.ant-select-tree-checkbox-group-item + .ant-select-tree-checkbox-group-item { - margin-left: 0; -} -.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner { - background-color: #fff; - border-color: #d9d9d9; -} -.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner::after { - top: 50%; - left: 50%; - width: 8px; - height: 8px; - background-color: #1890ff; - border: 0; - -webkit-transform: translate(-50%, -50%) scale(1); - transform: translate(-50%, -50%) scale(1); - opacity: 1; - content: ' '; -} -.ant-select-tree-checkbox-indeterminate.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner::after { - background-color: rgba(0, 0, 0, 0.25); - border-color: rgba(0, 0, 0, 0.25); -} -.ant-tree-select-dropdown { - padding: 8px 4px 0; -} -.ant-tree-select-dropdown-rtl { - direction: rtl; -} -.ant-tree-select-dropdown .ant-select-tree { - border-radius: 0; -} -.ant-tree-select-dropdown .ant-select-tree-list-holder-inner { - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; -} -.ant-tree-select-dropdown .ant-select-tree-list-holder-inner .ant-select-tree-treenode { - padding-bottom: 8px; -} -.ant-tree-select-dropdown .ant-select-tree-list-holder-inner .ant-select-tree-treenode .ant-select-tree-node-content-wrapper { - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; -} -.ant-select-tree { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - background: #fff; - border-radius: 2px; - -webkit-transition: background-color 0.3s; - transition: background-color 0.3s; -} -.ant-select-tree-focused:not(:hover):not(.ant-select-tree-active-focused) { - background: #e6f7ff; -} -.ant-select-tree-list-holder-inner { - -webkit-box-align: start; - -ms-flex-align: start; - align-items: flex-start; -} -.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner { - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; -} -.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-node-content-wrapper { - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; -} -.ant-select-tree .ant-select-tree-treenode { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: start; - -ms-flex-align: start; - align-items: flex-start; - padding: 0 0 4px 0; - outline: none; -} -.ant-select-tree .ant-select-tree-treenode-disabled .ant-select-tree-node-content-wrapper { - color: rgba(0, 0, 0, 0.25); - cursor: not-allowed; -} -.ant-select-tree .ant-select-tree-treenode-disabled .ant-select-tree-node-content-wrapper:hover { - background: transparent; -} -.ant-select-tree .ant-select-tree-treenode-active .ant-select-tree-node-content-wrapper { - background: #f5f5f5; -} -.ant-select-tree-indent { - -ms-flex-item-align: stretch; - align-self: stretch; - white-space: nowrap; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.ant-select-tree-indent-unit { - display: inline-block; - width: 24px; -} -.ant-select-tree .ant-select-tree-switcher { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 24px; - height: 24px; - margin: 0; - line-height: 24px; - text-align: center; - cursor: pointer; -} -.ant-select-tree .ant-select-tree-switcher .ant-tree-switcher-icon, -.ant-select-tree .ant-select-tree-switcher .ant-select-tree-switcher-icon { - font-size: 10px; - display: inline-block; - vertical-align: baseline; -} -.ant-select-tree .ant-select-tree-switcher .ant-tree-switcher-icon svg, -.ant-select-tree .ant-select-tree-switcher .ant-select-tree-switcher-icon svg { - -webkit-transition: -webkit-transform 0.3s; - transition: -webkit-transform 0.3s; - transition: transform 0.3s; - transition: transform 0.3s, -webkit-transform 0.3s; -} -.ant-select-tree .ant-select-tree-switcher-noop { - cursor: default; -} -.ant-select-tree .ant-select-tree-switcher_close .ant-select-tree-switcher-icon svg { - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg); -} -.ant-select-tree .ant-select-tree-switcher-loading-icon { - color: #1890ff; -} -.ant-select-tree .ant-select-tree-switcher-leaf-line { - z-index: 1; - display: inline-block; - width: 100%; - height: 100%; -} -.ant-select-tree .ant-select-tree-switcher-leaf-line::before { - position: absolute; - height: 24px; - margin-left: -1px; - border-left: 1px solid #d9d9d9; - content: ' '; -} -.ant-select-tree .ant-select-tree-switcher-leaf-line::after { - position: absolute; - width: 10px; - height: 14px; - margin-left: -1px; - border-bottom: 1px solid #d9d9d9; - content: ' '; -} -.ant-select-tree .ant-select-tree-checkbox { - top: initial; - margin: 4px 8px 0 0; -} -.ant-select-tree .ant-select-tree-node-content-wrapper { - min-height: 24px; - margin: 0; - padding: 0 4px; - color: inherit; - line-height: 24px; - background: transparent; - border-radius: 2px; - cursor: pointer; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-select-tree .ant-select-tree-node-content-wrapper:hover { - background-color: #f5f5f5; -} -.ant-select-tree .ant-select-tree-node-content-wrapper.ant-select-tree-node-selected { - background-color: #bae7ff; -} -.ant-select-tree .ant-select-tree-node-content-wrapper .ant-select-tree-iconEle { - display: inline-block; - width: 24px; - height: 24px; - line-height: 24px; - text-align: center; - vertical-align: top; -} -.ant-select-tree .ant-select-tree-node-content-wrapper .ant-select-tree-iconEle:empty { - display: none; -} -.ant-select-tree-node-content-wrapper[draggable='true'] { - line-height: 20px; - border-top: 2px transparent solid; - border-bottom: 2px transparent solid; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.ant-select-tree .ant-select-tree-treenode.drag-over > [draggable] { - color: white; - background-color: #1890ff; - opacity: 0.8; -} -.ant-select-tree .ant-select-tree-treenode.drag-over-gap-top > [draggable] { - border-top-color: #1890ff; -} -.ant-select-tree .ant-select-tree-treenode.drag-over-gap-bottom > [draggable] { - border-bottom-color: #1890ff; -} -.ant-select-tree-show-line { - /* Motion should hide line of measure */ -} -.ant-select-tree-show-line .ant-select-tree-indent-unit { - position: relative; - height: 100%; -} -.ant-select-tree-show-line .ant-select-tree-indent-unit::before { - position: absolute; - top: calc(100% - 4px); - right: -12px; - bottom: -28px; - border-right: 1px solid #d9d9d9; - content: ''; -} -.ant-select-tree-show-line .ant-select-tree-indent-unit-end::before { - display: none; -} -.ant-select-tree-show-line .ant-select-tree-treenode-motion:not(.ant-motion-collapse-leave):not(.ant-motion-collapse-appear-active) .ant-select-tree-indent-unit::before { - display: none; -} -.ant-select-tree-show-line .ant-select-tree-switcher { - z-index: 1; - background: #fff; -} -.ant-tree-select-dropdown-rtl .ant-select-tree .ant-select-tree-switcher_close .ant-select-tree-switcher-icon svg { - -webkit-transform: rotate(90deg); - transform: rotate(90deg); -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -@-webkit-keyframes antCheckboxEffect { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 0.5; - } - 100% { - -webkit-transform: scale(1.6); - transform: scale(1.6); - opacity: 0; - } -} -@keyframes antCheckboxEffect { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 0.5; - } - 100% { - -webkit-transform: scale(1.6); - transform: scale(1.6); - opacity: 0; - } -} -.ant-tree-treenode-leaf-last .ant-tree-switcher-leaf-line::before { - height: 14px !important; -} -.ant-tree.ant-tree-directory .ant-tree-treenode { - position: relative; -} -.ant-tree.ant-tree-directory .ant-tree-treenode::before { - position: absolute; - top: 0; - right: 0; - bottom: 4px; - left: 0; - -webkit-transition: background-color 0.3s; - transition: background-color 0.3s; - content: ''; - pointer-events: none; -} -.ant-tree.ant-tree-directory .ant-tree-treenode:hover::before { - background: #f5f5f5; -} -.ant-tree.ant-tree-directory .ant-tree-treenode > * { - z-index: 1; -} -.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-switcher { - -webkit-transition: color 0.3s; - transition: color 0.3s; -} -.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper { - border-radius: 0; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper:hover { - background: transparent; -} -.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper.ant-tree-node-selected { - color: #fff; - background: transparent; -} -.ant-tree.ant-tree-directory .ant-tree-treenode-selected:hover::before, -.ant-tree.ant-tree-directory .ant-tree-treenode-selected::before { - background: #1890ff; -} -.ant-tree.ant-tree-directory .ant-tree-treenode-selected .ant-tree-switcher { - color: #fff; -} -.ant-tree.ant-tree-directory .ant-tree-treenode-selected .ant-tree-node-content-wrapper { - color: #fff; - background: transparent; -} -.ant-tree-checkbox { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - position: relative; - top: -0.09em; - display: inline-block; - line-height: 1; - white-space: nowrap; - vertical-align: middle; - outline: none; - cursor: pointer; -} -.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-inner, -.ant-tree-checkbox:hover .ant-tree-checkbox-inner, -.ant-tree-checkbox-input:focus + .ant-tree-checkbox-inner { - border-color: #1890ff; -} -.ant-tree-checkbox-checked::after { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - border: 1px solid #1890ff; - border-radius: 2px; - visibility: hidden; - -webkit-animation: antCheckboxEffect 0.36s ease-in-out; - animation: antCheckboxEffect 0.36s ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; - content: ''; -} -.ant-tree-checkbox:hover::after, -.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox::after { - visibility: visible; -} -.ant-tree-checkbox-inner { - position: relative; - top: 0; - left: 0; - display: block; - width: 16px; - height: 16px; - direction: ltr; - background-color: #fff; - border: 1px solid #d9d9d9; - border-radius: 2px; - border-collapse: separate; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-tree-checkbox-inner::after { - position: absolute; - top: 50%; - left: 22%; - display: table; - width: 5.71428571px; - height: 9.14285714px; - border: 2px solid #fff; - border-top: 0; - border-left: 0; - -webkit-transform: rotate(45deg) scale(0) translate(-50%, -50%); - transform: rotate(45deg) scale(0) translate(-50%, -50%); - opacity: 0; - -webkit-transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s; - transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s; - content: ' '; -} -.ant-tree-checkbox-input { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - width: 100%; - height: 100%; - cursor: pointer; - opacity: 0; -} -.ant-tree-checkbox-checked .ant-tree-checkbox-inner::after { - position: absolute; - display: table; - border: 2px solid #fff; - border-top: 0; - border-left: 0; - -webkit-transform: rotate(45deg) scale(1) translate(-50%, -50%); - transform: rotate(45deg) scale(1) translate(-50%, -50%); - opacity: 1; - -webkit-transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s; - transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s; - content: ' '; -} -.ant-tree-checkbox-checked .ant-tree-checkbox-inner { - background-color: #1890ff; - border-color: #1890ff; -} -.ant-tree-checkbox-disabled { - cursor: not-allowed; -} -.ant-tree-checkbox-disabled.ant-tree-checkbox-checked .ant-tree-checkbox-inner::after { - border-color: rgba(0, 0, 0, 0.25); - -webkit-animation-name: none; - animation-name: none; -} -.ant-tree-checkbox-disabled .ant-tree-checkbox-input { - cursor: not-allowed; -} -.ant-tree-checkbox-disabled .ant-tree-checkbox-inner { - background-color: #f5f5f5; - border-color: #d9d9d9 !important; -} -.ant-tree-checkbox-disabled .ant-tree-checkbox-inner::after { - border-color: #f5f5f5; - border-collapse: separate; - -webkit-animation-name: none; - animation-name: none; -} -.ant-tree-checkbox-disabled + span { - color: rgba(0, 0, 0, 0.25); - cursor: not-allowed; -} -.ant-tree-checkbox-disabled:hover::after, -.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-disabled::after { - visibility: hidden; -} -.ant-tree-checkbox-wrapper { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - display: inline-block; - line-height: unset; - cursor: pointer; -} -.ant-tree-checkbox-wrapper.ant-tree-checkbox-wrapper-disabled { - cursor: not-allowed; -} -.ant-tree-checkbox-wrapper + .ant-tree-checkbox-wrapper { - margin-left: 8px; -} -.ant-tree-checkbox + span { - padding-right: 8px; - padding-left: 8px; -} -.ant-tree-checkbox-group { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - display: inline-block; -} -.ant-tree-checkbox-group-item { - display: inline-block; - margin-right: 8px; -} -.ant-tree-checkbox-group-item:last-child { - margin-right: 0; -} -.ant-tree-checkbox-group-item + .ant-tree-checkbox-group-item { - margin-left: 0; -} -.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner { - background-color: #fff; - border-color: #d9d9d9; -} -.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner::after { - top: 50%; - left: 50%; - width: 8px; - height: 8px; - background-color: #1890ff; - border: 0; - -webkit-transform: translate(-50%, -50%) scale(1); - transform: translate(-50%, -50%) scale(1); - opacity: 1; - content: ' '; -} -.ant-tree-checkbox-indeterminate.ant-tree-checkbox-disabled .ant-tree-checkbox-inner::after { - background-color: rgba(0, 0, 0, 0.25); - border-color: rgba(0, 0, 0, 0.25); -} -.ant-tree { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - background: #fff; - border-radius: 2px; - -webkit-transition: background-color 0.3s; - transition: background-color 0.3s; -} -.ant-tree-focused:not(:hover):not(.ant-tree-active-focused) { - background: #e6f7ff; -} -.ant-tree-list-holder-inner { - -webkit-box-align: start; - -ms-flex-align: start; - align-items: flex-start; -} -.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner { - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; -} -.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-node-content-wrapper { - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; -} -.ant-tree .ant-tree-treenode { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: start; - -ms-flex-align: start; - align-items: flex-start; - padding: 0 0 4px 0; - outline: none; -} -.ant-tree .ant-tree-treenode-disabled .ant-tree-node-content-wrapper { - color: rgba(0, 0, 0, 0.25); - cursor: not-allowed; -} -.ant-tree .ant-tree-treenode-disabled .ant-tree-node-content-wrapper:hover { - background: transparent; -} -.ant-tree .ant-tree-treenode-active .ant-tree-node-content-wrapper { - background: #f5f5f5; -} -.ant-tree-indent { - -ms-flex-item-align: stretch; - align-self: stretch; - white-space: nowrap; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.ant-tree-indent-unit { - display: inline-block; - width: 24px; -} -.ant-tree .ant-tree-switcher { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - width: 24px; - height: 24px; - margin: 0; - line-height: 24px; - text-align: center; - cursor: pointer; -} -.ant-tree .ant-tree-switcher .ant-tree-switcher-icon, -.ant-tree .ant-tree-switcher .ant-select-tree-switcher-icon { - font-size: 10px; - display: inline-block; - vertical-align: baseline; -} -.ant-tree .ant-tree-switcher .ant-tree-switcher-icon svg, -.ant-tree .ant-tree-switcher .ant-select-tree-switcher-icon svg { - -webkit-transition: -webkit-transform 0.3s; - transition: -webkit-transform 0.3s; - transition: transform 0.3s; - transition: transform 0.3s, -webkit-transform 0.3s; -} -.ant-tree .ant-tree-switcher-noop { - cursor: default; -} -.ant-tree .ant-tree-switcher_close .ant-tree-switcher-icon svg { - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg); -} -.ant-tree .ant-tree-switcher-loading-icon { - color: #1890ff; -} -.ant-tree .ant-tree-switcher-leaf-line { - z-index: 1; - display: inline-block; - width: 100%; - height: 100%; -} -.ant-tree .ant-tree-switcher-leaf-line::before { - position: absolute; - height: 24px; - margin-left: -1px; - border-left: 1px solid #d9d9d9; - content: ' '; -} -.ant-tree .ant-tree-switcher-leaf-line::after { - position: absolute; - width: 10px; - height: 14px; - margin-left: -1px; - border-bottom: 1px solid #d9d9d9; - content: ' '; -} -.ant-tree .ant-tree-checkbox { - top: initial; - margin: 4px 8px 0 0; -} -.ant-tree .ant-tree-node-content-wrapper { - min-height: 24px; - margin: 0; - padding: 0 4px; - color: inherit; - line-height: 24px; - background: transparent; - border-radius: 2px; - cursor: pointer; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-tree .ant-tree-node-content-wrapper:hover { - background-color: #f5f5f5; -} -.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected { - background-color: #bae7ff; -} -.ant-tree .ant-tree-node-content-wrapper .ant-tree-iconEle { - display: inline-block; - width: 24px; - height: 24px; - line-height: 24px; - text-align: center; - vertical-align: top; -} -.ant-tree .ant-tree-node-content-wrapper .ant-tree-iconEle:empty { - display: none; -} -.ant-tree-node-content-wrapper[draggable='true'] { - line-height: 20px; - border-top: 2px transparent solid; - border-bottom: 2px transparent solid; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.ant-tree .ant-tree-treenode.drag-over > [draggable] { - color: white; - background-color: #1890ff; - opacity: 0.8; -} -.ant-tree .ant-tree-treenode.drag-over-gap-top > [draggable] { - border-top-color: #1890ff; -} -.ant-tree .ant-tree-treenode.drag-over-gap-bottom > [draggable] { - border-bottom-color: #1890ff; -} -.ant-tree-show-line { - /* Motion should hide line of measure */ -} -.ant-tree-show-line .ant-tree-indent-unit { - position: relative; - height: 100%; -} -.ant-tree-show-line .ant-tree-indent-unit::before { - position: absolute; - top: calc(100% - 4px); - right: -12px; - bottom: -28px; - border-right: 1px solid #d9d9d9; - content: ''; -} -.ant-tree-show-line .ant-tree-indent-unit-end::before { - display: none; -} -.ant-tree-show-line .ant-tree-treenode-motion:not(.ant-motion-collapse-leave):not(.ant-motion-collapse-appear-active) .ant-tree-indent-unit::before { - display: none; -} -.ant-tree-show-line .ant-tree-switcher { - z-index: 1; - background: #fff; -} -.ant-tree-rtl { - direction: rtl; -} -.ant-tree .ant-tree-treenode-rtl { - direction: rtl; -} -.ant-tree-rtl.ant-tree .ant-tree-switcher_close .ant-tree-switcher-icon svg { - -webkit-transform: rotate(90deg); - transform: rotate(90deg); -} -.ant-tree-rtl.ant-tree-show-line .ant-tree-indent-unit::before { - right: auto; - left: -12px; - border-right: none; - border-left: 1px solid #d9d9d9; -} -.ant-tree-rtl.ant-tree .ant-tree-checkbox { - margin: 4px 0 0 8px; -} -.ant-tree-select-dropdown-rtl .ant-select-tree .ant-select-tree-checkbox { - margin: 4px 0 0 8px; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-typography { - color: rgba(0, 0, 0, 0.65); - overflow-wrap: break-word; -} -.ant-typography.ant-typography-secondary { - color: rgba(0, 0, 0, 0.45); -} -.ant-typography.ant-typography-warning { - color: #faad14; -} -.ant-typography.ant-typography-danger { - color: #ff4d4f; -} -.ant-typography.ant-typography-disabled { - color: rgba(0, 0, 0, 0.25); - cursor: not-allowed; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -div.ant-typography, -.ant-typography p { - margin-bottom: 1em; -} -h1.ant-typography, -.ant-typography h1 { - margin-bottom: 0.5em; - color: rgba(0, 0, 0, 0.85); - font-weight: 600; - font-size: 38px; - line-height: 1.23; -} -h2.ant-typography, -.ant-typography h2 { - margin-bottom: 0.5em; - color: rgba(0, 0, 0, 0.85); - font-weight: 600; - font-size: 30px; - line-height: 1.35; -} -h3.ant-typography, -.ant-typography h3 { - margin-bottom: 0.5em; - color: rgba(0, 0, 0, 0.85); - font-weight: 600; - font-size: 24px; - line-height: 1.35; -} -h4.ant-typography, -.ant-typography h4 { - margin-bottom: 0.5em; - color: rgba(0, 0, 0, 0.85); - font-weight: 600; - font-size: 20px; - line-height: 1.4; -} -.ant-typography + h1.ant-typography, -.ant-typography + h2.ant-typography, -.ant-typography + h3.ant-typography, -.ant-typography + h4.ant-typography { - margin-top: 1.2em; -} -.ant-typography div + h1, -.ant-typography ul + h1, -.ant-typography li + h1, -.ant-typography p + h1, -.ant-typography h1 + h1, -.ant-typography h2 + h1, -.ant-typography h3 + h1, -.ant-typography h4 + h1, -.ant-typography div + h2, -.ant-typography ul + h2, -.ant-typography li + h2, -.ant-typography p + h2, -.ant-typography h1 + h2, -.ant-typography h2 + h2, -.ant-typography h3 + h2, -.ant-typography h4 + h2, -.ant-typography div + h3, -.ant-typography ul + h3, -.ant-typography li + h3, -.ant-typography p + h3, -.ant-typography h1 + h3, -.ant-typography h2 + h3, -.ant-typography h3 + h3, -.ant-typography h4 + h3, -.ant-typography div + h4, -.ant-typography ul + h4, -.ant-typography li + h4, -.ant-typography p + h4, -.ant-typography h1 + h4, -.ant-typography h2 + h4, -.ant-typography h3 + h4, -.ant-typography h4 + h4 { - margin-top: 1.2em; -} -a.ant-typography-ellipsis, -span.ant-typography-ellipsis { - display: inline-block; -} -a.ant-typography, -.ant-typography a { - color: #1890ff; - text-decoration: none; - outline: none; - cursor: pointer; - -webkit-transition: color 0.3s; - transition: color 0.3s; -} -a.ant-typography:focus, -.ant-typography a:focus, -a.ant-typography:hover, -.ant-typography a:hover { - color: #40a9ff; -} -a.ant-typography:active, -.ant-typography a:active { - color: #096dd9; -} -a.ant-typography:active, -.ant-typography a:active, -a.ant-typography:hover, -.ant-typography a:hover { - text-decoration: none; -} -a.ant-typography[disabled], -.ant-typography a[disabled] { - color: rgba(0, 0, 0, 0.25); - cursor: not-allowed; - pointer-events: none; -} -.ant-typography code { - margin: 0 0.2em; - padding: 0.2em 0.4em 0.1em; - font-size: 85%; - background: rgba(150, 150, 150, 0.1); - border: 1px solid rgba(100, 100, 100, 0.2); - border-radius: 3px; -} -.ant-typography kbd { - margin: 0 0.2em; - padding: 0.15em 0.4em 0.1em; - font-size: 90%; - background: rgba(150, 150, 150, 0.06); - border: 1px solid rgba(100, 100, 100, 0.2); - border-bottom-width: 2px; - border-radius: 3px; -} -.ant-typography mark { - padding: 0; - background-color: #ffe58f; -} -.ant-typography u, -.ant-typography ins { - text-decoration: underline; - -webkit-text-decoration-skip: ink; - text-decoration-skip-ink: auto; -} -.ant-typography s, -.ant-typography del { - text-decoration: line-through; -} -.ant-typography strong { - font-weight: 600; -} -.ant-typography-expand, -.ant-typography-edit, -.ant-typography-copy { - color: #1890ff; - text-decoration: none; - outline: none; - cursor: pointer; - -webkit-transition: color 0.3s; - transition: color 0.3s; - margin-left: 4px; -} -.ant-typography-expand:focus, -.ant-typography-edit:focus, -.ant-typography-copy:focus, -.ant-typography-expand:hover, -.ant-typography-edit:hover, -.ant-typography-copy:hover { - color: #40a9ff; -} -.ant-typography-expand:active, -.ant-typography-edit:active, -.ant-typography-copy:active { - color: #096dd9; -} -.ant-typography-copy-success, -.ant-typography-copy-success:hover, -.ant-typography-copy-success:focus { - color: #52c41a; -} -.ant-typography-edit-content { - position: relative; -} -div.ant-typography-edit-content { - left: -12px; - margin-top: -5px; - margin-bottom: calc(1em - 4px - 2px); -} -.ant-typography-edit-content-confirm { - position: absolute; - right: 10px; - bottom: 8px; - color: rgba(0, 0, 0, 0.45); - pointer-events: none; -} -.ant-typography-edit-content textarea { - -moz-transition: none; -} -.ant-typography ul, -.ant-typography ol { - margin: 0 0 1em 0; - padding: 0; -} -.ant-typography ul li, -.ant-typography ol li { - margin: 0 0 0 20px; - padding: 0 0 0 4px; -} -.ant-typography ul { - list-style-type: circle; -} -.ant-typography ul ul { - list-style-type: disc; -} -.ant-typography ol { - list-style-type: decimal; -} -.ant-typography-ellipsis-single-line { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} -a.ant-typography-ellipsis-single-line, -span.ant-typography-ellipsis-single-line { - vertical-align: bottom; -} -.ant-typography-ellipsis-multiple-line { - display: -webkit-box; - -webkit-line-clamp: 3; - /*! autoprefixer: ignore next */ - -webkit-box-orient: vertical; - overflow: hidden; -} -.ant-typography-rtl { - direction: rtl; -} -.ant-typography-rtl .ant-typography-expand, -.ant-typography-rtl .ant-typography-edit, -.ant-typography-rtl .ant-typography-copy { - margin-right: 4px; - margin-left: 0; -} -.ant-typography-rtl .ant-typography-expand { - float: left; -} -div.ant-typography-edit-content.ant-typography-rtl { - right: -12px; - left: auto; -} -.ant-typography-rtl .ant-typography-edit-content-confirm { - right: auto; - left: 10px; -} -.ant-typography-rtl.ant-typography ul li, -.ant-typography-rtl.ant-typography ol li { - margin: 0 20px 0 0; - padding: 0 4px 0 0; -} - -/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ -/* stylelint-disable no-duplicate-selectors */ -/* stylelint-disable */ -/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ -.ant-upload { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - line-height: 1.5715; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - outline: 0; -} -.ant-upload p { - margin: 0; -} -.ant-upload-btn { - display: block; - width: 100%; - outline: none; -} -.ant-upload input[type='file'] { - cursor: pointer; -} -.ant-upload.ant-upload-select { - display: inline-block; -} -.ant-upload.ant-upload-disabled { - cursor: not-allowed; -} -.ant-upload.ant-upload-select-picture-card { - display: table; - float: left; - width: 104px; - height: 104px; - margin-right: 8px; - margin-bottom: 8px; - text-align: center; - vertical-align: top; - background-color: #fafafa; - border: 1px dashed #d9d9d9; - border-radius: 2px; - cursor: pointer; - -webkit-transition: border-color 0.3s ease; - transition: border-color 0.3s ease; -} -.ant-upload.ant-upload-select-picture-card > .ant-upload { - display: table-cell; - width: 100%; - height: 100%; - padding: 8px; - text-align: center; - vertical-align: middle; -} -.ant-upload.ant-upload-select-picture-card:hover { - border-color: #1890ff; -} -.ant-upload-disabled.ant-upload.ant-upload-select-picture-card:hover { - border-color: #d9d9d9; -} -.ant-upload.ant-upload-drag { - position: relative; - width: 100%; - height: 100%; - text-align: center; - background: #fafafa; - border: 1px dashed #d9d9d9; - border-radius: 2px; - cursor: pointer; - -webkit-transition: border-color 0.3s; - transition: border-color 0.3s; -} -.ant-upload.ant-upload-drag .ant-upload { - padding: 16px 0; -} -.ant-upload.ant-upload-drag.ant-upload-drag-hover:not(.ant-upload-disabled) { - border-color: #096dd9; -} -.ant-upload.ant-upload-drag.ant-upload-disabled { - cursor: not-allowed; -} -.ant-upload.ant-upload-drag .ant-upload-btn { - display: table; - height: 100%; -} -.ant-upload.ant-upload-drag .ant-upload-drag-container { - display: table-cell; - vertical-align: middle; -} -.ant-upload.ant-upload-drag:not(.ant-upload-disabled):hover { - border-color: #40a9ff; -} -.ant-upload.ant-upload-drag p.ant-upload-drag-icon { - margin-bottom: 20px; -} -.ant-upload.ant-upload-drag p.ant-upload-drag-icon .anticon { - color: #40a9ff; - font-size: 48px; -} -.ant-upload.ant-upload-drag p.ant-upload-text { - margin: 0 0 4px; - color: rgba(0, 0, 0, 0.85); - font-size: 16px; -} -.ant-upload.ant-upload-drag p.ant-upload-hint { - color: rgba(0, 0, 0, 0.45); - font-size: 14px; -} -.ant-upload.ant-upload-drag .anticon-plus { - color: rgba(0, 0, 0, 0.25); - font-size: 30px; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-upload.ant-upload-drag .anticon-plus:hover { - color: rgba(0, 0, 0, 0.45); -} -.ant-upload.ant-upload-drag:hover .anticon-plus { - color: rgba(0, 0, 0, 0.45); -} -.ant-upload-picture-card-wrapper { - display: inline-block; - width: 100%; -} -.ant-upload-picture-card-wrapper::before { - display: table; - content: ''; -} -.ant-upload-picture-card-wrapper::after { - display: table; - clear: both; - content: ''; -} -.ant-upload-list { - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - padding: 0; - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - font-variant: tabular-nums; - list-style: none; - -webkit-font-feature-settings: 'tnum'; - font-feature-settings: 'tnum'; - line-height: 1.5715; -} -.ant-upload-list::before { - display: table; - content: ''; -} -.ant-upload-list::after { - display: table; - clear: both; - content: ''; -} -.ant-upload-list-item-list-type-text:hover .ant-upload-list-item-name-icon-count-1 { - padding-right: 14px; -} -.ant-upload-list-item-list-type-text:hover .ant-upload-list-item-name-icon-count-2 { - padding-right: 28px; -} -.ant-upload-list-item { - position: relative; - height: 22.001px; - margin-top: 8px; - font-size: 14px; -} -.ant-upload-list-item-name { - display: inline-block; - width: 100%; - padding-left: 22px; - overflow: hidden; - line-height: 1.5715; - white-space: nowrap; - text-overflow: ellipsis; -} -.ant-upload-list-item-name-icon-count-1 { - padding-right: 14px; -} -.ant-upload-list-item-card-actions { - position: absolute; - right: 0; -} -.ant-upload-list-item-card-actions-btn { - opacity: 0; -} -.ant-upload-list-item-card-actions-btn.ant-btn-sm { - height: 20px; - line-height: 1; -} -.ant-upload-list-item-card-actions.picture { - top: 22px; - line-height: 0; -} -.ant-upload-list-item-card-actions-btn:focus, -.ant-upload-list-item-card-actions.picture .ant-upload-list-item-card-actions-btn { - opacity: 1; -} -.ant-upload-list-item-card-actions .anticon { - color: rgba(0, 0, 0, 0.45); -} -.ant-upload-list-item-info { - height: 100%; - padding: 0 12px 0 4px; - -webkit-transition: background-color 0.3s; - transition: background-color 0.3s; -} -.ant-upload-list-item-info > span { - display: block; - width: 100%; - height: 100%; -} -.ant-upload-list-item-info .anticon-loading .anticon, -.ant-upload-list-item-info .ant-upload-text-icon .anticon { - position: absolute; - top: 5px; - color: rgba(0, 0, 0, 0.45); - font-size: 14px; -} -.ant-upload-list-item .anticon-close { - display: inline-block; - font-size: 10px; - position: absolute; - top: 6px; - right: 4px; - color: rgba(0, 0, 0, 0.45); - line-height: 0; - cursor: pointer; - opacity: 0; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-upload-list-item .anticon-close:hover { - color: rgba(0, 0, 0, 0.65); -} -.ant-upload-list-item:hover .ant-upload-list-item-info { - background-color: #f5f5f5; -} -.ant-upload-list-item:hover .anticon-close { - opacity: 1; -} -.ant-upload-list-item:hover .ant-upload-list-item-card-actions-btn { - opacity: 1; -} -.ant-upload-list-item-error, -.ant-upload-list-item-error .ant-upload-text-icon > .anticon, -.ant-upload-list-item-error .ant-upload-list-item-name { - color: #ff4d4f; -} -.ant-upload-list-item-error .ant-upload-list-item-card-actions .anticon { - color: #ff4d4f; -} -.ant-upload-list-item-error .ant-upload-list-item-card-actions-btn { - opacity: 1; -} -.ant-upload-list-item-progress { - position: absolute; - bottom: -12px; - width: 100%; - padding-left: 26px; - font-size: 14px; - line-height: 0; -} -.ant-upload-list-picture .ant-upload-list-item, -.ant-upload-list-picture-card .ant-upload-list-item { - position: relative; - height: 66px; - padding: 8px; - border: 1px solid #d9d9d9; - border-radius: 2px; -} -.ant-upload-list-picture .ant-upload-list-item:hover, -.ant-upload-list-picture-card .ant-upload-list-item:hover { - background: transparent; -} -.ant-upload-list-picture .ant-upload-list-item-error, -.ant-upload-list-picture-card .ant-upload-list-item-error { - border-color: #ff4d4f; -} -.ant-upload-list-picture .ant-upload-list-item-info, -.ant-upload-list-picture-card .ant-upload-list-item-info { - padding: 0; -} -.ant-upload-list-picture .ant-upload-list-item:hover .ant-upload-list-item-info, -.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info { - background: transparent; -} -.ant-upload-list-picture .ant-upload-list-item-uploading, -.ant-upload-list-picture-card .ant-upload-list-item-uploading { - border-style: dashed; -} -.ant-upload-list-picture .ant-upload-list-item-thumbnail, -.ant-upload-list-picture-card .ant-upload-list-item-thumbnail { - position: absolute; - top: 8px; - left: 8px; - width: 48px; - height: 48px; - line-height: 54px; - text-align: center; - opacity: 0.8; -} -.ant-upload-list-picture .ant-upload-list-item-thumbnail .anticon, -.ant-upload-list-picture-card .ant-upload-list-item-thumbnail .anticon { - font-size: 26px; -} -.ant-upload-list-picture .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill='#e6f7ff'], -.ant-upload-list-picture-card .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill='#e6f7ff'] { - fill: #fff2f0; -} -.ant-upload-list-picture .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill='#1890ff'], -.ant-upload-list-picture-card .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill='#1890ff'] { - fill: #ff4d4f; -} -.ant-upload-list-picture .ant-upload-list-item-icon, -.ant-upload-list-picture-card .ant-upload-list-item-icon { - position: absolute; - top: 50%; - left: 50%; - font-size: 26px; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); -} -.ant-upload-list-picture .ant-upload-list-item-icon .anticon, -.ant-upload-list-picture-card .ant-upload-list-item-icon .anticon { - font-size: 26px; -} -.ant-upload-list-picture .ant-upload-list-item-image, -.ant-upload-list-picture-card .ant-upload-list-item-image { - max-width: 100%; -} -.ant-upload-list-picture .ant-upload-list-item-thumbnail img, -.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img { - display: block; - width: 48px; - height: 48px; - overflow: hidden; -} -.ant-upload-list-picture .ant-upload-list-item-name, -.ant-upload-list-picture-card .ant-upload-list-item-name { - display: inline-block; - -webkit-box-sizing: border-box; - box-sizing: border-box; - max-width: 100%; - margin: 0 0 0 8px; - padding-right: 8px; - padding-left: 48px; - overflow: hidden; - line-height: 44px; - white-space: nowrap; - text-overflow: ellipsis; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-upload-list-picture .ant-upload-list-item-name-icon-count-1, -.ant-upload-list-picture-card .ant-upload-list-item-name-icon-count-1 { - padding-right: 18px; -} -.ant-upload-list-picture .ant-upload-list-item-name-icon-count-2, -.ant-upload-list-picture-card .ant-upload-list-item-name-icon-count-2 { - padding-right: 36px; -} -.ant-upload-list-picture .ant-upload-list-item-uploading .ant-upload-list-item-name, -.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-name { - line-height: 28px; -} -.ant-upload-list-picture .ant-upload-list-item-progress, -.ant-upload-list-picture-card .ant-upload-list-item-progress { - bottom: 14px; - width: calc(100% - 24px); - margin-top: 0; - padding-left: 56px; -} -.ant-upload-list-picture .anticon-close, -.ant-upload-list-picture-card .anticon-close { - position: absolute; - top: 8px; - right: 8px; - line-height: 1; - opacity: 1; -} -.ant-upload-list-picture-card.ant-upload-list::after { - display: none; -} -.ant-upload-list-picture-card-container { - float: left; - width: 104px; - height: 104px; - margin: 0 8px 8px 0; -} -.ant-upload-list-picture-card .ant-upload-list-item { - float: left; - width: 104px; - height: 104px; - margin: 0 8px 8px 0; -} -.ant-upload-list-picture-card .ant-upload-list-item-info { - position: relative; - height: 100%; - overflow: hidden; -} -.ant-upload-list-picture-card .ant-upload-list-item-info::before { - position: absolute; - z-index: 1; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.5); - opacity: 0; - -webkit-transition: all 0.3s; - transition: all 0.3s; - content: ' '; -} -.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info::before { - opacity: 1; -} -.ant-upload-list-picture-card .ant-upload-list-item-actions { - position: absolute; - top: 50%; - left: 50%; - z-index: 10; - white-space: nowrap; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - opacity: 0; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye, -.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-download, -.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete { - z-index: 10; - width: 16px; - margin: 0 4px; - color: rgba(255, 255, 255, 0.85); - font-size: 16px; - cursor: pointer; - -webkit-transition: all 0.3s; - transition: all 0.3s; -} -.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye:hover, -.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-download:hover, -.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete:hover { - color: #fff; -} -.ant-upload-list-picture-card .ant-upload-list-item-info:hover + .ant-upload-list-item-actions, -.ant-upload-list-picture-card .ant-upload-list-item-actions:hover { - opacity: 1; -} -.ant-upload-list-picture-card .ant-upload-list-item-thumbnail, -.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img { - position: static; - display: block; - width: 100%; - height: 100%; - -o-object-fit: cover; - object-fit: cover; -} -.ant-upload-list-picture-card .ant-upload-list-item-name { - display: none; - margin: 8px 0 0; - padding: 0; - line-height: 1.5715; - text-align: center; -} -.ant-upload-list-picture-card .ant-upload-list-item-file + .ant-upload-list-item-name { - position: absolute; - bottom: 10px; - display: block; -} -.ant-upload-list-picture-card .ant-upload-list-item-uploading.ant-upload-list-item { - background-color: #fafafa; -} -.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info { - height: auto; -} -.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info::before, -.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-eye, -.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-delete { - display: none; -} -.ant-upload-list-picture-card .ant-upload-list-item-progress { - bottom: 32px; - padding-left: 0; -} -.ant-upload-list .ant-upload-success-icon { - color: #52c41a; - font-weight: bold; -} -.ant-upload-list .ant-upload-animate-enter, -.ant-upload-list .ant-upload-animate-leave, -.ant-upload-list .ant-upload-animate-inline-enter, -.ant-upload-list .ant-upload-animate-inline-leave { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-fill-mode: cubic-bezier(0.78, 0.14, 0.15, 0.86); - animation-fill-mode: cubic-bezier(0.78, 0.14, 0.15, 0.86); -} -.ant-upload-list .ant-upload-animate-enter { - -webkit-animation-name: uploadAnimateIn; - animation-name: uploadAnimateIn; -} -.ant-upload-list .ant-upload-animate-leave { - -webkit-animation-name: uploadAnimateOut; - animation-name: uploadAnimateOut; -} -.ant-upload-list .ant-upload-animate-inline-enter { - -webkit-animation-name: uploadAnimateInlineIn; - animation-name: uploadAnimateInlineIn; -} -.ant-upload-list .ant-upload-animate-inline-leave { - -webkit-animation-name: uploadAnimateInlineOut; - animation-name: uploadAnimateInlineOut; -} -@-webkit-keyframes uploadAnimateIn { - from { - height: 0; - margin: 0; - padding: 0; - opacity: 0; - } -} -@keyframes uploadAnimateIn { - from { - height: 0; - margin: 0; - padding: 0; - opacity: 0; - } -} -@-webkit-keyframes uploadAnimateOut { - to { - height: 0; - margin: 0; - padding: 0; - opacity: 0; - } -} -@keyframes uploadAnimateOut { - to { - height: 0; - margin: 0; - padding: 0; - opacity: 0; - } -} -@-webkit-keyframes uploadAnimateInlineIn { - from { - width: 0; - height: 0; - margin: 0; - padding: 0; - opacity: 0; - } -} -@keyframes uploadAnimateInlineIn { - from { - width: 0; - height: 0; - margin: 0; - padding: 0; - opacity: 0; - } -} -@-webkit-keyframes uploadAnimateInlineOut { - to { - width: 0; - height: 0; - margin: 0; - padding: 0; - opacity: 0; - } -} -@keyframes uploadAnimateInlineOut { - to { - width: 0; - height: 0; - margin: 0; - padding: 0; - opacity: 0; - } -} -.ant-upload-rtl { - direction: rtl; -} -.ant-upload-rtl.ant-upload.ant-upload-select-picture-card { - float: right; - margin-right: 0; - margin-left: 8px; -} -.ant-upload-list-rtl { - direction: rtl; -} -.ant-upload-list-rtl .ant-upload-list-item-list-type-text:hover .ant-upload-list-item-name-icon-count-1 { - padding-right: 22px; - padding-left: 14px; -} -.ant-upload-list-rtl .ant-upload-list-item-list-type-text:hover .ant-upload-list-item-name-icon-count-2 { - padding-right: 22px; - padding-left: 28px; -} -.ant-upload-list-rtl .ant-upload-list-item-name { - padding-right: 22px; - padding-left: 0; -} -.ant-upload-list-rtl .ant-upload-list-item-name-icon-count-1 { - padding-left: 14px; -} -.ant-upload-list-rtl .ant-upload-list-item-card-actions { - right: auto; - left: 0; -} -.ant-upload-list-rtl .ant-upload-list-item-card-actions .anticon { - padding-right: 0; - padding-left: 5px; -} -.ant-upload-list-rtl .ant-upload-list-item-info { - padding: 0 4px 0 12px; -} -.ant-upload-list-rtl .ant-upload-list-item .anticon-close { - right: auto; - left: 4px; -} -.ant-upload-list-rtl .ant-upload-list-item-error .ant-upload-list-item-card-actions .anticon { - padding-right: 0; - padding-left: 5px; -} -.ant-upload-list-rtl .ant-upload-list-item-progress { - padding-right: 26px; - padding-left: 0; -} -.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-thumbnail, -.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-thumbnail { - right: 8px; - left: auto; -} -.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-icon, -.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-icon { - right: 50%; - left: auto; - -webkit-transform: translate(50%, -50%); - transform: translate(50%, -50%); -} -.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-name, -.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-name { - margin: 0 8px 0 0; - padding-right: 48px; - padding-left: 8px; -} -.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-name-icon-count-1, -.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-name-icon-count-1 { - padding-right: 48px; - padding-left: 18px; -} -.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-name-icon-count-2, -.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-name-icon-count-2 { - padding-right: 48px; - padding-left: 36px; -} -.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-progress, -.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-progress { - padding-right: 56px; - padding-left: 0; -} -.ant-upload-list-rtl.ant-upload-list-picture .anticon-close, -.ant-upload-list-rtl.ant-upload-list-picture-card .anticon-close { - right: auto; - left: 8px; -} -.ant-upload-list-rtl .ant-upload-list-picture-card-container { - float: right; - margin: 0 0 8px 8px; -} -.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item { - float: right; - margin: 0 0 8px 8px; -} -.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-actions { - right: 50%; - left: auto; - -webkit-transform: translate(50%, -50%); - transform: translate(50%, -50%); -} -.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-file + .ant-upload-list-item-name { - margin: 8px 0 0; - padding: 0; -} -.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-info { - padding: 0; -} - - -/*# sourceMappingURL=antd.css.map*/ \ No newline at end of file diff --git a/electron/assets/icons/splash-robot-head-dock.png b/electron/assets/icons/splash-robot-head-dock.png deleted file mode 100644 index fc2eadb05919211a44833ed0e8f05d734e92e379..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32513 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

={`|8osVae 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%0Dqaw(HHB$h?SQPf*$s{)V}Re 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

9qNCJU79y1Se_Yro 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

cYB@Hs+)CJu)KfVj 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≥3d{ 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

B2 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 z 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 diff --git a/electron/assets/icons/tray-logged-out.png b/electron/assets/icons/tray-logged-out.png deleted file mode 100644 index 16311b50e0b2f7b723fc121dd3655f3852a1f9b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1336 zcmV-81;_e{P)gg@h0~<6LJYkjB0-D#bz|1CL-OP=$R38HSH+Vrz5r1emcfw6gX9QzJ0$GEEzf$77GJKr30OQLmqUx3TdTtnmba4NOsF>1k!4 ztbz3@hG#FHKi3~WejFB+QOH7#M#F%li|7P@L$_|2<`qVU2!eMrW}Hs|q$7NIuIskq za}Ote%?z{PD?^#MGZV1D8ULF?}B zZlqr5S+#l}0Q}%J7~kF|6ic`)3}u8V7#$1BFG0{w>1*7$ZjS)WqHXFNs@>uE@$u&O<$5QQYnJb?BI0mAnad4^oUlH{m^t*x!tdeNO2 zo4L#P{f@d982uiu>*IYirx2%pMu;I#^)+-THSV&=B`nNODGU(iaH*agdca|8c9#04 zBr}5oM=0e-Z9j-n6NetKaW)Byd`b(%>lL{sFTtT~oMPQhuS2aj6~Rn z3n+{%0;-3wpG#ib+uH^r@^XKFznLeLq6sD9Qr5X70e7$hxo&{(^Yn#tiz|gY!t$+q zdwZC%7Ipxkd!s-IEhgIxic&+XR9e^9*Q2?!RIG)t)4{M*A$j-;zkwH2rvGnIF?*6(Gpbv8m|9CAqR`Yq zU;_ic0F;g|L{F{a8GGBn71cAs)SIHIV&&f;RWTga1p!$IkJdy4Y-&4nbOe30DFZ6V zE3jYf&o!*%c;V*n1FG_cw9Z_|zO3|#pK0!2NvCrwI*lzri*2h~l;V-|}n*unb&kG)J* zVGPk91GS`b=n=5P)`9a`Dv-ZIIw`49p^n=MDiJxqQEMwiB)dg&lTq-9Bb9Lq?q5C1 u7?X7louqVCGqwb|jiL^T^usz4M)VojcvJy-xAxuu0000HVEdW>2hv!eR{+l2SKK z^HHpU)&j_~teB88Ce}cj_`+x{76R#bEU^X(iT^>muE&zeWLDF(pDif`zW?6b+Ejg3S2OdiAhv^DUl76jLXrZwB`wjq|Fr7V<9r{8`R4*vpc44^QJUyQ7n z9}K|im>**JHnFu8d+7C=i|Sa&LfLFqho;jphdkh}vzg2lM!IF1mlI)9KEjdq@L_a1 zoubRfD3qF3T*O*)0XagipyV6^tL}duU1Ve96d?9}EDaa5BBKf!CHybU12rE|CUfHl z^9(TXAu-0_+^rymE~vq9xN8{3YDqMc$sEIPPQ{uC@@lUkbJm)`#K@h)eEW!$cVbO6 z91g2^l_5JHv?egh67hHq{?Tf8I=`y_={u=Z>PO_9?T3d4V;V0N#^doE)(o&_ay-mW zh`JZ}EFtpFr}4@u!pew>J(wg~Q*DZBJFCvi}6V4A=^>(-G0p>X}JCqToJSvO%#WYJky!xM=&Iuh@jLStn5{Z=6 z1&#s(&o^8X(ln3HFsV|u?G93&Wzy*nQvt!@Dp-^QpeLV^vZ|gptks|e?KCh3B(Tdj z9>lN!=OL@&{F?CF5eb>@7&+`jLlT8mtIq&2Bw^+{(0deEqmd`i@F;|r8tNb#jk?ww z?@5T3!dp?-!biWx(VgSH_Y9C^KVw-<>FaCA-@-KVbzu9Ww`}TPzgH|IdDfczw&G2}*D%8x_n~{qq3#s74Whe3qt}XUTE@ zJy}SIOGHP>0X88x<<&H$^Rn%oo;v69ecu_%2Ab%#Mn^{g#Fay#mJ-JXe9E5d=i~Vbw ng-|HOqsz~e1K+Cq+m!zR)h&o9IMXb?00000NkvXXu0mjfdoiS{ diff --git a/electron/assets/icons/tray-paused.png b/electron/assets/icons/tray-paused.png deleted file mode 100644 index 86a3b150164d386ee75d3ae9e6a32f360ed43d91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1312 zcmV+*1>gFKP)7~ivOrL zL?BYDt9yu!EL1EMUjMbS@*dV0LSYeGlv(L87=ShL ze1zreTsE7&>i0W~>R8A^#bVKfrUQ?IzofS=TGk0xrYpqpL>T7-1kw&}9NV@lijT68 z8%AXjYt04Z3q667BM5A$eR5rLb@c!sc0(*}1zMBQfQ%~kx95SH56H64!(eU!20j$V zG=jT3O`!rc9F4Xd$GKY(wJhr$;^u(GM3C3~4>D(+nOYd>&0)S>WXc;B6OBfr27YRg zU7mJkYL?|PnI__++q3Nt`aZ?Z#>U1o)SQ2=uCAOYUQ(FJWJ)+Q#F>eEs6HX<)^J-z z<{d@x@(5uyWW^3lS4Mhog@V)Mc*YZnju?-n=@AnZJtpAdDy(_|86^nc8w*i6J3H&@ zFSM3So(lv&WVL#yrvYFAm&sH{nv$zrsxLxRLwL+Qd?i7QYmFU@0}RyYP@y* zEMoL;xb6tQJGTIFnrB?M!$WfoF@@Gm=DCE)`V@)*iaEU0zQ1%3hm{F0%}qgJCMAxm zwVxFYJq2b7OcyxFwEZ7ph4^_wu9;Tg&^GFL-UvSjxPhKU0P=$iQKpuo_HHc1*fFxB z>I0h)g7PFv>AY$i^&E;@fi+D9a2IqoH5@nOH_WoO)kYoKW>ZLxBB_*$DQA)98P-A5 zfqiy$kJ&7G+)FE77tJbv7v9+%JM%v?Ti z>mB^T0Vz-batu(=y=)ba1zDtlzyc}-aE)0|DELGhr(Jc*LO)R(L5R~oU|I$ z7wl{ z$K!hk`$B-wy32(0HF#@aZ{6jcesH+ zJ=(ZbGj=As2zt!k1Gs$PkFQgKFP&vXvd>|X^j%d_1D14~5Zh{~S09n8=Y`i%vVQ^g W3_x;J3jyZ<0000P)o*;0Sj$)OP)DwtrAo>YRcIhNlNh(ogDv?iMx={$J zFx(|0c}!OkH3M9}1rNvp1o$IiCfOMbaeupeyWjqRjAcO8YV}~xFzPG=+F%(_j&t4f zya~&IGEqnfQDmGKSq7xB{~2XsA&`zounZ{2o;7b}%YP1CfW1m_Ize{FAXPeAwV zk;K`WL`oDkH;;fB3qvbu4=^ z5uBqam*Qp*)Gj1O^T z<`jm0NQ^~*dz2XggXe^0M22B>zc-Axi}s`@M*rrVw-70BSVlCR zPCNK%fwz^mCpF5-rBWC87>#ZFH+7z{v$M1FBXZ8ScXxMA(peH%DwRy^xyPQ+J(Qmi zb9MKD82m3Wg3K;qP>R^KHm1i-bi$%I1xVutgM>Tg(UKo<1Vz)T^ATfT~D z3=7aYc(vtJcz$nh&m^9~7&)w`A&J7OojHXlBw^-0w2uf7t{cfSYJj>bP61ylpnSIAVww*eZkz5<>F+`St=|3+jhFR0X7M2R*&Wjhn!*#!)C{9oi z-?RTxA)?#c+drYy5cv4HQZDP|O2t+yc-FM?SBDQ|&+8yEegG&3t`I%7iZ40`+_VAq zx*r56sK8|J$qFSYhQmccKo-KGHDux3iX$&j)y_PviCj1+2>@P+a@X?|r4(H8@?q;lvG zu>ID7^H2%uBp)6g1`38OiJ>?-C>bx=QxuW{s9QW{Nw^3|h?ZIwWG8y0oN*R?Fs>bC zQZb7R diff --git a/electron/constants/index.js b/electron/constants/index.js deleted file mode 100644 index 0d3c16db7..000000000 --- a/electron/constants/index.js +++ /dev/null @@ -1,55 +0,0 @@ -const os = require('os'); -const path = require('path'); -require('dotenv').config(); - -const PORT_RANGE = { startPort: 39152, endPort: 65535 }; -const ERROR_ADDRESS_IN_USE = 'EADDRINUSE'; - -// OS specific constants -const isWindows = process.platform === 'win32'; -const isMac = process.platform === 'darwin'; -const isLinux = process.platform === 'linux'; - -// Environment specific constants -const isDev = process.env.NODE_ENV === 'development'; -const isProd = !isDev; - -// Paths -const dotOperateDirectory = isProd - ? path.join(os.homedir(), '.operate') - : path.join(process.cwd(), '.operate'); - -const paths = { - dotOperateDirectory, - servicesDir: path.join(dotOperateDirectory, 'services'), - venvDir: path.join(dotOperateDirectory, 'venv'), - tempDir: path.join(dotOperateDirectory, 'temp'), - versionFile: path.join(dotOperateDirectory, 'version.txt'), - cliLogFile: path.join(dotOperateDirectory, 'cli.log'), - electronLogFile: path.join(dotOperateDirectory, 'electron.log'), - nextLogFile: path.join(dotOperateDirectory, 'next.log'), - osPearlTempDir: path.join(os.tmpdir(), 'pearl'), -}; - -// Publish options -const publishOptions = { - provider: 'github', - owner: 'valory-xyz', - repo: 'olas-operate-app', - releaseType: 'draft', - token: process.env.GH_TOKEN, - private: false, - publishAutoUpdate: false, -}; - -module.exports = { - PORT_RANGE, - ERROR_ADDRESS_IN_USE, - isWindows, - isMac, - isLinux, - isProd, - isDev, - publishOptions, - paths, -}; diff --git a/electron/entitlements.mac.plist b/electron/entitlements.mac.plist deleted file mode 100644 index 33951f8be..000000000 --- a/electron/entitlements.mac.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - com.apple.security.cs.allow-dyld-environment-variables - - com.apple.security.cs.disable-library-validation - - com.apple.security.cs.allow-jit - - com.apple.security.cs.allow-unsigned-executable-memory - - com.apple.security.cs.debugger - - com.apple.security.network.client - - com.apple.security.network.server - - com.apple.security.files.user-selected.read-only - - com.apple.security.inherit - - com.apple.security.automation.apple-events - - - \ No newline at end of file diff --git a/electron/icons.js b/electron/icons.js deleted file mode 100644 index 7c6c72e66..000000000 --- a/electron/icons.js +++ /dev/null @@ -1,30 +0,0 @@ -const { nativeImage } = require('electron'); - -const TRAY_ICONS_PATHS = { - LOGGED_OUT: `${__dirname}/assets/icons/tray-logged-out.png`, - LOW_GAS: `${__dirname}/assets/icons/tray-low-gas.png`, - PAUSED: `${__dirname}/assets/icons/tray-paused.png`, - RUNNING: `${__dirname}/assets/icons/tray-running.png`, -}; - -const TRAY_ICONS = { - LOGGED_OUT: nativeImage.createFromPath(TRAY_ICONS_PATHS.LOGGED_OUT), - LOW_GAS: nativeImage.createFromPath(TRAY_ICONS_PATHS.LOW_GAS), - PAUSED: nativeImage.createFromPath(TRAY_ICONS_PATHS.PAUSED), - RUNNING: nativeImage.createFromPath(TRAY_ICONS_PATHS.RUNNING), -}; - -try { - if (process.platform === 'darwin') { - // resize icons for macOS - const size = { width: 16, height: 16 }; - TRAY_ICONS.LOGGED_OUT = TRAY_ICONS.LOGGED_OUT.resize(size); - TRAY_ICONS.LOW_GAS = TRAY_ICONS.LOW_GAS.resize({ width: 16, height: 16 }); - TRAY_ICONS.PAUSED = TRAY_ICONS.PAUSED.resize({ width: 16, height: 16 }); - TRAY_ICONS.RUNNING = TRAY_ICONS.RUNNING.resize({ width: 16, height: 16 }); - } -} catch (e) { - console.log('Error resizing tray icons', e); -} - -module.exports = { TRAY_ICONS_PATHS, TRAY_ICONS }; diff --git a/electron/install.js b/electron/install.js deleted file mode 100644 index 2c3de2faa..000000000 --- a/electron/install.js +++ /dev/null @@ -1,209 +0,0 @@ -// Installation helpers. -const fs = require('fs'); -const os = require('os'); -const sudo = require('sudo-prompt'); -const process = require('process'); -const axios = require('axios'); -const { spawnSync } = require('child_process'); -const { logger } = require('./logger'); - -const { paths } = require('./constants'); - -/** - * current version of the pearl release - * - use "" (nothing as a suffix) for latest release candidate, for example "0.1.0rc26" - * - use "alpha" for alpha release, for example "0.1.0rc26-alpha" - */ -const OlasMiddlewareVersion = '0.1.0rc115'; - -const path = require('path'); -const { app } = require('electron'); - -// load env vars -require('dotenv').config({ - path: app.isPackaged - ? path.join(process.resourcesPath, '.env') - : path.resolve(process.cwd(), '.env'), -}); - -const Env = { - ...process.env, - PATH: `${process.env.PATH}:/opt/homebrew/bin:/usr/local/bin`, - HOMEBREW_NO_AUTO_UPDATE: '1', -}; - -const SudoOptions = { - name: 'Pearl', - env: Env, -}; - -const TendermintUrls = { - darwin: { - x64: 'https://github.com/tendermint/tendermint/releases/download/v0.34.19/tendermint_0.34.19_darwin_amd64.tar.gz', - arm64: - 'https://github.com/tendermint/tendermint/releases/download/v0.34.19/tendermint_0.34.19_darwin_arm64.tar.gz', - }, - linux: { - x64: 'https://github.com/tendermint/tendermint/releases/download/v0.34.19/tendermint_0.34.19_linux_amd64.tar.gz', - arm64: - 'https://github.com/tendermint/tendermint/releases/download/v0.34.19/tendermint_0.34.19_linux_arm64.tar.gz', - }, - win32: { - x64: 'https://github.com/tendermint/tendermint/releases/download/v0.34.19/tendermint_0.34.19_windows_amd64.tar.gz', - arm64: - 'https://github.com/tendermint/tendermint/releases/download/v0.34.19/tendermint_0.34.19_windows_arm64.tar.gz', - }, -}; - -function getBinPath(command) { - return spawnSync('/usr/bin/which', [command], { env: Env }) - .stdout?.toString() - .trim(); -} - -function runCmdUnix(command, options) { - logger.electron(`Running ${command} with options ${JSON.stringify(options)}`); - let bin = getBinPath(command); - if (!bin) { - throw new Error(`Command ${command} not found; Path : ${Env.PATH}`); - } - let output = spawnSync(bin, options); - if (output.error) { - throw new Error( - `Error running ${command} with options ${options}; - Error: ${output.error}; Stdout: ${output.stdout}; Stderr: ${output.stderr}`, - ); - } - logger.electron(`Executed ${command} ${options} with`); - logger.electron(`===== stdout ===== \n${output.stdout}`); - logger.electron(`===== stderr ===== \n${output.stderr}`); -} - -function runSudoUnix(command, options) { - let bin = getBinPath(command); - if (!bin) { - throw new Error(`Command ${command} not found`); - } - return new Promise(function (resolve, _reject) { - sudo.exec( - `${bin} ${options}`, - SudoOptions, - function (error, stdout, stderr) { - let output = { - error: error, - stdout: stdout, - stderr: stderr, - }; - if (output.error) { - throw new Error( - `Error running ${command} with options ${options}; - Error: ${output.error}; Stdout: ${output.stdout}; Stderr: ${output.stderr}`, - ); - } - logger.electron(`Executed ${command} ${options} with`); - logger.electron(`===== stdout ===== \n${output.stdout}`); - logger.electron(`===== stderr ===== \n${output.stderr}`); - resolve(); - }, - ); - }); -} - -function isTendermintInstalledUnix() { - return Boolean(getBinPath('tendermint')); -} - -async function downloadFile(url, dest) { - const writer = fs.createWriteStream(dest); - try { - const response = await axios({ - url, - method: 'GET', - responseType: 'stream', - }); - response.data.pipe(writer); - return new Promise((resolve, reject) => { - writer.on('finish', resolve); - writer.on('error', reject); - }); - } catch (err) { - fs.unlink(dest, () => {}); // Delete the file if there is an error - console.error('Error downloading the file:', err.message); - } -} - -async function installTendermintUnix() { - logger.electron(`Installing tendermint for ${os.platform()}-${process.arch}`); - const cwd = process.cwd(); - process.chdir(paths.tempDir); - - const url = TendermintUrls[os.platform()][process.arch]; - - logger.electron( - `Downloading ${url} to ${paths.tempDir}. This might take a while...`, - ); - await downloadFile(url, `${paths.tempDir}/tendermint.tar.gz`); - - logger.electron(`Installing tendermint binary`); - runCmdUnix('tar', ['-xvf', 'tendermint.tar.gz']); - - // TOFIX: Install tendermint in .operate instead of globally - if (!Env.CI) { - if (!fs.existsSync('/usr/local/bin')) { - await runSudoUnix('mkdir', '/usr/local/bin'); - } - await runSudoUnix( - 'install', - `${paths.tempDir}/tendermint /usr/local/bin/tendermint`, - ); - } - process.chdir(cwd); -} - -function createDirectory(path) { - if (fs.existsSync(path)) { - return; - } - return new Promise((resolve, _reject) => { - fs.mkdir(path, { recursive: true }, (error) => { - resolve(!error); - }); - }); -} - -/*******************************/ -// NOTE: "Installing" is string matched in loading.html to detect installation -/*******************************/ - -async function setupDarwin(ipcChannel) { - logger.electron('Creating required directories'); - await createDirectory(`${paths.dotOperateDirectory}`); - await createDirectory(`${paths.tempDir}`); - - logger.electron('Checking tendermint installation'); - if (!isTendermintInstalledUnix()) { - ipcChannel.send('response', 'Installing Pearl Daemon'); - logger.electron('Installing tendermint'); - await installTendermintUnix(); - } -} - -// TODO: Add Tendermint installation -async function setupUbuntu(ipcChannel) { - logger.electron('Creating required directories'); - await createDirectory(`${paths.dotOperateDirectory}`); - await createDirectory(`${paths.tempDir}`); - - logger.electron('Checking tendermint installation'); - if (!isTendermintInstalledUnix()) { - ipcChannel.send('response', 'Installing Pearl Daemon'); - logger.electron('Installing tendermint'); - await installTendermintUnix(); - } -} - -module.exports = { - setupDarwin, - setupUbuntu, - Env, -}; diff --git a/electron/loading/index.html b/electron/loading/index.html deleted file mode 100644 index 12e942969..000000000 --- a/electron/loading/index.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - -

- logo -
- - - -
-
-
- - - - \ No newline at end of file diff --git a/electron/loading/styles.css b/electron/loading/styles.css deleted file mode 100644 index 641342b6c..000000000 --- a/electron/loading/styles.css +++ /dev/null @@ -1,26 +0,0 @@ -body { - position: relative; - display: flex; - align-items: center; - justify-content: center; - width: 100%; - height: 100%; -} - -main { - display: flex; - flex-direction: column; - gap: 10px; - text-align: center; - align-content: center; -} - -.text { - font-size: 18px; -} - -img { - margin: 0 auto; - width: 150px !important; - height: 150px !important; -} \ No newline at end of file diff --git a/electron/logger.js b/electron/logger.js deleted file mode 100644 index 4127f4f23..000000000 --- a/electron/logger.js +++ /dev/null @@ -1,73 +0,0 @@ -const winston = require('winston'); -const { format } = require('logform'); -const { paths } = require('./constants'); - -const { combine, timestamp, printf } = format; - -const logFormat = printf(({ level, message, timestamp }) => { - return `${timestamp} ${level}: ${message}`; -}); - -const customLevels = { - levels: { - error: 0, - warn: 1, - info: 2, - next: 3, - cli: 4, - electron: 5, - }, - colors: { - error: 'red', - warn: 'yellow', - info: 'blue', - cli: 'green bold underline', - electron: 'magenta bold underline', - next: 'cyan bold underline', - }, -}; - -// Custom filter for specific levels, otherwise higher levels will include lower levels -const levelFilter = (level) => - format((info, _opts) => { - return info.level === level ? info : false; - })(); - -const logger = winston.createLogger({ - levels: customLevels.levels, - transports: [ - new winston.transports.Console({ - level: 'electron', // Set to the highest level so it captures everything. - format: combine(winston.format.colorize(), timestamp(), logFormat), - }), - new winston.transports.File({ - filename: 'cli.log', - dirname: paths.dotOperateDirectory, - level: 'cli', - format: combine(levelFilter('cli'), timestamp(), logFormat), - maxFiles: 1, - maxsize: 1024 * 1024 * 10, - }), - new winston.transports.File({ - filename: 'electron.log', - dirname: paths.dotOperateDirectory, - level: 'electron', - format: combine(levelFilter('electron'), timestamp(), logFormat), - maxFiles: 1, - maxsize: 1024 * 1024 * 10, - }), - new winston.transports.File({ - filename: 'next.log', - dirname: paths.dotOperateDirectory, - level: 'next', - format: combine(levelFilter('next'), timestamp(), logFormat), - maxFiles: 1, - maxsize: 1024 * 1024 * 10, - }), - ], - format: combine(timestamp(), logFormat), -}); - -winston.addColors(customLevels.colors); - -module.exports = { logger }; diff --git a/electron/main.js b/electron/main.js deleted file mode 100644 index e60d56fd1..000000000 --- a/electron/main.js +++ /dev/null @@ -1,697 +0,0 @@ -const { - app, - BrowserWindow, - Tray, - Menu, - Notification, - ipcMain, - dialog, - shell, -} = require('electron'); -const { spawn } = require('child_process'); -const path = require('path'); -const fs = require('fs'); -const os = require('os'); -const next = require('next'); -const http = require('http'); -const AdmZip = require('adm-zip'); -const { TRAY_ICONS, TRAY_ICONS_PATHS } = require('./icons'); - -const { setupDarwin, setupUbuntu, Env } = require('./install'); - -const { paths } = require('./constants'); -const { killProcesses } = require('./processes'); -const { isPortAvailable, findAvailablePort } = require('./ports'); -const { PORT_RANGE, isWindows, isMac } = require('./constants'); -const { macUpdater } = require('./update'); -const { setupStoreIpc } = require('./store'); -const { logger } = require('./logger'); -const { isDev } = require('./constants'); - -// Attempt to acquire the single instance lock -const singleInstanceLock = app.requestSingleInstanceLock(); -if (!singleInstanceLock) app.quit(); - -const platform = os.platform(); - -const binaryPaths = { - darwin: { - arm64: 'bins/pearl_arm64', - x64: 'bins/pearl_x64', - }, -}; - -let appConfig = { - ports: { - dev: { - operate: 8000, - next: 3000, - }, - prod: { - operate: 8765, - next: 3000, - }, - }, -}; - -let tray, - mainWindow, - splashWindow, - operateDaemon, - operateDaemonPid, - nextAppProcess, - nextAppProcessPid; - -function showNotification(title, body) { - new Notification({ title, body }).show(); -} - -async function beforeQuit() { - if (operateDaemonPid) { - try { - await killProcesses(operateDaemonPid); - } catch (e) { - logger.electron(e); - } - } - - if (nextAppProcessPid) { - try { - await killProcesses(nextAppProcessPid); - } catch (e) { - logger.electron(e); - } - } - - tray && tray.destroy(); - mainWindow && mainWindow.destroy(); -} - -const getUpdatedTrayIcon = (iconPath) => { - const icon = iconPath; - if (icon.resize) { - icon.resize({ width: 16 }); - icon.setTemplateImage(true); - } - - return icon; -}; - -/** - * Creates the tray - */ -const createTray = () => { - const trayPath = getUpdatedTrayIcon( - isWindows || isMac ? TRAY_ICONS.LOGGED_OUT : TRAY_ICONS_PATHS.LOGGED_OUT, - ); - const tray = new Tray(trayPath); - - const contextMenu = Menu.buildFromTemplate([ - { - label: 'Show app', - click: function () { - mainWindow.show(); - }, - }, - { - label: 'Hide app', - click: function () { - mainWindow.hide(); - }, - }, - { - label: 'Quit', - click: async function () { - await beforeQuit(); - app.quit(); - }, - }, - ]); - tray.setToolTip('Pearl'); - tray.setContextMenu(contextMenu); - - ipcMain.on('tray', (_event, status) => { - const isSupportedOS = isWindows || isMac; - switch (status) { - case 'low-gas': { - const icon = getUpdatedTrayIcon( - isSupportedOS ? TRAY_ICONS.LOW_GAS : TRAY_ICONS_PATHS.LOW_GAS, - ); - tray.setImage(icon); - break; - } - case 'running': { - const icon = getUpdatedTrayIcon( - isSupportedOS ? TRAY_ICONS.RUNNING : TRAY_ICONS_PATHS.RUNNING, - ); - tray.setImage(icon); - - break; - } - case 'paused': { - const icon = getUpdatedTrayIcon( - isSupportedOS ? TRAY_ICONS.PAUSED : TRAY_ICONS_PATHS.PAUSED, - ); - tray.setImage(icon); - break; - } - case 'logged-out': { - const icon = getUpdatedTrayIcon( - isSupportedOS ? TRAY_ICONS.LOGGED_OUT : TRAY_ICONS_PATHS.LOGGED_OUT, - ); - tray.setImage(icon); - break; - } - } - }); -}; - -const APP_WIDTH = 460; - -/** - * Creates the splash window - */ -const createSplashWindow = () => { - splashWindow = new BrowserWindow({ - width: APP_WIDTH, - height: APP_WIDTH, - resizable: false, - show: true, - title: 'Pearl', - frame: false, - webPreferences: { - nodeIntegration: true, - contextIsolation: false, - }, - }); - splashWindow.loadURL('file://' + __dirname + '/loading/index.html'); - - if (isDev) { - splashWindow.webContents.openDevTools(); - } -}; - -const HEIGHT = 700; -/** - * Creates the main window - */ -const createMainWindow = async () => { - const width = isDev ? 840 : APP_WIDTH; - mainWindow = new BrowserWindow({ - title: 'Pearl', - resizable: false, - draggable: true, - frame: false, - transparent: true, - fullscreenable: false, - maximizable: false, - width, - maxHeight: HEIGHT, - webPreferences: { - nodeIntegration: false, - contextIsolation: true, - preload: path.join(__dirname, 'preload.js'), - }, - }); - - mainWindow.setMenuBarVisibility(true); - - ipcMain.on('close-app', () => { - mainWindow.close(); - }); - - ipcMain.on('minimize-app', () => { - mainWindow.minimize(); - }); - - app.on('activate', () => { - if (mainWindow.isMinimized()) { - mainWindow.restore(); - } else { - mainWindow.show(); - } - }); - - ipcMain.on('set-height', (_event, height) => { - mainWindow.setSize(width, height); - }); - - ipcMain.on('show-notification', (_event, title, description) => { - showNotification(title, description || undefined); - }); - - mainWindow.webContents.on('did-fail-load', () => { - mainWindow.webContents.reloadIgnoringCache(); - }); - - mainWindow.webContents.on('ready-to-show', () => { - mainWindow.show(); - }); - - mainWindow.webContents.setWindowOpenHandler(({ url }) => { - // open url in a browser and prevent default - require('electron').shell.openExternal(url); - return { action: 'deny' }; - }); - - mainWindow.on('close', function (event) { - event.preventDefault(); - mainWindow.hide(); - }); - - try { - logger.electron('Setting up store IPC'); - await setupStoreIpc(ipcMain, mainWindow); - } catch (e) { - logger.electron('Store IPC failed:', JSON.stringify(e)); - } - - if (isDev) { - mainWindow.webContents.openDevTools(); - } - - if (isDev) { - mainWindow.loadURL(`http://localhost:${appConfig.ports.dev.next}`); - } else { - mainWindow.loadURL(`http://localhost:${appConfig.ports.prod.next}`); - } -}; - -async function launchDaemon() { - // Free up backend port if already occupied - try { - await fetch(`http://localhost:${appConfig.ports.prod.operate}/api`); - logger.electron('Killing backend server!'); - let endpoint = fs - .readFileSync(`${paths.dotOperateDirectory}/operate.kill`) - .toString() - .trim(); - - await fetch(`http://localhost:${appConfig.ports.prod.operate}/${endpoint}`); - } catch (err) { - logger.electron('Backend not running!'); - } - - const check = new Promise(function (resolve, _reject) { - operateDaemon = spawn( - path.join( - process.resourcesPath, - binaryPaths[platform][process.arch.toString()], - ), - [ - 'daemon', - `--port=${appConfig.ports.prod.operate}`, - `--home=${paths.dotOperateDirectory}`, - ], - { env: Env }, - ); - operateDaemonPid = operateDaemon.pid; - // fs.appendFileSync( - // `${paths.OperateDirectory}/operate.pip`, - // `${operateDaemon.pid}`, - // { - // encoding: 'utf-8', - // }, - // ); - - operateDaemon.stderr.on('data', (data) => { - if (data.toString().includes('Uvicorn running on')) { - resolve({ running: true, error: null }); - } - if ( - data.toString().includes('error while attempting to bind on address') - ) { - resolve({ running: false, error: 'Port already in use' }); - } - logger.cli(data.toString().trim()); - }); - operateDaemon.stdout.on('data', (data) => { - logger.cli(data.toString().trim()); - }); - }); - - return await check; -} - -async function launchDaemonDev() { - const check = new Promise(function (resolve, _reject) { - operateDaemon = spawn('poetry', [ - 'run', - 'operate', - 'daemon', - `--port=${appConfig.ports.dev.operate}`, - '--home=.operate', - ]); - operateDaemonPid = operateDaemon.pid; - operateDaemon.stderr.on('data', (data) => { - if (data.toString().includes('Uvicorn running on')) { - resolve({ running: true, error: null }); - } - if ( - data.toString().includes('error while attempting to bind on address') - ) { - resolve({ running: false, error: 'Port already in use' }); - } - logger.cli(data.toString().trim()); - }); - operateDaemon.stdout.on('data', (data) => { - logger.cli(data.toString().trim()); - }); - }); - return await check; -} - -async function launchNextApp() { - const nextApp = next({ - dev: false, - dir: path.join(__dirname), - port: appConfig.ports.prod.next, - env: { - GNOSIS_RPC: - process.env.NODE_ENV === 'production' - ? process.env.FORK_URL - : process.env.DEV_RPC, - NEXT_PUBLIC_BACKEND_PORT: - process.env.NODE_ENV === 'production' - ? appConfig.ports.prod.operate - : appConfig.ports.dev.operate, - }, - }); - await nextApp.prepare(); - - const handle = nextApp.getRequestHandler(); - const server = http.createServer((req, res) => { - handle(req, res); // Handle requests using the Next.js request handler - }); - server.listen(appConfig.ports.prod.next, (err) => { - if (err) throw err; - logger.next( - `> Next server running on http://localhost:${appConfig.ports.prod.next}`, - ); - }); -} - -async function launchNextAppDev() { - await new Promise(function (resolve, _reject) { - process.env.NEXT_PUBLIC_BACKEND_PORT = appConfig.ports.dev.operate; // must set next env var to connect to backend - nextAppProcess = spawn( - 'yarn', - ['dev:frontend', '--port', appConfig.ports.dev.next], - { - env: { - ...process.env, - NEXT_PUBLIC_BACKEND_PORT: appConfig.ports.dev.operate, - }, - }, - ); - nextAppProcessPid = nextAppProcess.pid; - nextAppProcess.stdout.on('data', (data) => { - logger.next(data.toString().trim()); - resolve(); - }); - }); -} - -ipcMain.on('check', async function (event, _argument) { - // Update - try { - // macUpdater.checkForUpdates().then((res) => { - // if (!res) return; - // if (!res.downloadPromise) return; - // new Notification({ - // title: 'Update Available', - // body: 'Downloading update...', - // }).show(); - // res.downloadPromise.then(() => { - // new Notification({ - // title: 'Update Downloaded', - // body: 'Restarting application...', - // }).show(); - // macUpdater.quitAndInstall(); - // }); - // }); - } catch (e) { - logger.electron(e); - } - - // Setup - try { - event.sender.send('response', 'Checking installation'); - - if (platform === 'darwin') { - await setupDarwin(event.sender); - } else if (platform === 'win32') { - // TODO - } else { - await setupUbuntu(event.sender); - } - - if (isDev) { - event.sender.send( - 'response', - 'Starting Pearl Daemon In Development Mode', - ); - - const daemonDevPortAvailable = await isPortAvailable( - appConfig.ports.dev.operate, - ); - - if (!daemonDevPortAvailable) { - appConfig.ports.dev.operate = await findAvailablePort({ - ...PORT_RANGE, - }); - } - await launchDaemonDev(); - event.sender.send( - 'response', - 'Starting Frontend Server In Development Mode', - ); - - const frontendDevPortAvailable = await isPortAvailable( - appConfig.ports.dev.next, - ); - - if (!frontendDevPortAvailable) { - appConfig.ports.dev.next = await findAvailablePort({ - ...PORT_RANGE, - excludePorts: [appConfig.ports.dev.operate], - }); - } - await launchNextAppDev(); - } else { - event.sender.send('response', 'Starting Pearl Daemon'); - await launchDaemon(); - - event.sender.send('response', 'Starting Frontend Server'); - const frontendPortAvailable = await isPortAvailable( - appConfig.ports.prod.next, - ); - if (!frontendPortAvailable) { - appConfig.ports.prod.next = await findAvailablePort({ - ...PORT_RANGE, - excludePorts: [appConfig.ports.prod.operate], - }); - } - await launchNextApp(); - } - - event.sender.send('response', 'Launching App'); - await createMainWindow(); - createTray(); - splashWindow.destroy(); - } catch (e) { - logger.electron(e); - new Notification({ - title: 'Error', - body: e, - }).show(); - event.sender.send('response', e); - // app.quit(); - } -}); - -// APP-SPECIFIC EVENTS -app.on('ready', async () => { - if (platform === 'darwin') { - app.dock?.setIcon( - path.join(__dirname, 'assets/icons/splash-robot-head-dock.png'), - ); - } - createSplashWindow(); -}); - -app.on('window-all-closed', () => { - app.quit(); -}); - -app.on('before-quit', async () => { - await beforeQuit(); -}); - -// UPDATER EVENTS -macUpdater.on('update-downloaded', () => { - macUpdater.quitAndInstall(); -}); - -// PROCESS SPECIFIC EVENTS (HANDLES NON-GRACEFUL TERMINATION) -process.on('uncaughtException', (error) => { - logger.electron('Uncaught Exception:', error); - // Clean up your child processes here - beforeQuit().then(() => { - process.exit(1); // Exit with a failure code - }); -}); - -['SIGINT', 'SIGTERM'].forEach((signal) => { - process.on(signal, () => { - logger.electron(`Received ${signal}. Cleaning up...`); - beforeQuit().then(() => { - process.exit(0); - }); - }); -}); - -// OPEN PATH -ipcMain.on('open-path', (_, filePath) => { - shell.openPath(filePath); -}); - -/** - * Sanitizes logs by replacing usernames in the log data with asterisks. - * If a file path is provided, it reads the log data from the file and sanitizes it. - * If the file path does not exist, it returns null. - * If no file path is provided, it sanitizes the provided data directly. - * The sanitized log data is then written to the destination path. - * @param {Object} options - The options for sanitizing logs. - * @param {string} options.name - The name of the log file. - * @param {string} options.filePath - The file path to read the log data from. - * @param {string} options.data - The log data to sanitize if no file path is provided. - * @param {string} options.destPath - The destination path where the logs should be stored after sanitization. - * @returns {string|null} - The file path of the sanitized log data, or null if the file path does not exist. - */ -function sanitizeLogs({ - name, - filePath, - data = '', - destPath = paths.osPearlTempDir, -}) { - if (filePath && !fs.existsSync(filePath)) return null; - - const logs = filePath ? fs.readFileSync(filePath, 'utf-8') : data; - - const usernameRegex = /\/(Users|home)\/([^/]+)/g; - const sanitizedData = logs.replace(usernameRegex, '/$1/*****'); - const sanitizedLogsFilePath = path.join(destPath, name); - - if (!fs.existsSync(destPath)) fs.mkdirSync(destPath); - - fs.writeFileSync(sanitizedLogsFilePath, sanitizedData); - - return sanitizedLogsFilePath; -} - -// EXPORT LOGS -ipcMain.handle('save-logs', async (_, data) => { - sanitizeLogs({ - name: 'cli.log', - filePath: paths.cliLogFile, - }); - - sanitizeLogs({ - name: 'next.log', - filePath: paths.nextLogFile, - }); - - sanitizeLogs({ - name: 'electron.log', - filePath: paths.electronLogFile, - }); - - // OS info - const osInfo = ` - OS Type: ${os.type()} - OS Platform: ${os.platform()} - OS Arch: ${os.arch()} - OS Release: ${os.release()} - Total Memory: ${os.totalmem()} - Free Memory: ${os.freemem()} - `; - const osInfoFilePath = path.join(paths.osPearlTempDir, 'os_info.txt'); - fs.writeFileSync(osInfoFilePath, osInfo); - - // Persistent store - if (data.store) - sanitizeLogs({ - name: 'store.txt', - data: JSON.stringify(data.store, null, 2), - }); - - // Other debug data: balances, addresses, etc. - if (data.debugData) - sanitizeLogs({ - name: 'debug_data.txt', - data: JSON.stringify(data.debugData, null, 2), - }); - - // Agent logs - try { - fs.readdirSync(paths.servicesDir).map((serviceDirName) => { - const servicePath = path.join(paths.servicesDir, serviceDirName); - if (!fs.existsSync(servicePath)) return; - if (!fs.statSync(servicePath).isDirectory()) return; - - const agentLogFilePath = path.join( - servicePath, - 'deployment', - 'agent', - 'log.txt', - ); - if (!fs.existsSync(agentLogFilePath)) return; - - return sanitizeLogs({ - name: `${serviceDirName}_agent.log`, - filePath: agentLogFilePath, - }); - }); - } catch (e) { - logger.electron(e); - } - - // Create a zip archive - const zip = new AdmZip(); - fs.readdirSync(paths.osPearlTempDir).forEach((file) => { - const filePath = path.join(paths.osPearlTempDir, file); - if (!fs.existsSync(filePath)) return; - if (fs.statSync(filePath).isDirectory()) return; - - zip.addLocalFile(filePath); - }); - - // Show save dialog - const { filePath } = await dialog.showSaveDialog({ - title: 'Save Logs', - defaultPath: path.join( - os.homedir(), - `pearl_logs_${new Date(Date.now()).toISOString()}-${app.getVersion()}.zip`, - ), - filters: [{ name: 'Zip Files', extensions: ['zip'] }], - }); - - let result; - if (filePath) { - // Write the zip file to the selected path - zip.writeZip(filePath); - result = { success: true, dirPath: path.dirname(filePath) }; - } else { - result = { success: false }; - } - - // Remove temporary files - fs.existsSync(paths.osPearlTempDir) && - fs.rmSync(paths.osPearlTempDir, { - recursive: true, - force: true, - }); - - return result; -}); diff --git a/electron/ports.js b/electron/ports.js deleted file mode 100644 index d01697ca0..000000000 --- a/electron/ports.js +++ /dev/null @@ -1,79 +0,0 @@ -const net = require('net'); -const { ERROR_ADDRESS_IN_USE } = require('./constants'); - -/** - * Finds an available port within the specified range, excluding specified ports. - * @param {number} startPort - The start of the port range. - * @param {number} endPort - The end of the port range. - * @param {Array} excludePorts - An array of ports to be skipped. - * @returns {Promise} The first available port found within the range that's not excluded. - */ -function findAvailablePort({ startPort, endPort, excludePorts = [] }) { - return new Promise((resolve, reject) => { - let currentPort = startPort; - - const tryPort = (port) => { - if (excludePorts.includes(port)) { - if (currentPort < endPort) { - tryPort(++currentPort); - } else { - reject( - new Error( - `Unable to find an available port between ${startPort} and ${endPort} excluding specified ports.`, - ), - ); - } - return; - } - - const server = net.createServer(); - - server.listen(port, () => { - server.close(() => { - resolve(port); - }); - }); - - server.on('error', (err) => { - if (err.code === ERROR_ADDRESS_IN_USE && currentPort < endPort) { - // Try the next port if the current one is in use or excluded - tryPort(++currentPort); - } else { - reject( - new Error( - `Unable to find an available port between ${startPort} and ${endPort} excluding specified ports.`, - ), - ); - } - }); - }; - - tryPort(currentPort); - }); -} - -/** - * Checks if a port is available. - * @param {number} port - The port to check. - * @returns {Promise} Whether the port is available. - */ -function isPortAvailable(port) { - return new Promise((resolve) => { - const server = net.createServer(); - - server.listen(port, () => { - server.close(() => { - resolve(true); - }); - }); - - server.on('error', () => { - resolve(false); - }); - }); -} - -module.exports = { - findAvailablePort, - isPortAvailable, -}; diff --git a/electron/preload.js b/electron/preload.js deleted file mode 100644 index 2878e232e..000000000 --- a/electron/preload.js +++ /dev/null @@ -1,25 +0,0 @@ -const { contextBridge, ipcRenderer } = require('electron/renderer'); - -contextBridge.exposeInMainWorld('electronAPI', { - closeApp: () => ipcRenderer.send('close-app'), - minimizeApp: () => ipcRenderer.send('minimize-app'), - setTrayIcon: (status) => ipcRenderer.send('tray', status), - ipcRenderer: { - send: (channel, data) => ipcRenderer.send(channel, data), - on: (channel, func) => - ipcRenderer.on(channel, (event, ...args) => func(...args)), - invoke: (channel, data) => ipcRenderer.invoke(channel, data), - }, - store: { - store: () => ipcRenderer.invoke('store'), - get: (key) => ipcRenderer.invoke('store-get', key), - set: (key, value) => ipcRenderer.invoke('store-set', key, value), - delete: (key) => ipcRenderer.invoke('store-delete', key), - clear: () => ipcRenderer.invoke('store-clear'), - }, - setAppHeight: (height) => ipcRenderer.send('set-height', height), - showNotification: (title, description) => - ipcRenderer.send('show-notification', title, description), - saveLogs: (data) => ipcRenderer.invoke('save-logs', data), - openPath: (filePath) => ipcRenderer.send('open-path', filePath), -}); diff --git a/electron/processes.js b/electron/processes.js deleted file mode 100644 index e67dcaac5..000000000 --- a/electron/processes.js +++ /dev/null @@ -1,40 +0,0 @@ -const psTree = require('ps-tree'); -const { exec } = require('child_process'); - -const unixKillCommand = 'kill -9'; -const windowsKillCommand = 'taskkill /F /PID'; - -const isWindows = process.platform === 'win32'; - -function killProcesses(pid) { - return new Promise((resolve, reject) => { - psTree(pid, (err, children) => { - if (err) { - reject(err); - return; - } - - // Array of PIDs to kill, starting with the children - const pidsToKill = children.map((p) => p.PID); - pidsToKill.push(pid); // Also kill the main process - - const killCommand = isWindows ? windowsKillCommand : unixKillCommand; - const joinedCommand = pidsToKill - .map((pid) => `${killCommand} ${pid}`) - .join('; '); // Separate commands with a semicolon, so they run in sequence even if one fails. Also works on Windows. - - exec(joinedCommand, (err) => { - if ( - err?.message?.includes(isWindows ? 'not found' : 'No such process') - ) { - return; // Ignore errors for processes that are already dead - } - reject(err); - }); - - resolve(); - }); - }); -} - -module.exports = { killProcesses }; diff --git a/electron/public/broken-robot.svg b/electron/public/broken-robot.svg deleted file mode 100644 index 5f99a0375..000000000 --- a/electron/public/broken-robot.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/electron/public/happy-robot.svg b/electron/public/happy-robot.svg deleted file mode 100644 index 4ca51d1d2..000000000 --- a/electron/public/happy-robot.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/electron/public/onboarding-robot.svg b/electron/public/onboarding-robot.svg deleted file mode 100644 index c7cca155c..000000000 --- a/electron/public/onboarding-robot.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/electron/public/sad-robot.svg b/electron/public/sad-robot.svg deleted file mode 100644 index 1cc45bdc7..000000000 --- a/electron/public/sad-robot.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/electron/public/splash-robot-head.png b/electron/public/splash-robot-head.png deleted file mode 100644 index d43fb2873a75ea35c968de5f186d2a5c20db2bfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 319634 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%0Dqaw(HHB$h?SQPf*$s{)V}Re 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
9qNCJU79y1Se_Yro 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

cYB@Hs+)CJu)KfVj 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≥3d{ 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

- - - - -
- - - * This action requires a small amount of funds. - - - - ); -}; diff --git a/frontend/components/SettingsPage/DebugInfoSection.tsx b/frontend/components/SettingsPage/DebugInfoSection.tsx deleted file mode 100644 index 4fa00aebf..000000000 --- a/frontend/components/SettingsPage/DebugInfoSection.tsx +++ /dev/null @@ -1,228 +0,0 @@ -import { CopyOutlined } from '@ant-design/icons'; -import { - Button, - Col, - Flex, - message, - Modal, - Row, - Spin, - Tooltip, - Typography, -} from 'antd'; -import { useCallback, useMemo, useState } from 'react'; -import styled from 'styled-components'; - -import { CHAINS } from '@/constants/chains'; -import { COLOR } from '@/constants/colors'; -import { UNICODE_SYMBOLS } from '@/constants/symbols'; -import { Token } from '@/enums/Token'; -import { useBalance } from '@/hooks/useBalance'; -import { useServices } from '@/hooks/useServices'; -import { useWallet } from '@/hooks/useWallet'; -import { WalletAddressNumberRecord } from '@/types/Records'; -import { copyToClipboard } from '@/utils/copyToClipboard'; -import { balanceFormat } from '@/utils/numberFormatters'; -import { truncateAddress } from '@/utils/truncate'; - -import { CardSection } from '../styled/CardSection'; - -const { Text, Title } = Typography; - -const DebugModal = styled(Modal)` - top: 24px; - height: calc(100vh - 48px); - display: flex; - flex-direction: column; - - .ant-modal-content { - height: calc(100vh - 48px); - display: flex; - flex-direction: column; - padding: 0; - } - - .ant-modal-header { - padding: 16px 24px; - margin: 0; - border-bottom: 1px solid ${COLOR.BORDER_GRAY}; - } - - .ant-modal-body { - display: flex; - flex-direction: column; - flex: 1; - overflow-y: auto; - border-radius: 12px; - } -`; - -const Card = styled.div` - padding: 16px 24px; - border-bottom: 1px solid ${COLOR.BORDER_GRAY}; -`; - -const ICON_STYLE = { color: '#606F85' }; - -const getItemData = ( - walletBalances: WalletAddressNumberRecord, - address: `0x${string}`, -) => ({ - balance: { - OLAS: balanceFormat(walletBalances[address]?.OLAS, 2), - ETH: balanceFormat(walletBalances[address]?.ETH, 2), - }, - address: address, - truncatedAddress: address ? truncateAddress(address) : '', -}); - -const DebugItem = ({ - item, -}: { - item: { - title: string; - balance: Record; - address: `0x${string}`; - truncatedAddress: string; - link?: { title: string; href: string }; - }; -}) => { - const onCopyToClipboard = useCallback( - () => - copyToClipboard(item.address).then(() => - message.success('Address copied!'), - ), - [item.address], - ); - - return ( - - - {item.title} - - - - - - Balance - - {item.balance.OLAS} OLAS - {item.balance.ETH} XDAI - - - - - - - Address - - - - {item.truncatedAddress} - - - - - - - - - {item.link ? ( - - - {item.link.title} {UNICODE_SYMBOLS.EXTERNAL_LINK} - - - ) : null} - - ); -}; - -export const DebugInfoSection = () => { - const { wallets, masterEoaAddress, masterSafeAddress } = useWallet(); - const { services } = useServices(); - const { walletBalances } = useBalance(); - - const [isModalOpen, setIsModalOpen] = useState(false); - const showModal = useCallback(() => setIsModalOpen(true), []); - const handleCancel = useCallback(() => setIsModalOpen(false), []); - - const data = useMemo(() => { - if (!services) return null; - if (!wallets?.length) return null; - - const result = []; - - if (masterEoaAddress) { - result.push({ - title: 'Master EOA', - ...getItemData(walletBalances, masterEoaAddress), - }); - } - - if (masterSafeAddress) { - result.push({ - title: 'Master Safe', - ...getItemData(walletBalances, masterSafeAddress), - }); - } - - const instanceAddress = - services[0]?.chain_configs?.[CHAINS.GNOSIS.chainId]?.chain_data - ?.instances?.[0]; - if (instanceAddress) { - result.push({ - title: 'Agent instance', - ...getItemData(walletBalances, instanceAddress!), - }); - } - - const multisigAddress = - services[0]?.chain_configs?.[CHAINS.GNOSIS.chainId]?.chain_data?.multisig; - if (multisigAddress) { - result.push({ - title: 'Agent Safe', - ...getItemData(walletBalances, multisigAddress), - link: { - title: 'See agent activity on Pandora', - href: `https://pandora.computer/predict/${multisigAddress}`, - }, - }); - } - - return result; - }, [ - masterEoaAddress, - masterSafeAddress, - services, - walletBalances, - wallets?.length, - ]); - - return ( - - Debug data (for devs) - - - {data ? ( - data.map((item) => ) - ) : ( - - - - )} - - - ); -}; diff --git a/frontend/components/SettingsPage/SettingsStakingContractSection.tsx b/frontend/components/SettingsPage/SettingsStakingContractSection.tsx deleted file mode 100644 index 121b36476..000000000 --- a/frontend/components/SettingsPage/SettingsStakingContractSection.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { Button, Flex, Skeleton, Typography } from 'antd'; - -import { Chain } from '@/client'; -import { SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESSES } from '@/constants/contractAddresses'; -import { UNICODE_SYMBOLS } from '@/constants/symbols'; -import { Pages } from '@/enums/PageState'; -import { usePageState } from '@/hooks/usePageState'; -import { useStakingProgram } from '@/hooks/useStakingProgram'; - -import { CardSection } from '../styled/CardSection'; - -const { Text } = Typography; - -export const SettingsStakingContractSection = () => { - const { goto } = usePageState(); - const { - activeStakingProgram, - activeStakingProgramMeta, - defaultStakingProgram, - isLoadedActiveStakingProgram, - } = useStakingProgram(); - - const stakingContractAddress = - SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESSES[Chain.GNOSIS][ - activeStakingProgram ?? defaultStakingProgram - ]; - - if (!isLoadedActiveStakingProgram) { - return ; - } - - return ( - - Staking contract - - - {activeStakingProgramMeta - ? activeStakingProgramMeta.name - : 'Not staked'} - - - Contract details {UNICODE_SYMBOLS.EXTERNAL_LINK} - - - - - ); -}; diff --git a/frontend/components/SettingsPage/index.tsx b/frontend/components/SettingsPage/index.tsx deleted file mode 100644 index 3170d1e54..000000000 --- a/frontend/components/SettingsPage/index.tsx +++ /dev/null @@ -1,134 +0,0 @@ -import { CloseOutlined, SettingOutlined } from '@ant-design/icons'; -import { Button, Card, Flex, Typography } from 'antd'; -import Link from 'next/link'; -import { useMemo } from 'react'; - -import { UNICODE_SYMBOLS } from '@/constants/symbols'; -import { Pages } from '@/enums/PageState'; -import { SettingsScreen } from '@/enums/SettingsScreen'; -import { useMasterSafe } from '@/hooks/useMasterSafe'; -import { usePageState } from '@/hooks/usePageState'; -import { useSettings } from '@/hooks/useSettings'; -import { truncateAddress } from '@/utils/truncate'; - -import { CustomAlert } from '../Alert'; -import { CardTitle } from '../Card/CardTitle'; -import { CardSection } from '../styled/CardSection'; -import { AddBackupWalletPage } from './AddBackupWalletPage'; -import { DebugInfoSection } from './DebugInfoSection'; -import { SettingsStakingContractSection } from './SettingsStakingContractSection'; - -const { Text, Paragraph } = Typography; - -const SettingsTitle = () => ( - - - Settings - - } - /> -); - -export const Settings = () => { - const { screen } = useSettings(); - const settingsScreen = useMemo(() => { - switch (screen) { - case SettingsScreen.Main: - return ; - case SettingsScreen.AddBackupWallet: - return ; - default: - return null; - } - }, [screen]); - - return settingsScreen; -}; - -const SettingsMain = () => { - const { backupSafeAddress } = useMasterSafe(); - const { goto } = usePageState(); - - const truncatedBackupSafeAddress: string | undefined = useMemo(() => { - if (backupSafeAddress) { - return truncateAddress(backupSafeAddress); - } - }, [backupSafeAddress]); - - return ( - } - bordered={false} - extra={ - - - ); -}; diff --git a/frontend/components/SetupPage/Create/SetupBackupSigner.tsx b/frontend/components/SetupPage/Create/SetupBackupSigner.tsx deleted file mode 100644 index 4862a9b45..000000000 --- a/frontend/components/SetupPage/Create/SetupBackupSigner.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { Button, Flex, Form, Input, Typography } from 'antd'; - -import { CardFlex } from '@/components/styled/CardFlex'; -import { FormFlex } from '@/components/styled/FormFlex'; -import { SetupScreen } from '@/enums/SetupScreen'; -import { useSetup } from '@/hooks/useSetup'; -import { Address } from '@/types/Address'; - -import { SetupCreateHeader } from './SetupCreateHeader'; - -export const SetupBackupSigner = () => { - const { goto } = useSetup(); - const { setBackupSigner } = useSetup(); - const [form] = Form.useForm(); - - const handleFinish = (values: { 'backup-signer': Address }) => { - setBackupSigner(values['backup-signer']); - goto(SetupScreen.SetupEoaFunding); - }; - - return ( - - - Set backup wallet - - - To keep your funds safe, we encourage you to add one of your existing - crypto wallets as a backup. This enables you to recover your funds if - you lose both your password and seed phrase. - - - - - - - - {/* Commented to protect users from skipping backup wallet setup during Alpha testing - - - Note that in the current version of the app, you will not be able to - set up a backup wallet afterward. This functionality is coming soon. - - */} - - - - ); -}; diff --git a/frontend/components/SetupPage/Create/SetupCreateHeader.tsx b/frontend/components/SetupPage/Create/SetupCreateHeader.tsx deleted file mode 100644 index d4f7bc670..000000000 --- a/frontend/components/SetupPage/Create/SetupCreateHeader.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { ArrowLeftOutlined } from '@ant-design/icons'; -import { Button, Col, Flex, Row } from 'antd'; -import Image from 'next/image'; -import { memo } from 'react'; - -import { SetupScreen } from '@/enums/SetupScreen'; -import { useSetup } from '@/hooks/useSetup'; - -export const SetupCreateHeader = memo(function SetupCreateHeader({ - prev, - disabled = false, -}: { - prev: SetupScreen; - disabled?: boolean; -}) { - const { goto } = useSetup(); - const handleBack = () => goto(prev); - return ( - - - - - ); -}; - -const AccountCreationCard = styled.div` - display: flex; - flex-direction: column; - gap: 8px; - margin-top: 24px; - margin-bottom: 24px; - padding: 16px; - background-image: url("data:image/svg+xml,%3csvg width='100%25' height='100%25' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='100%25' height='100%25' fill='none' rx='12' ry='12' stroke='%23A3AEBB' stroke-width='2' stroke-dasharray='6' stroke-dashoffset='15' stroke-linecap='square'/%3e%3c/svg%3e"); - border-radius: 12px; -`; - -const ICON_STYLE = { color: '#606F85' }; diff --git a/frontend/components/SetupPage/Create/SetupPassword.tsx b/frontend/components/SetupPage/Create/SetupPassword.tsx deleted file mode 100644 index 4907724af..000000000 --- a/frontend/components/SetupPage/Create/SetupPassword.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { Button, Checkbox, Form, Input, message, Typography } from 'antd'; -import { useState } from 'react'; - -import { Chain } from '@/client'; -import { SetupScreen } from '@/enums/SetupScreen'; -import { useSetup } from '@/hooks/useSetup'; -import { AccountService } from '@/service/Account'; -import { WalletService } from '@/service/Wallet'; - -import { CardFlex } from '../../styled/CardFlex'; -import { SetupCreateHeader } from './SetupCreateHeader'; - -const { Title, Text } = Typography; - -export const SetupPassword = () => { - const { goto, setMnemonic } = useSetup(); - const [form] = Form.useForm<{ password: string; terms: boolean }>(); - - const [isLoading, setIsLoading] = useState(false); - - const isTermsAccepted = Form.useWatch('terms', form); - - const handleCreateEoa = async ({ password }: { password: string }) => { - if (!isTermsAccepted) return; - - setIsLoading(true); - AccountService.createAccount(password) - .then(() => AccountService.loginAccount(password)) - .then(() => WalletService.createEoa(Chain.GNOSIS)) - .then(({ mnemonic }: { mnemonic: string[] }) => { - setMnemonic(mnemonic); - goto(SetupScreen.SetupSeedPhrase); - }) - .catch((e) => { - console.error(e); - message.error('Unable to create account, please try again.'); - }) - .finally(() => setIsLoading(false)); - }; - - return ( - - - Create password - Come up with a strong password. - -
form.validateFields(['terms'])} - > - - - - - - - I agree to the Pearl’s{' '} - - Terms & Conditions - - - - - - - -
-
- ); -}; diff --git a/frontend/components/SetupPage/Create/SetupSeedPhrase.tsx b/frontend/components/SetupPage/Create/SetupSeedPhrase.tsx deleted file mode 100644 index 5b32a4cdb..000000000 --- a/frontend/components/SetupPage/Create/SetupSeedPhrase.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { CopyOutlined } from '@ant-design/icons'; -import { Button, Flex, message, Tag, Typography } from 'antd'; - -import { SetupScreen } from '@/enums/SetupScreen'; -import { useSetup } from '@/hooks/useSetup'; -import { copyToClipboard } from '@/utils/copyToClipboard'; - -import { CardFlex } from '../../styled/CardFlex'; -import { SetupCreateHeader } from './SetupCreateHeader'; - -export const SetupSeedPhrase = () => { - const { mnemonic, goto } = useSetup(); - - const handleNext = () => { - goto(SetupScreen.SetupBackupSigner); - }; - - return ( - - - Back up seed phrase - - Seed phrase is needed to regain access to your account if you forget the - password. - - - {mnemonic.map((word: string) => ( - {word} - ))} - - - - - ); -}; diff --git a/frontend/components/SetupPage/SetupRestore.tsx b/frontend/components/SetupPage/SetupRestore.tsx deleted file mode 100644 index 99f57d61d..000000000 --- a/frontend/components/SetupPage/SetupRestore.tsx +++ /dev/null @@ -1,197 +0,0 @@ -import { CloseOutlined } from '@ant-design/icons'; -import { Button, Col, Flex, Form, Input, Row, Tooltip, Typography } from 'antd'; -import isEmpty from 'lodash/isEmpty'; -import { memo, useMemo, useState } from 'react'; - -import { CardFlex } from '@/components/styled/CardFlex'; -import { CardSection } from '@/components/styled/CardSection'; -import { SetupScreen } from '@/enums/SetupScreen'; -import { useSetup } from '@/hooks/useSetup'; - -const ExitButton = memo(function ExitButton() { - const { goto } = useSetup(); - return ( - - ); -}); - -export const SetupRestoreMain = () => { - const { goto } = useSetup(); - return ( - - - Restore access - - - - } - > - - - You can recover the Pearl account access by providing the seed phrase - you received when setting up your account. - - - - - - - - If you don’t have the seed phrase but added a backup wallet to your - account, you can still restore your funds, but you won’t be able to - recover access to your Pearl account. - - - - - ); -}; - -const SEED_PHRASE_WORDS = 12; -export const SetupRestoreViaSeed = () => { - const { goto } = useSetup(); - - const [form] = Form.useForm(); - const [formValues, setFormValues] = useState<{ [name: string]: string }>({}); - - const onValuesChange = ( - changedValues: { [name: string]: string }, - allValues: { [name: string]: string }, - ) => setFormValues(allValues); - - const isComplete = useMemo( - () => - !isEmpty(formValues) && - Object.values(formValues).every((v: string) => v && v.trim()), - [formValues], - ); - - return ( - - - Restore via seed phrase - - - - } - > - - - To restore access to your Pearl account, enter the seed phrase you - received when setting up your account. - -
- - - {[...new Array(SEED_PHRASE_WORDS)].map((_, i) => ( - - - - - - ))} - - - -
-
-
- ); -}; - -export const SetupRestoreSetPassword = () => { - const { goto } = useSetup(); - const [password, setPassword] = useState(''); - return ( - - - Set password - - - - } - > - - - Come up with a strong password to get access to the Pearl account in - the future. - - - setPassword(e.target.value)} - placeholder="Password" - size="large" - value={password} - /> - - - - - ); -}; - -export const SetupRestoreViaBackup = () => { - return ( - - - Set password - - - - } - > - - - To restore access to the funds in your Pearl account, please follow - the instructions below. - - - Note that the backup wallet won’t give you access to your Pearl - account but only to the funds stored on it. - - - - ); -}; diff --git a/frontend/components/SetupPage/SetupWelcome.tsx b/frontend/components/SetupPage/SetupWelcome.tsx deleted file mode 100644 index b12c2ebfa..000000000 --- a/frontend/components/SetupPage/SetupWelcome.tsx +++ /dev/null @@ -1,197 +0,0 @@ -import { - Button, - Card, - Flex, - Form, - Input, - message, - Spin, - Typography, -} from 'antd'; -import Image from 'next/image'; -import { useCallback, useEffect, useMemo, useState } from 'react'; - -import { AccountIsSetup } from '@/client'; -import { Pages } from '@/enums/PageState'; -import { SetupScreen } from '@/enums/SetupScreen'; -import { useBalance } from '@/hooks/useBalance'; -import { useElectronApi } from '@/hooks/useElectronApi'; -import { usePageState } from '@/hooks/usePageState'; -import { useSetup } from '@/hooks/useSetup'; -import { useWallet } from '@/hooks/useWallet'; -import { AccountService } from '@/service/Account'; - -import { FormFlex } from '../styled/FormFlex'; - -const { Title } = Typography; - -export const SetupWelcome = () => { - const electronApi = useElectronApi(); - const [isSetup, setIsSetup] = useState(null); - - useEffect(() => { - if (isSetup !== null) return; - setIsSetup(AccountIsSetup.Loading); - - AccountService.getAccount() - .then((res) => { - switch (res.is_setup) { - case true: - setIsSetup(AccountIsSetup.True); - break; - case false: - // Reset persistent state - // if creating new account - electronApi.store?.clear?.(); - setIsSetup(AccountIsSetup.False); - break; - default: - setIsSetup(AccountIsSetup.Error); - break; - } - }) - .catch((e) => { - console.error(e); - setIsSetup(AccountIsSetup.Error); - }); - }, [electronApi.store, isSetup]); - - const welcomeScreen = useMemo(() => { - switch (isSetup) { - case AccountIsSetup.True: - return ; - case AccountIsSetup.False: - return ; - case AccountIsSetup.Loading: - return ( - - - - ); - default: - return ( - - - Error determining account setup state. - - - ); - } - }, [isSetup]); - - return ( - - - Onboarding Robot - Pearl - - {welcomeScreen} - - ); -}; - -export const SetupWelcomeCreate = () => { - const { goto } = useSetup(); - - return ( - - - - - ); -}; - -export const SetupWelcomeLogin = () => { - const { goto } = useSetup(); - const { goto: gotoPage } = usePageState(); - - const { masterSafeAddress, wallets } = useWallet(); - const { isBalanceLoaded, eoaBalance } = useBalance(); - - const [isLoggingIn, setIsLoggingIn] = useState(false); - const [canNavigate, setCanNavigate] = useState(false); - - const [form] = Form.useForm(); - - const handleLogin = useCallback( - async ({ password }: { password: string }) => { - setIsLoggingIn(true); - AccountService.loginAccount(password) - .then(() => { - setCanNavigate(true); - }) - .catch((e) => { - console.error(e); - setIsLoggingIn(false); - message.error('Invalid password'); - }); - }, - [], - ); - - useEffect(() => { - // Navigate only when wallets and balances are loaded - // To check if some setup steps were missed - if (canNavigate && wallets?.length && isBalanceLoaded) { - setIsLoggingIn(false); - if (!eoaBalance?.ETH) { - goto(SetupScreen.SetupEoaFundingIncomplete); - } else if (!masterSafeAddress) { - goto(SetupScreen.SetupCreateSafe); - } else { - gotoPage(Pages.Main); - } - } - }, [ - canNavigate, - eoaBalance?.ETH, - goto, - gotoPage, - isBalanceLoaded, - masterSafeAddress, - wallets?.length, - ]); - - return ( - - - - - - - - - - ); -}; diff --git a/frontend/components/SetupPage/index.tsx b/frontend/components/SetupPage/index.tsx deleted file mode 100644 index 598ff10ac..000000000 --- a/frontend/components/SetupPage/index.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { useContext, useMemo } from 'react'; - -import { SetupContext } from '@/context/SetupProvider'; -import { SetupScreen } from '@/enums/SetupScreen'; - -import { SetupBackupSigner } from './Create/SetupBackupSigner'; -import { SetupCreateSafe } from './Create/SetupCreateSafe'; -import { SetupEoaFunding } from './Create/SetupEoaFunding'; -import { SetupPassword } from './Create/SetupPassword'; -import { SetupSeedPhrase } from './Create/SetupSeedPhrase'; -import { - SetupRestoreMain, - SetupRestoreSetPassword, - SetupRestoreViaBackup, - SetupRestoreViaSeed, -} from './SetupRestore'; -import { SetupWelcome } from './SetupWelcome'; - -export const Setup = () => { - const { setupObject } = useContext(SetupContext); - const setupScreen = useMemo(() => { - switch (setupObject.state) { - case SetupScreen.Welcome: - return ; - // Create account - case SetupScreen.SetupPassword: - return ; - case SetupScreen.SetupSeedPhrase: - return ; - case SetupScreen.SetupBackupSigner: - return ; - case SetupScreen.SetupEoaFunding: - return ; - case SetupScreen.SetupEoaFundingIncomplete: - return ; - case SetupScreen.SetupCreateSafe: - return ; - // Restore account - case SetupScreen.Restore: - return ; - case SetupScreen.RestoreViaSeed: - return ; - case SetupScreen.RestoreSetPassword: - return ; - case SetupScreen.RestoreViaBackup: - return ; - default: - return <>Error; - } - }, [setupObject.state]); - - return setupScreen; -}; diff --git a/frontend/components/styled/CardFlex.tsx b/frontend/components/styled/CardFlex.tsx deleted file mode 100644 index 38a20412d..000000000 --- a/frontend/components/styled/CardFlex.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { Card } from 'antd'; -import styled from 'styled-components'; - -type CardFlexProps = { - gap?: number; -}; -export const CardFlex = styled(Card)` - .ant-card-body { - ${(props) => { - const { gap } = props; - - const gapStyle = gap ? `gap: ${gap}px;` : ''; - - return `${gapStyle}`; - }} - display: flex; - flex-direction: column; - } -`; diff --git a/frontend/components/styled/CardSection.tsx b/frontend/components/styled/CardSection.tsx deleted file mode 100644 index 0a1b653a0..000000000 --- a/frontend/components/styled/CardSection.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { Flex, FlexProps } from 'antd'; -import styled from 'styled-components'; - -import { COLOR } from '@/constants/colors'; - -type CardSectionProps = FlexProps & { - bordertop?: 'true' | 'false'; - borderbottom?: 'true' | 'false'; - padding?: string; -}; - -/** - * A styled `Flex` component that represents a section of a card. - * @param {CardSectionProps} props - */ -export const CardSection = styled(Flex)` - ${(props) => { - const { padding, borderbottom, bordertop } = props; - - const paddingStyle = `padding: ${padding ?? '24px'};`; - const borderTopStyle = - bordertop === 'true' ? `border-top: 1px solid ${COLOR.BORDER_GRAY};` : ''; - const borderBottomStyle = - borderbottom === 'true' - ? `border-bottom: 1px solid ${COLOR.BORDER_GRAY};` - : ''; - - return ` - ${paddingStyle} - ${borderTopStyle} - ${borderBottomStyle} - `; - }} - border-collapse: collapse; - margin-left: -24px; - margin-right: -24px; - - &:nth-child(1) { - margin-top: -24px; - } - - &:nth-last-child(1) { - margin-bottom: -24px; - } -`; diff --git a/frontend/components/styled/FormFlex.tsx b/frontend/components/styled/FormFlex.tsx deleted file mode 100644 index 0799be636..000000000 --- a/frontend/components/styled/FormFlex.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import { Form, FormProps } from 'antd'; -import styled from 'styled-components'; - -export const FormFlex = styled(Form)` - display: flex; - flex-direction: column; -`; diff --git a/frontend/constants/chains.ts b/frontend/constants/chains.ts deleted file mode 100644 index d77784665..000000000 --- a/frontend/constants/chains.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const CHAINS: { - [chain: string]: { - currency: string; - chainId: number; - }; -} = { - GNOSIS: { currency: 'XDAI', chainId: 100 }, -}; diff --git a/frontend/constants/colors.ts b/frontend/constants/colors.ts deleted file mode 100644 index 7625d03ee..000000000 --- a/frontend/constants/colors.ts +++ /dev/null @@ -1,12 +0,0 @@ -export const COLOR = { - RED: '#EA3324', - GREEN_2: '#00F422', - PURPLE: '#722ed1', - PURPLE_DARK: '#36075F', - BLUE: '#1677FF', - ORANGE: '#FAAD14', - WHITE: '#ffffff', - BORDER_GRAY: '#DFE5EE', - BROWN: '#873800', - TEXT: '#1f2229', -}; diff --git a/frontend/constants/contractAddresses.ts b/frontend/constants/contractAddresses.ts deleted file mode 100644 index bf76ee672..000000000 --- a/frontend/constants/contractAddresses.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Chain } from '@/client'; -import { StakingProgram } from '@/enums/StakingProgram'; -import { Address } from '@/types/Address'; - -export const MULTICALL_CONTRACT_ADDRESS: Address = - '0xcA11bde05977b3631167028862bE2a173976CA11'; // https://github.com/mds1/multicall, https://www.multicall3.com/ - -export const SERVICE_REGISTRY_L2_CONTRACT_ADDRESS: Record = { - [Chain.GNOSIS]: '0x9338b5153AE39BB89f50468E608eD9d764B755fD', -}; - -export const SERVICE_REGISTRY_TOKEN_UTILITY_CONTRACT_ADDRESS: Record< - number, - Address -> = { - [Chain.GNOSIS]: '0xa45E64d13A30a51b91ae0eb182e88a40e9b18eD8', -}; - -export const SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESSES: Record< - number, - Record -> = { - [Chain.GNOSIS]: { - // Maintain order, as it is used in the UI - [StakingProgram.Beta]: '0xeF44Fb0842DDeF59D37f85D61A1eF492bbA6135d', - [StakingProgram.Alpha]: '0xEE9F19b5DF06c7E8Bfc7B28745dcf944C504198A', - }, -}; - -export const AGENT_MECH_CONTRACT_ADDRESS: Record = { - [Chain.GNOSIS]: '0x77af31De935740567Cf4fF1986D04B2c964A786a', -}; - -export const MECH_ACTIVITY_CHECKER_CONTRACT_ADDRESS: Record = { - [Chain.GNOSIS]: '0x155547857680A6D51bebC5603397488988DEb1c8', -}; diff --git a/frontend/constants/env.ts b/frontend/constants/env.ts deleted file mode 100644 index 0bd4ecf30..000000000 --- a/frontend/constants/env.ts +++ /dev/null @@ -1 +0,0 @@ -export const isDev = process.env.NODE_ENV === 'development'; diff --git a/frontend/constants/intervals.ts b/frontend/constants/intervals.ts deleted file mode 100644 index 50afd39d0..000000000 --- a/frontend/constants/intervals.ts +++ /dev/null @@ -1 +0,0 @@ -export const FIVE_SECONDS_INTERVAL = 5000; diff --git a/frontend/constants/providers.ts b/frontend/constants/providers.ts deleted file mode 100644 index 760924018..000000000 --- a/frontend/constants/providers.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { ethers } from 'ethers'; -import { Provider } from 'ethers-multicall'; - -export const gnosisProvider = new ethers.providers.StaticJsonRpcProvider( - process.env.GNOSIS_RPC, -); - -export const gnosisMulticallProvider = new Provider(gnosisProvider, 100); diff --git a/frontend/constants/serviceTemplates.ts b/frontend/constants/serviceTemplates.ts deleted file mode 100644 index 19948f76a..000000000 --- a/frontend/constants/serviceTemplates.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { ServiceTemplate } from '@/client'; -import { StakingProgram } from '@/enums/StakingProgram'; - -export const SERVICE_TEMPLATES: ServiceTemplate[] = [ - { - name: 'Trader Agent', - hash: 'bafybeicrstlxew36hlxl7pzi73nmd44aibnhwxzkchzlec6t6yhvs7gvhy', - // hash: 'bafybeibbloa4w33vj4bvdkso7pzk6tr3duvxjpecbx4mur4ix6ehnwb5uu', // temporary - description: 'Trader agent for omen prediction markets', - image: - 'https://operate.olas.network/_next/image?url=%2Fimages%2Fprediction-agent.png&w=3840&q=75', - service_version: 'v0.18.1', - home_chain_id: '100', - configurations: { - 100: { - staking_program_id: StakingProgram.Beta, // default, may be overwritten - nft: 'bafybeig64atqaladigoc3ds4arltdu63wkdrk3gesjfvnfdmz35amv7faq', - agent_id: 14, - threshold: 1, - use_staking: true, - cost_of_bond: 10000000000000000, - monthly_gas_estimate: 10000000000000000000, - fund_requirements: { - agent: 100000000000000000, - safe: 5000000000000000000, - }, - }, - }, - }, -]; diff --git a/frontend/constants/stakingProgramMeta.ts b/frontend/constants/stakingProgramMeta.ts deleted file mode 100644 index f060c3ab2..000000000 --- a/frontend/constants/stakingProgramMeta.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { StakingProgram } from '@/enums/StakingProgram'; - -export const STAKING_PROGRAM_META: Record< - StakingProgram, - { - name: string; - } -> = { - [StakingProgram.Alpha]: { - name: 'Pearl Alpha', - }, - [StakingProgram.Beta]: { - name: 'Pearl Beta', - }, -}; diff --git a/frontend/constants/symbols.ts b/frontend/constants/symbols.ts deleted file mode 100644 index 14c16e9f2..000000000 --- a/frontend/constants/symbols.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const UNICODE_SYMBOLS = { - OLAS: '☴', - EXTERNAL_LINK: '↗', -}; diff --git a/frontend/constants/thresholds.ts b/frontend/constants/thresholds.ts deleted file mode 100644 index 9566aab8e..000000000 --- a/frontend/constants/thresholds.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Chain } from '@/client'; - -export const MIN_ETH_BALANCE_THRESHOLDS = { - [Chain.GNOSIS]: { - safeCreation: 1.5, - safeAddSigner: 0.1, - }, -}; - -export const LOW_AGENT_SAFE_BALANCE = 0.5; -export const LOW_MASTER_SAFE_BALANCE = 2; diff --git a/frontend/constants/tokens.ts b/frontend/constants/tokens.ts deleted file mode 100644 index 89940ab80..000000000 --- a/frontend/constants/tokens.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Address } from '@/types/Address'; - -export const TOKENS: { [chain: string]: { [token: string]: Address } } = { - gnosis: { - OLAS: '0xcE11e14225575945b8E6Dc0D4F2dD4C570f79d9f', - }, -}; diff --git a/frontend/constants/urls.ts b/frontend/constants/urls.ts deleted file mode 100644 index 9336660f6..000000000 --- a/frontend/constants/urls.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const BACKEND_URL: string = `http://localhost:${process.env.NODE_ENV === 'production' ? 8765 : 8000}/api`; -export const COW_SWAP_GNOSIS_XDAI_OLAS_URL: string = - 'https://swap.cow.fi/#/100/swap/WXDAI/OLAS'; - -export const SUPPORT_URL = - 'https://discord.com/channels/899649805582737479/1244588374736502847'; -export const FAQ_URL = 'https://olas.network/operate#faq'; diff --git a/frontend/context/BalanceProvider.tsx b/frontend/context/BalanceProvider.tsx deleted file mode 100644 index 2bee8e074..000000000 --- a/frontend/context/BalanceProvider.tsx +++ /dev/null @@ -1,328 +0,0 @@ -import { message } from 'antd'; -import { isAddress } from 'ethers/lib/utils'; -import { isNumber } from 'lodash'; -import { ValueOf } from 'next/dist/shared/lib/constants'; -import { - createContext, - Dispatch, - PropsWithChildren, - SetStateAction, - useCallback, - useContext, - useMemo, - useState, -} from 'react'; -import { useInterval } from 'usehooks-ts'; - -import { Wallet } from '@/client'; -import { CHAINS } from '@/constants/chains'; -import { FIVE_SECONDS_INTERVAL } from '@/constants/intervals'; -import { - LOW_AGENT_SAFE_BALANCE, - LOW_MASTER_SAFE_BALANCE, -} from '@/constants/thresholds'; -import { TOKENS } from '@/constants/tokens'; -import { ServiceRegistryL2ServiceState } from '@/enums/ServiceRegistryL2ServiceState'; -import { Token } from '@/enums/Token'; -import { AutonolasService } from '@/service/Autonolas'; -import { EthersService } from '@/service/Ethers'; -import MulticallService from '@/service/Multicall'; -import { Address } from '@/types/Address'; -import { - AddressNumberRecord, - WalletAddressNumberRecord, -} from '@/types/Records'; - -import { OnlineStatusContext } from './OnlineStatusProvider'; -import { RewardContext } from './RewardProvider'; -import { ServicesContext } from './ServicesProvider'; -import { WalletContext } from './WalletProvider'; - -export const BalanceContext = createContext<{ - isLoaded: boolean; - setIsLoaded: Dispatch>; - isBalanceLoaded: boolean; - olasBondBalance?: number; - olasDepositBalance?: number; - eoaBalance?: ValueOf; - safeBalance?: ValueOf; - totalEthBalance?: number; - totalOlasBalance?: number; - isLowBalance: boolean; - wallets?: Wallet[]; - walletBalances: WalletAddressNumberRecord; - updateBalances: () => Promise; - setIsPaused: Dispatch>; - totalOlasStakedBalance?: number; -}>({ - isLoaded: false, - setIsLoaded: () => {}, - isBalanceLoaded: false, - olasBondBalance: undefined, - olasDepositBalance: undefined, - eoaBalance: undefined, - safeBalance: undefined, - totalEthBalance: undefined, - totalOlasBalance: undefined, - isLowBalance: false, - wallets: undefined, - walletBalances: {}, - updateBalances: async () => {}, - setIsPaused: () => {}, - totalOlasStakedBalance: undefined, -}); - -export const BalanceProvider = ({ children }: PropsWithChildren) => { - const { isOnline } = useContext(OnlineStatusContext); - const { wallets, masterEoaAddress, masterSafeAddress } = - useContext(WalletContext); - const { services, serviceAddresses } = useContext(ServicesContext); - const { optimisticRewardsEarnedForEpoch, accruedServiceStakingRewards } = - useContext(RewardContext); - - const [isLoaded, setIsLoaded] = useState(false); - const [isPaused, setIsPaused] = useState(false); - const [olasDepositBalance, setOlasDepositBalance] = useState(); - const [olasBondBalance, setOlasBondBalance] = useState(); - const [isBalanceLoaded, setIsBalanceLoaded] = useState(false); - const [walletBalances, setWalletBalances] = - useState({}); - - const totalEthBalance: number | undefined = useMemo(() => { - if (!isLoaded) return; - return Object.values(walletBalances).reduce( - (acc: number, walletBalance) => acc + walletBalance.ETH, - 0, - ); - }, [isLoaded, walletBalances]); - - const totalOlasBalance: number | undefined = useMemo(() => { - if (!isLoaded) return; - - const sumWalletBalances = Object.values(walletBalances).reduce( - (acc: number, walletBalance) => acc + walletBalance.OLAS, - 0, - ); - - const total = - sumWalletBalances + - (olasDepositBalance ?? 0) + - (olasBondBalance ?? 0) + - (optimisticRewardsEarnedForEpoch ?? 0) + - (accruedServiceStakingRewards ?? 0); - - return total; - }, [ - accruedServiceStakingRewards, - isLoaded, - olasBondBalance, - olasDepositBalance, - optimisticRewardsEarnedForEpoch, - walletBalances, - ]); - - const totalOlasStakedBalance: number | undefined = useMemo(() => { - if (!isLoaded) return; - return (olasBondBalance ?? 0) + (olasDepositBalance ?? 0); - }, [isLoaded, olasBondBalance, olasDepositBalance]); - - const updateBalances = useCallback(async (): Promise => { - if (!masterEoaAddress) return; - if (!serviceAddresses) return; - - try { - const walletAddresses: Address[] = []; - if (masterEoaAddress) walletAddresses.push(masterEoaAddress); - if (masterSafeAddress) walletAddresses.push(masterSafeAddress); - if (serviceAddresses) walletAddresses.push(...serviceAddresses); - - const walletBalances = await getWalletBalances(walletAddresses); - if (!walletBalances) return; - - setWalletBalances(walletBalances); - - const serviceId = - services?.[0]?.chain_configs[CHAINS.GNOSIS.chainId].chain_data.token; - - if (!isNumber(serviceId)) { - setIsLoaded(true); - setIsBalanceLoaded(true); - return; - } - - if (masterSafeAddress && serviceId) { - const { depositValue, bondValue, serviceState } = - await AutonolasService.getServiceRegistryInfo( - masterSafeAddress, - serviceId, - ); - - switch (serviceState) { - case ServiceRegistryL2ServiceState.NonExistent: - setOlasBondBalance(0); - setOlasDepositBalance(0); - break; - case ServiceRegistryL2ServiceState.PreRegistration: - setOlasBondBalance(0); - setOlasDepositBalance(0); - break; - case ServiceRegistryL2ServiceState.ActiveRegistration: - setOlasBondBalance(0); - setOlasDepositBalance(depositValue); - break; - case ServiceRegistryL2ServiceState.FinishedRegistration: - setOlasBondBalance(bondValue); - setOlasDepositBalance(depositValue); - break; - case ServiceRegistryL2ServiceState.Deployed: - setOlasBondBalance(bondValue); - setOlasDepositBalance(depositValue); - break; - case ServiceRegistryL2ServiceState.TerminatedBonded: - setOlasBondBalance(bondValue); - setOlasDepositBalance(0); - break; - } - } - - // update balance loaded state - setIsLoaded(true); - setIsBalanceLoaded(true); - } catch (error) { - console.error(error); - message.error('Unable to retrieve wallet balances'); - setIsBalanceLoaded(true); - } - }, [masterEoaAddress, masterSafeAddress, serviceAddresses, services]); - - const eoaBalance = useMemo( - () => masterEoaAddress && walletBalances[masterEoaAddress], - [masterEoaAddress, walletBalances], - ); - const safeBalance = useMemo( - () => masterSafeAddress && walletBalances[masterSafeAddress], - [masterSafeAddress, walletBalances], - ); - const agentSafeBalance = useMemo( - () => - services?.[0]?.chain_configs[CHAINS.GNOSIS.chainId].chain_data - ?.multisig && - walletBalances[ - services[0].chain_configs[CHAINS.GNOSIS.chainId].chain_data.multisig! - ], - [services, walletBalances], - ); - const isLowBalance = useMemo(() => { - if (!safeBalance || !agentSafeBalance) return false; - if ( - safeBalance.ETH < LOW_MASTER_SAFE_BALANCE && - // Need to check agentSafe balance as well, because it's auto-funded from safeBalance - agentSafeBalance.ETH < LOW_AGENT_SAFE_BALANCE - ) - return true; - return false; - }, [safeBalance, agentSafeBalance]); - - useInterval( - () => { - updateBalances(); - }, - isPaused || !isOnline ? null : FIVE_SECONDS_INTERVAL, - ); - - return ( - - {children} - - ); -}; - -export const getEthBalances = async ( - walletAddresses: Address[], -): Promise => { - const rpcIsValid = await EthersService.checkRpc(`${process.env.GNOSIS_RPC}`); - if (!rpcIsValid) return; - - const ethBalances = await MulticallService.getEthBalances(walletAddresses); - - return ethBalances; -}; - -export const getOlasBalances = async ( - walletAddresses: Address[], -): Promise => { - const rpcIsValid = await EthersService.checkRpc(`${process.env.GNOSIS_RPC}`); - if (!rpcIsValid) return; - - const olasBalances = await MulticallService.getErc20Balances( - walletAddresses, - TOKENS.gnosis.OLAS, - ); - - return olasBalances; -}; - -export const getWalletAddresses = ( - wallets: Wallet[], - serviceAddresses: Address[], -): Address[] => { - const walletsToCheck: Address[] = []; - - for (const wallet of wallets) { - const { address, safe } = wallet; - if (address && isAddress(address)) { - walletsToCheck.push(address); - } - if (safe && isAddress(safe)) { - walletsToCheck.push(safe); - } - } - - for (const serviceAddress of serviceAddresses) { - if (serviceAddress && isAddress(`${serviceAddress}`)) { - walletsToCheck.push(serviceAddress); - } - } - - return walletsToCheck; -}; - -export const getWalletBalances = async ( - walletAddresses: Address[], -): Promise => { - const [ethBalances, olasBalances] = await Promise.all([ - getEthBalances(walletAddresses), - getOlasBalances(walletAddresses), - ]); - - if (!ethBalances) return; - if (!olasBalances) return; - - const tempWalletBalances: WalletAddressNumberRecord = {}; - for (const [address, balance] of Object.entries(ethBalances)) { - tempWalletBalances[address as Address] = { - [Token.ETH]: balance, - [Token.OLAS]: olasBalances[address as Address], - }; - } - - return tempWalletBalances; -}; diff --git a/frontend/context/ElectronApiProvider.tsx b/frontend/context/ElectronApiProvider.tsx deleted file mode 100644 index 01f85bdf9..000000000 --- a/frontend/context/ElectronApiProvider.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import { get } from 'lodash'; -import { createContext, PropsWithChildren } from 'react'; - -import { ElectronStore, ElectronTrayIconStatus } from '@/types/ElectronApi'; - -type ElectronApiContextProps = { - closeApp?: () => void; - minimizeApp?: () => void; - setTrayIcon?: (status: ElectronTrayIconStatus) => void; - ipcRenderer?: { - send?: (channel: string, data: unknown) => void; // send messages to main process - on?: ( - channel: string, - func: (event: unknown, data: unknown) => void, - ) => void; // listen to messages from main process - invoke?: (channel: string, data: unknown) => Promise; // send message to main process and get Promise response - }; - store?: { - store?: () => Promise; - get?: (key: string) => Promise; - set?: (key: string, value: unknown) => Promise; - delete?: (key: string) => Promise; - clear?: () => Promise; - }; - setAppHeight?: (height: unknown) => void; - notifyAgentRunning?: () => void; - showNotification?: (title: string, body?: string) => void; - saveLogs?: (data: { - store?: ElectronStore; - debugData?: Record; - }) => Promise<{ success: true; dirPath: string } | { success?: false }>; - openPath?: (filePath: string) => void; -}; - -export const ElectronApiContext = createContext({ - closeApp: () => {}, - minimizeApp: () => {}, - setTrayIcon: () => {}, - ipcRenderer: { - send: () => {}, - on: () => {}, - invoke: async () => {}, - }, - store: { - store: async () => ({}), - get: async () => {}, - set: async () => {}, - delete: async () => {}, - clear: async () => {}, - }, - setAppHeight: () => {}, - saveLogs: async () => ({ success: false }), - openPath: () => {}, -}); - -export const ElectronApiProvider = ({ children }: PropsWithChildren) => { - const getElectronApiFunction = (functionNameInWindow: string) => { - if (typeof window === 'undefined') return; - - const fn = get(window, `electronAPI.${functionNameInWindow}`); - if (!fn || typeof fn !== 'function') { - throw new Error( - `Function ${functionNameInWindow} not found in window.electronAPI`, - ); - } - - return fn; - }; - - return ( - - {children} - - ); -}; diff --git a/frontend/context/MasterSafeProvider.tsx b/frontend/context/MasterSafeProvider.tsx deleted file mode 100644 index 46daeaba1..000000000 --- a/frontend/context/MasterSafeProvider.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { - createContext, - PropsWithChildren, - useContext, - useMemo, - useState, -} from 'react'; -import { useInterval } from 'usehooks-ts'; - -import { FIVE_SECONDS_INTERVAL } from '@/constants/intervals'; -import { GnosisSafeService } from '@/service/GnosisSafe'; -import { Address } from '@/types/Address'; - -import { OnlineStatusContext } from './OnlineStatusProvider'; -import { WalletContext } from './WalletProvider'; - -export const MasterSafeContext = createContext<{ - backupSafeAddress?: Address; - masterSafeAddress?: Address; - masterEoaAddress?: Address; - masterSafeOwners?: Address[]; - updateMasterSafeOwners?: () => Promise; -}>({ - backupSafeAddress: undefined, - masterSafeAddress: undefined, - masterEoaAddress: undefined, - masterSafeOwners: undefined, - updateMasterSafeOwners: async () => {}, -}); - -export const MasterSafeProvider = ({ children }: PropsWithChildren) => { - const { isOnline } = useContext(OnlineStatusContext); - const { masterSafeAddress, masterEoaAddress } = useContext(WalletContext); - - const [masterSafeOwners, setMasterSafeOwners] = useState(); - - const backupSafeAddress = useMemo
(() => { - if (!masterEoaAddress) return; - if (!masterSafeOwners) return; - if (!masterSafeOwners.length) return; - if (!masterSafeOwners.includes(masterEoaAddress)) { - console.error('Safe not owned by master EOA'); - return; - } - - const currentBackupAddress = masterSafeOwners.find( - (address) => address !== masterEoaAddress, - ); - - return currentBackupAddress; - }, [masterEoaAddress, masterSafeOwners]); - - const updateMasterSafeOwners = async () => { - if (!masterSafeAddress) return; - try { - const safeSigners = await GnosisSafeService.getOwners({ - address: masterSafeAddress, - }); - if (!safeSigners) return; - setMasterSafeOwners(safeSigners); - } catch (error) { - console.error('Error fetching safe owners', error); - } - }; - - useInterval( - updateMasterSafeOwners, - (masterSafeOwners && masterSafeOwners.length >= 2) || !isOnline - ? null - : FIVE_SECONDS_INTERVAL, - ); - - return ( - - {children} - - ); -}; diff --git a/frontend/context/ModalProvider.tsx b/frontend/context/ModalProvider.tsx deleted file mode 100644 index 90768cce4..000000000 --- a/frontend/context/ModalProvider.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { - createContext, - Dispatch, - PropsWithChildren, - SetStateAction, - useState, -} from 'react'; - -import { MigrationSuccessModal } from '@/components/MainPage/modals/MigrationModal'; - -export const ModalContext = createContext<{ - migrationModalOpen: boolean; - setMigrationModalOpen: Dispatch>; -}>({ - migrationModalOpen: false, - setMigrationModalOpen: () => {}, -}); - -export const ModalProvider = ({ children }: PropsWithChildren) => { - const [migrationModalOpen, setMigrationModalOpen] = useState(false); - - return ( - - setMigrationModalOpen(false)} - /> - {children} - - ); -}; diff --git a/frontend/context/OnlineStatusProvider.tsx b/frontend/context/OnlineStatusProvider.tsx deleted file mode 100644 index c1bcfc2f2..000000000 --- a/frontend/context/OnlineStatusProvider.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import React, { - createContext, - PropsWithChildren, - useEffect, - useState, -} from 'react'; - -type OnlineStatusContextProps = { - isOnline: boolean; -}; - -const initialState = { - isOnline: true, -}; - -const OnlineStatusContext = - createContext(initialState); - -const OnlineStatusProvider = ({ children }: PropsWithChildren) => { - const [isOnline, setIsOnline] = useState(initialState.isOnline); - - useEffect(() => { - const updateOnlineStatus = () => { - setIsOnline(navigator.onLine); - }; - - window.addEventListener('online', updateOnlineStatus); - window.addEventListener('offline', updateOnlineStatus); - - return () => { - window.removeEventListener('online', updateOnlineStatus); - window.removeEventListener('offline', updateOnlineStatus); - }; - }, []); - - return ( - - {children} - - ); -}; - -export { OnlineStatusContext, OnlineStatusProvider }; diff --git a/frontend/context/PageStateProvider.tsx b/frontend/context/PageStateProvider.tsx deleted file mode 100644 index 699cf359e..000000000 --- a/frontend/context/PageStateProvider.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { - createContext, - Dispatch, - PropsWithChildren, - SetStateAction, - useState, -} from 'react'; - -import { Pages } from '@/enums/PageState'; - -type PageStateContextType = { - pageState: Pages; - setPageState: Dispatch>; -}; - -export const PageStateContext = createContext({ - pageState: Pages.Setup, - setPageState: () => {}, -}); - -export const PageStateProvider = ({ children }: PropsWithChildren) => { - const [pageState, setPageState] = useState(Pages.Setup); - - return ( - - {children} - - ); -}; diff --git a/frontend/context/RewardProvider.tsx b/frontend/context/RewardProvider.tsx deleted file mode 100644 index b5b5480c0..000000000 --- a/frontend/context/RewardProvider.tsx +++ /dev/null @@ -1,138 +0,0 @@ -import { ethers } from 'ethers'; -import { - createContext, - PropsWithChildren, - useCallback, - useContext, - useEffect, - useMemo, - useState, -} from 'react'; -import { useInterval } from 'usehooks-ts'; - -import { CHAINS } from '@/constants/chains'; -import { FIVE_SECONDS_INTERVAL } from '@/constants/intervals'; -import { useElectronApi } from '@/hooks/useElectronApi'; -import { useStore } from '@/hooks/useStore'; -import { AutonolasService } from '@/service/Autonolas'; - -import { OnlineStatusContext } from './OnlineStatusProvider'; -import { ServicesContext } from './ServicesProvider'; -import { StakingProgramContext } from './StakingProgramContext'; - -export const RewardContext = createContext<{ - accruedServiceStakingRewards?: number; - availableRewardsForEpoch?: number; - availableRewardsForEpochEth?: number; - isEligibleForRewards?: boolean; - optimisticRewardsEarnedForEpoch?: number; - minimumStakedAmountRequired?: number; - updateRewards: () => Promise; -}>({ - accruedServiceStakingRewards: undefined, - availableRewardsForEpoch: undefined, - availableRewardsForEpochEth: undefined, - isEligibleForRewards: undefined, - optimisticRewardsEarnedForEpoch: undefined, - minimumStakedAmountRequired: undefined, - updateRewards: async () => {}, -}); - -export const RewardProvider = ({ children }: PropsWithChildren) => { - const { isOnline } = useContext(OnlineStatusContext); - const { services } = useContext(ServicesContext); - const service = useMemo(() => services?.[0], [services]); - const { storeState } = useStore(); - const electronApi = useElectronApi(); - const { activeStakingProgram, defaultStakingProgram } = useContext( - StakingProgramContext, - ); - - const [accruedServiceStakingRewards, setAccruedServiceStakingRewards] = - useState(); - const [availableRewardsForEpoch, setAvailableRewardsForEpoch] = - useState(); - const [isEligibleForRewards, setIsEligibleForRewards] = useState(); - - const availableRewardsForEpochEth = useMemo(() => { - if (!availableRewardsForEpoch) return; - - const formatRewardsEth = parseFloat( - ethers.utils.formatUnits(`${availableRewardsForEpoch}`, 18), - ); - - return formatRewardsEth; - }, [availableRewardsForEpoch]); - - const optimisticRewardsEarnedForEpoch = useMemo(() => { - if (isEligibleForRewards && availableRewardsForEpochEth) { - return availableRewardsForEpochEth; - } - return; - }, [availableRewardsForEpochEth, isEligibleForRewards]); - - const updateRewards = useCallback(async (): Promise => { - let stakingRewardsInfoPromise; - - // only check for rewards if there's a currentStakingProgram active - if ( - activeStakingProgram && - service?.chain_configs[CHAINS.GNOSIS.chainId].chain_data?.multisig && - service?.chain_configs[CHAINS.GNOSIS.chainId].chain_data?.token - ) { - stakingRewardsInfoPromise = AutonolasService.getAgentStakingRewardsInfo({ - agentMultisigAddress: - service.chain_configs[CHAINS.GNOSIS.chainId].chain_data.multisig!, - serviceId: - service.chain_configs[CHAINS.GNOSIS.chainId].chain_data.token!, - stakingProgram: activeStakingProgram, - }); - } - - // can fallback to default staking program if no current staking program is active - const epochRewardsPromise = AutonolasService.getAvailableRewardsForEpoch( - activeStakingProgram ?? defaultStakingProgram, - ); - - const [stakingRewardsInfo, rewards] = await Promise.all([ - stakingRewardsInfoPromise, - epochRewardsPromise, - ]); - - setIsEligibleForRewards(stakingRewardsInfo?.isEligibleForRewards); - setAccruedServiceStakingRewards( - stakingRewardsInfo?.accruedServiceStakingRewards, - ); - setAvailableRewardsForEpoch(rewards); - }, [activeStakingProgram, defaultStakingProgram, service]); - - useEffect(() => { - if (isEligibleForRewards && !storeState?.firstStakingRewardAchieved) { - electronApi.store?.set?.('firstStakingRewardAchieved', true); - } - }, [ - electronApi.store, - isEligibleForRewards, - storeState?.firstStakingRewardAchieved, - ]); - - useInterval( - async () => updateRewards(), - isOnline ? FIVE_SECONDS_INTERVAL : null, - ); - - return ( - - {children} - - ); -}; diff --git a/frontend/context/ServicesProvider.tsx b/frontend/context/ServicesProvider.tsx deleted file mode 100644 index a96b43635..000000000 --- a/frontend/context/ServicesProvider.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import { message } from 'antd'; -import { - createContext, - Dispatch, - PropsWithChildren, - SetStateAction, - useCallback, - useContext, - useMemo, - useState, -} from 'react'; -import { useInterval } from 'usehooks-ts'; - -import { DeploymentStatus, Service } from '@/client'; -import { CHAINS } from '@/constants/chains'; -import { FIVE_SECONDS_INTERVAL } from '@/constants/intervals'; -import { ServicesService } from '@/service/Services'; -import { Address } from '@/types/Address'; - -import { OnlineStatusContext } from './OnlineStatusProvider'; - -type ServicesContextProps = { - services?: Service[]; - serviceAddresses?: Address[]; - setServices: Dispatch>; - serviceStatus: DeploymentStatus | undefined; - setServiceStatus: Dispatch>; - updateServicesState: () => Promise; - updateServiceStatus: () => Promise; - hasInitialLoaded: boolean; - setHasInitialLoaded: Dispatch>; - setIsPaused: Dispatch>; -}; - -export const ServicesContext = createContext({ - services: undefined, - serviceAddresses: undefined, - setServices: () => {}, - serviceStatus: undefined, - setServiceStatus: () => {}, - updateServicesState: async () => {}, - updateServiceStatus: async () => {}, - hasInitialLoaded: false, - setHasInitialLoaded: () => {}, - setIsPaused: () => {}, -}); - -export const ServicesProvider = ({ children }: PropsWithChildren) => { - const { isOnline } = useContext(OnlineStatusContext); - - const [services, setServices] = useState(); - - const [serviceStatus, setServiceStatus] = useState< - DeploymentStatus | undefined - >(); - const [hasInitialLoaded, setHasInitialLoaded] = useState(false); - const [isPaused, setIsPaused] = useState(false); - - const serviceAddresses = useMemo( - () => - services?.reduce((acc, service: Service) => { - const instances = - service.chain_configs[CHAINS.GNOSIS.chainId].chain_data.instances; - if (instances) { - acc.push(...instances); - } - - const multisig = - service.chain_configs[CHAINS.GNOSIS.chainId].chain_data.multisig; - if (multisig) { - acc.push(multisig); - } - return acc; - }, []), - [services], - ); - - const updateServicesState = useCallback( - async (): Promise => - ServicesService.getServices() - .then((data: Service[]) => { - if (!Array.isArray(data)) return; - setServices(data); - setHasInitialLoaded(true); - }) - .catch((e) => { - message.error(e.message); - }), - [], - ); - - const updateServiceStatus = useCallback(async () => { - if (!services?.[0]) return; - const serviceStatus = await ServicesService.getDeployment(services[0].hash); - setServiceStatus(serviceStatus.status); - }, [services]); - - // Update service state - useInterval( - () => - updateServicesState() - .then(() => updateServiceStatus()) - .catch((e) => message.error(e.message)), - isOnline && !isPaused ? FIVE_SECONDS_INTERVAL : null, - ); - - return ( - - {children} - - ); -}; diff --git a/frontend/context/SettingsProvider.tsx b/frontend/context/SettingsProvider.tsx deleted file mode 100644 index 6bdb43a15..000000000 --- a/frontend/context/SettingsProvider.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { createContext, PropsWithChildren, useState } from 'react'; - -import { SettingsScreen } from '@/enums/SettingsScreen'; - -export const SettingsContext = createContext<{ - screen: SettingsScreen; - goto: (screen: SettingsScreen) => void; -}>({ - screen: SettingsScreen.Main, - goto: () => {}, -}); - -export const SettingsProvider = ({ children }: PropsWithChildren) => { - const [screen, setScreen] = useState(SettingsScreen.Main); - - const goto = (screen: SettingsScreen) => setScreen(screen); - - return ( - - {children} - - ); -}; diff --git a/frontend/context/SetupProvider.tsx b/frontend/context/SetupProvider.tsx deleted file mode 100644 index d833bf2ee..000000000 --- a/frontend/context/SetupProvider.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { - createContext, - Dispatch, - PropsWithChildren, - SetStateAction, - useState, -} from 'react'; - -import { SetupScreen } from '@/enums/SetupScreen'; -import { Address } from '@/types/Address'; - -type SetupObjectType = { - state: SetupScreen; - mnemonic: string[]; - backupSigner?: Address; -}; - -type SetupContextType = { - setupObject: SetupObjectType; - setSetupObject: Dispatch>; -}; - -export const SetupContext = createContext({ - setupObject: { - state: SetupScreen.Welcome, - mnemonic: [], - backupSigner: undefined, - }, - setSetupObject: () => {}, -}); - -export const SetupProvider = ({ children }: PropsWithChildren) => { - const [setupObject, setSetupObject] = useState({ - state: SetupScreen.Welcome, - mnemonic: [], - backupSigner: undefined, - }); - - return ( - - {children} - - ); -}; diff --git a/frontend/context/StakingContractInfoProvider.tsx b/frontend/context/StakingContractInfoProvider.tsx deleted file mode 100644 index 6bf19408a..000000000 --- a/frontend/context/StakingContractInfoProvider.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import { - createContext, - PropsWithChildren, - useCallback, - useContext, - useEffect, - useMemo, - useState, -} from 'react'; -import { useInterval } from 'usehooks-ts'; - -import { CHAINS } from '@/constants/chains'; -import { FIVE_SECONDS_INTERVAL } from '@/constants/intervals'; -import { StakingProgram } from '@/enums/StakingProgram'; -import { AutonolasService } from '@/service/Autonolas'; -import { StakingContractInfo } from '@/types/Autonolas'; - -import { ServicesContext } from './ServicesProvider'; -import { StakingProgramContext } from './StakingProgramContext'; - -type StakingContractInfoContextProps = { - updateActiveStakingContractInfo: () => Promise; - activeStakingContractInfo?: StakingContractInfo; - stakingContractInfoRecord?: Record< - StakingProgram, - Partial - >; -}; - -export const StakingContractInfoContext = - createContext({ - updateActiveStakingContractInfo: async () => {}, - activeStakingContractInfo: undefined, - stakingContractInfoRecord: undefined, - }); - -export const StakingContractInfoProvider = ({ - children, -}: PropsWithChildren) => { - const { services } = useContext(ServicesContext); - const { activeStakingProgram } = useContext(StakingProgramContext); - - const [activeStakingContractInfo, setActiveStakingContractInfo] = - useState(); - - const [stakingContractInfoRecord, setStakingContractInfoRecord] = - useState>>(); - - const serviceId = useMemo( - () => services?.[0]?.chain_configs[CHAINS.GNOSIS.chainId].chain_data?.token, - [services], - ); - - // ACTIVE staking contract info should be updated on interval - // it requires serviceId and activeStakingProgram - const updateActiveStakingContractInfo = useCallback(async () => { - if (!serviceId) return; - if (!activeStakingProgram) return; - - AutonolasService.getStakingContractInfoByServiceIdStakingProgram( - serviceId, - activeStakingProgram, - ).then(setActiveStakingContractInfo); - }, [activeStakingProgram, serviceId]); - - useInterval(updateActiveStakingContractInfo, FIVE_SECONDS_INTERVAL); - - // Record of staking contract info for each staking program - // not user/service specific - const updateStakingContractInfoRecord = () => { - const alpha = AutonolasService.getStakingContractInfoByStakingProgram( - StakingProgram.Alpha, - ); - const beta = AutonolasService.getStakingContractInfoByStakingProgram( - StakingProgram.Beta, - ); - - Promise.all([alpha, beta]).then((values) => { - const [alphaInfo, betaInfo] = values; - setStakingContractInfoRecord({ - [StakingProgram.Alpha]: alphaInfo, - [StakingProgram.Beta]: betaInfo, - }); - }); - }; - - useEffect(() => { - // Load staking contract info record on mount - updateStakingContractInfoRecord(); - }, []); - - return ( - - {children} - - ); -}; diff --git a/frontend/context/StakingProgramContext.tsx b/frontend/context/StakingProgramContext.tsx deleted file mode 100644 index fecdf645c..000000000 --- a/frontend/context/StakingProgramContext.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import { createContext, PropsWithChildren, useCallback, useState } from 'react'; -import { useInterval } from 'usehooks-ts'; - -import { CHAINS } from '@/constants/chains'; -import { StakingProgram } from '@/enums/StakingProgram'; -import { useServices } from '@/hooks/useServices'; -import { AutonolasService } from '@/service/Autonolas'; - -export const StakingProgramContext = createContext<{ - activeStakingProgram?: StakingProgram | null; - defaultStakingProgram: StakingProgram; - updateActiveStakingProgram: () => Promise; -}>({ - activeStakingProgram: undefined, - defaultStakingProgram: StakingProgram.Beta, - updateActiveStakingProgram: async () => {}, -}); - -/** Determines the current active staking program, if any */ -export const StakingProgramProvider = ({ children }: PropsWithChildren) => { - const { service } = useServices(); - - const [activeStakingProgram, setActiveStakingProgram] = - useState(); - - const updateActiveStakingProgram = useCallback(async () => { - // if no service nft, not staked - const serviceId = - service?.chain_configs[CHAINS.GNOSIS.chainId].chain_data?.token; - - if (!service?.chain_configs[CHAINS.GNOSIS.chainId].chain_data?.token) { - setActiveStakingProgram(null); - return; - } - - if (serviceId) { - // if service exists, we need to check if it is staked - AutonolasService.getCurrentStakingProgramByServiceId(serviceId).then( - (stakingProgram) => { - setActiveStakingProgram(stakingProgram); - }, - ); - } - }, [service]); - - useInterval(updateActiveStakingProgram, 5000); - - return ( - - {children} - - ); -}; diff --git a/frontend/context/StoreProvider.tsx b/frontend/context/StoreProvider.tsx deleted file mode 100644 index 63ce0ed88..000000000 --- a/frontend/context/StoreProvider.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { - createContext, - PropsWithChildren, - useCallback, - useContext, - useEffect, - useState, -} from 'react'; - -import type { ElectronStore } from '@/types/ElectronApi'; - -import { ElectronApiContext } from './ElectronApiProvider'; - -export const StoreContext = createContext<{ storeState?: ElectronStore }>({ - storeState: undefined, -}); - -export const StoreProvider = ({ children }: PropsWithChildren) => { - const { store, ipcRenderer } = useContext(ElectronApiContext); - const [storeState, setStoreState] = useState(); - - const setupStore = useCallback(async () => { - const tempStore = await store?.store?.(); - setStoreState(tempStore); - ipcRenderer?.on?.('store-changed', (_event: unknown, data: unknown) => { - setStoreState(data as ElectronStore); - }); - }, [ipcRenderer, store]); - - useEffect(() => { - if (!storeState) setupStore().catch(console.error); - }, [setupStore, storeState]); - - return ( - - {children} - - ); -}; diff --git a/frontend/context/WalletProvider.tsx b/frontend/context/WalletProvider.tsx deleted file mode 100644 index 21c02606a..000000000 --- a/frontend/context/WalletProvider.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { createContext, PropsWithChildren, useContext, useState } from 'react'; -import { useInterval } from 'usehooks-ts'; - -import { Wallet } from '@/client'; -import { FIVE_SECONDS_INTERVAL } from '@/constants/intervals'; -import { WalletService } from '@/service/Wallet'; -import { Address } from '@/types/Address'; - -import { OnlineStatusContext } from './OnlineStatusProvider'; - -export const WalletContext = createContext<{ - masterEoaAddress?: Address; - masterSafeAddress?: Address; - wallets?: Wallet[]; - updateWallets: () => Promise; -}>({ - masterEoaAddress: undefined, - masterSafeAddress: undefined, - wallets: undefined, - updateWallets: async () => {}, -}); - -export const WalletProvider = ({ children }: PropsWithChildren) => { - const { isOnline } = useContext(OnlineStatusContext); - - const [wallets, setWallets] = useState(); - - const masterEoaAddress: Address | undefined = wallets?.[0]?.address; - const masterSafeAddress: Address | undefined = wallets?.[0]?.safe; - - const updateWallets = async () => { - const wallets = await WalletService.getWallets(); - if (!wallets) return; - setWallets(wallets); - }; - - useInterval(updateWallets, isOnline ? FIVE_SECONDS_INTERVAL : null); - - return ( - - {children} - - ); -}; diff --git a/frontend/enums/PageState.ts b/frontend/enums/PageState.ts deleted file mode 100644 index fda8de670..000000000 --- a/frontend/enums/PageState.ts +++ /dev/null @@ -1,9 +0,0 @@ -export enum Pages { - Setup, - Main, - Settings, - HelpAndSupport, - Receive, - Send, - ManageStaking, -} diff --git a/frontend/enums/ServiceRegistryL2ServiceState.ts b/frontend/enums/ServiceRegistryL2ServiceState.ts deleted file mode 100644 index 52174fe7e..000000000 --- a/frontend/enums/ServiceRegistryL2ServiceState.ts +++ /dev/null @@ -1,9 +0,0 @@ -// Reflects the state of a service in the ServiceRegistryL2 contract (i.e. https://gnosisscan.io/address/0xa45E64d13A30a51b91ae0eb182e88a40e9b18eD8) -export enum ServiceRegistryL2ServiceState { - NonExistent, - PreRegistration, - ActiveRegistration, - FinishedRegistration, - Deployed, - TerminatedBonded, -} diff --git a/frontend/enums/SettingsScreen.ts b/frontend/enums/SettingsScreen.ts deleted file mode 100644 index 0743775b0..000000000 --- a/frontend/enums/SettingsScreen.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum SettingsScreen { - Main, - AddBackupWallet, -} diff --git a/frontend/enums/SetupScreen.ts b/frontend/enums/SetupScreen.ts deleted file mode 100644 index 9003425c8..000000000 --- a/frontend/enums/SetupScreen.ts +++ /dev/null @@ -1,14 +0,0 @@ -export enum SetupScreen { - Loading, - Welcome, - SetupPassword, - SetupSeedPhrase, - SetupBackupSigner, - SetupEoaFunding, - SetupEoaFundingIncomplete, - SetupCreateSafe, - Restore, - RestoreViaSeed, - RestoreSetPassword, - RestoreViaBackup, -} diff --git a/frontend/enums/StakingProgram.ts b/frontend/enums/StakingProgram.ts deleted file mode 100644 index c3d98cd42..000000000 --- a/frontend/enums/StakingProgram.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum StakingProgram { - Alpha = 'pearl_alpha', - Beta = 'pearl_beta', -} diff --git a/frontend/enums/StakingProgramStatus.ts b/frontend/enums/StakingProgramStatus.ts deleted file mode 100644 index d2789f1ef..000000000 --- a/frontend/enums/StakingProgramStatus.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum StakingProgramStatus { - New = 'new', - Selected = 'current', -} diff --git a/frontend/enums/Token.ts b/frontend/enums/Token.ts deleted file mode 100644 index 3316710ff..000000000 --- a/frontend/enums/Token.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum Token { - ETH = 'ETH', - OLAS = 'OLAS', -} diff --git a/frontend/hooks/useBalance.ts b/frontend/hooks/useBalance.ts deleted file mode 100644 index c8d21df91..000000000 --- a/frontend/hooks/useBalance.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { useContext } from 'react'; - -import { BalanceContext } from '@/context/BalanceProvider'; - -export const useBalance = () => useContext(BalanceContext); diff --git a/frontend/hooks/useElectronApi.ts b/frontend/hooks/useElectronApi.ts deleted file mode 100644 index a4cf2aa46..000000000 --- a/frontend/hooks/useElectronApi.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { useContext } from 'react'; - -import { ElectronApiContext } from '@/context/ElectronApiProvider'; - -export const useElectronApi = () => useContext(ElectronApiContext); diff --git a/frontend/hooks/useLogs.ts b/frontend/hooks/useLogs.ts deleted file mode 100644 index b72e59c3b..000000000 --- a/frontend/hooks/useLogs.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { useMemo } from 'react'; - -import { DeploymentStatus } from '@/client'; - -import { useBalance } from './useBalance'; -import { useMasterSafe } from './useMasterSafe'; -import { useServices } from './useServices'; -import { useStore } from './useStore'; -import { useWallet } from './useWallet'; - -const useAddressesLogs = () => { - const { wallets, masterEoaAddress, masterSafeAddress } = useWallet(); - - const { backupSafeAddress, masterSafeOwners } = useMasterSafe(); - - return { - isLoaded: wallets?.length !== 0 && !!masterSafeOwners, - data: [ - { backupSafeAddress: backupSafeAddress ?? 'undefined' }, - { masterSafeAddress: masterSafeAddress ?? 'undefined' }, - { masterEoaAddress: masterEoaAddress ?? 'undefined' }, - { masterSafeOwners: masterSafeOwners ?? 'undefined' }, - ], - }; -}; - -const useBalancesLogs = () => { - const { - isBalanceLoaded, - totalEthBalance, - totalOlasBalance, - wallets, - walletBalances, - totalOlasStakedBalance, - } = useBalance(); - - return { - isLoaded: isBalanceLoaded, - data: [ - { wallets: wallets ?? 'undefined' }, - { walletBalances: walletBalances ?? 'undefined' }, - { totalOlasStakedBalance: totalOlasStakedBalance ?? 'undefined' }, - { totalEthBalance: totalEthBalance ?? 'undefined' }, - { totalOlasBalance: totalOlasBalance ?? 'undefined' }, - ], - }; -}; - -const useServicesLogs = () => { - const { serviceStatus, services, hasInitialLoaded } = useServices(); - - return { - isLoaded: hasInitialLoaded, - data: { - serviceStatus: serviceStatus - ? DeploymentStatus[serviceStatus] - : 'undefined', - services: - services?.map((item) => ({ - ...item, - keys: item.keys.map((key) => key.address), - })) ?? 'undefined', - }, - }; -}; - -export const useLogs = () => { - const { storeState } = useStore(); - - const { isLoaded: isServicesLoaded, data: services } = useServicesLogs(); - const { isLoaded: isBalancesLoaded, data: balances } = useBalancesLogs(); - const { isLoaded: isAddressesLoaded, data: addresses } = useAddressesLogs(); - - const logs = useMemo(() => { - if (isServicesLoaded && isBalancesLoaded && isAddressesLoaded) { - return { - store: storeState, - debugData: { - services, - addresses, - balances, - }, - }; - } - }, [ - addresses, - balances, - isAddressesLoaded, - isBalancesLoaded, - isServicesLoaded, - services, - storeState, - ]); - - return logs; -}; diff --git a/frontend/hooks/useMasterSafe.ts b/frontend/hooks/useMasterSafe.ts deleted file mode 100644 index ec5d52059..000000000 --- a/frontend/hooks/useMasterSafe.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { useContext } from 'react'; - -import { MasterSafeContext } from '@/context/MasterSafeProvider'; - -export const useMasterSafe = () => { - return useContext(MasterSafeContext); -}; diff --git a/frontend/hooks/useModals.ts b/frontend/hooks/useModals.ts deleted file mode 100644 index 1f840b7cb..000000000 --- a/frontend/hooks/useModals.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { useContext } from 'react'; - -import { ModalContext } from '@/context/ModalProvider'; - -export const useModals = () => { - const { migrationModalOpen, setMigrationModalOpen } = - useContext(ModalContext); - - return { - migrationModalOpen, - setMigrationModalOpen, - }; -}; diff --git a/frontend/hooks/usePageState.ts b/frontend/hooks/usePageState.ts deleted file mode 100644 index 92e36d388..000000000 --- a/frontend/hooks/usePageState.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { useContext } from 'react'; - -import { PageStateContext } from '@/context/PageStateProvider'; -import { Pages } from '@/enums/PageState'; - -export const usePageState = () => { - const { pageState, setPageState } = useContext(PageStateContext); - - const goto = (state: Pages) => { - setPageState(state); - }; - - return { pageState, setPageState, goto }; -}; diff --git a/frontend/hooks/useReward.ts b/frontend/hooks/useReward.ts deleted file mode 100644 index c269a4430..000000000 --- a/frontend/hooks/useReward.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { useContext } from 'react'; - -import { RewardContext } from '@/context/RewardProvider'; - -export const useReward = () => { - const { - availableRewardsForEpoch, - availableRewardsForEpochEth, - isEligibleForRewards, - accruedServiceStakingRewards, - } = useContext(RewardContext); - - return { - availableRewardsForEpoch, - availableRewardsForEpochEth, - isEligibleForRewards, - accruedServiceStakingRewards, - }; -}; diff --git a/frontend/hooks/useServiceTemplates.ts b/frontend/hooks/useServiceTemplates.ts deleted file mode 100644 index 7e4e733b3..000000000 --- a/frontend/hooks/useServiceTemplates.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ServiceTemplate } from '@/client/types'; -import { SERVICE_TEMPLATES } from '@/constants/serviceTemplates'; - -export const useServiceTemplates = () => { - const getServiceTemplates = (): ServiceTemplate[] => SERVICE_TEMPLATES; - const getServiceTemplate = (hash: string): ServiceTemplate | undefined => - SERVICE_TEMPLATES.find((template) => template.hash === hash); - - return { - getServiceTemplate, - getServiceTemplates, - serviceTemplate: SERVICE_TEMPLATES[0], // Default to the first template - }; -}; diff --git a/frontend/hooks/useServices.ts b/frontend/hooks/useServices.ts deleted file mode 100644 index 3fa3cfda7..000000000 --- a/frontend/hooks/useServices.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { useContext } from 'react'; - -import { Service, ServiceHash, ServiceTemplate } from '@/client'; -import { CHAINS } from '@/constants/chains'; -import { ServicesContext } from '@/context/ServicesProvider'; -import MulticallService from '@/service/Multicall'; -import { ServicesService } from '@/service/Services'; -import { Address } from '@/types/Address'; -import { AddressBooleanRecord } from '@/types/Records'; - -const checkServiceIsFunded = async ( - service: Service, - serviceTemplate: ServiceTemplate, -): Promise => { - const { - chain_configs: { - [CHAINS.GNOSIS.chainId]: { - chain_data: { instances, multisig }, - }, - }, - } = service; - - if (!instances || !multisig) return false; - - const addresses = [...instances, multisig]; - - const balances = await MulticallService.getEthBalances(addresses); - - if (!balances) return false; - - const fundRequirements: AddressBooleanRecord = addresses.reduce( - (acc: AddressBooleanRecord, address: Address) => - Object.assign(acc, { - [address]: instances.includes(address) - ? balances[address] > - serviceTemplate.configurations[CHAINS.GNOSIS.chainId] - .fund_requirements.agent - : balances[address] > - serviceTemplate.configurations[CHAINS.GNOSIS.chainId] - .fund_requirements.safe, - }), - {}, - ); - - return Object.values(fundRequirements).every((f) => f); -}; - -export const useServices = () => { - const { - services, - updateServicesState, - hasInitialLoaded, - setServices, - serviceStatus, - setServiceStatus, - updateServiceStatus, - setIsPaused, - } = useContext(ServicesContext); - - // STATE METHODS - const getServiceFromState = ( - serviceHash: ServiceHash, - ): Service | undefined => { - if (!hasInitialLoaded) return; - if (!services) return; - return services.find((service) => service.hash === serviceHash); - }; - - const getServicesFromState = (): Service[] | undefined => - hasInitialLoaded ? services : []; - - const updateServiceState = (serviceHash: ServiceHash) => { - ServicesService.getService(serviceHash).then((service: Service) => { - setServices((prev) => { - if (!prev) return [service]; - - const index = prev.findIndex((s) => s.hash === serviceHash); // findIndex returns -1 if not found - if (index === -1) return [...prev, service]; - - const newServices = [...prev]; - newServices[index] = service; - return newServices; - }); - }); - }; - - const deleteServiceState = (serviceHash: ServiceHash) => - setServices((prev) => prev?.filter((s) => s.hash !== serviceHash)); - - return { - service: services?.[0], - services, - serviceStatus, - setServiceStatus, - getServiceFromState, - getServicesFromState, - checkServiceIsFunded, - updateServicesState, - updateServiceState, - updateServiceStatus, - deleteServiceState, - hasInitialLoaded, - setIsServicePollingPaused: setIsPaused, - }; -}; diff --git a/frontend/hooks/useSettings.ts b/frontend/hooks/useSettings.ts deleted file mode 100644 index 9b5ba28fe..000000000 --- a/frontend/hooks/useSettings.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { useContext } from 'react'; - -import { SettingsContext } from '@/context/SettingsProvider'; - -export const useSettings = () => useContext(SettingsContext); diff --git a/frontend/hooks/useSetup.ts b/frontend/hooks/useSetup.ts deleted file mode 100644 index cbde83cc3..000000000 --- a/frontend/hooks/useSetup.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { useContext } from 'react'; - -import { SetupContext } from '@/context/SetupProvider'; -import { SetupScreen } from '@/enums/SetupScreen'; -import { Address } from '@/types/Address'; - -export const useSetup = () => { - const { setupObject, setSetupObject } = useContext(SetupContext); - - const goto = (state: SetupScreen) => { - setSetupObject((prev) => ({ ...prev, state })); - }; - - const setMnemonic = (mnemonic: string[]) => - setSetupObject((prev) => Object.assign(prev, { mnemonic })); - - const setBackupSigner = (backupSigner: Address) => - setSetupObject((prev) => Object.assign(prev, { backupSigner })); - - return { - ...setupObject, - setMnemonic, - setBackupSigner, - goto, - }; -}; diff --git a/frontend/hooks/useStakingContractInfo.ts b/frontend/hooks/useStakingContractInfo.ts deleted file mode 100644 index 460f74613..000000000 --- a/frontend/hooks/useStakingContractInfo.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { useContext } from 'react'; - -import { StakingContractInfoContext } from '@/context/StakingContractInfoProvider'; - -import { useServices } from './useServices'; - -export const useStakingContractInfo = () => { - const { activeStakingContractInfo, stakingContractInfoRecord } = useContext( - StakingContractInfoContext, - ); - - const { services } = useServices(); - - if (!services?.[0] || !activeStakingContractInfo) - return { stakingContractInfoRecord }; - - const { - serviceStakingState, - serviceStakingStartTime, - availableRewards, - serviceIds, - maxNumServices, - minimumStakingDuration, - } = activeStakingContractInfo; - - const isRewardsAvailable = true; // availableRewards > 0; - const hasEnoughServiceSlots = serviceIds.length < maxNumServices; - const hasEnoughRewardsAndSlots = isRewardsAvailable && hasEnoughServiceSlots; - - const isAgentEvicted = serviceStakingState === 2; - - /** - * For example: minStakingDuration = 3 days - * - * - Service starts staking 1st June 00:01 - * - Service stops being active on 1st June 02:01 (after 2 hours) - * - Contract will evict the service at 3rd June 02:02 - * - Now, cannot unstake the service until 4th June 00:01, because it hasn’t met the minStakingDuration of 3 days. - * - IMPORTANT: Between 3rd June 02:02 and 4th June 00:01 the service is EVICTED and without the possibility of unstake and re-stake - * - That is, user should not be able to run/start your agent if this condition is met. - * - */ - const isServiceStakedForMinimumDuration = - Math.round(Date.now() / 1000) - serviceStakingStartTime >= - minimumStakingDuration; - - /** - * user can start the agent iff, - * - rewards are available - * - service has enough slots - * - if agent is evicted, then service should be staked for minimum duration - */ - const isEligibleForStaking = - hasEnoughRewardsAndSlots && - (isAgentEvicted ? isServiceStakedForMinimumDuration : true); - - return { - hasEnoughServiceSlots, - isEligibleForStaking, - isRewardsAvailable, - isAgentEvicted, - stakingContractInfoRecord, - isServiceStakedForMinimumDuration, - }; -}; diff --git a/frontend/hooks/useStakingProgram.ts b/frontend/hooks/useStakingProgram.ts deleted file mode 100644 index 8d07739be..000000000 --- a/frontend/hooks/useStakingProgram.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { useContext } from 'react'; - -import { STAKING_PROGRAM_META } from '@/constants/stakingProgramMeta'; -import { StakingProgramContext } from '@/context/StakingProgramContext'; - -/** - * Mock hook for staking program abstraction - * @returns {currentStakingProgram: IncentiveProgram} - */ -export const useStakingProgram = () => { - const { - activeStakingProgram, - defaultStakingProgram, - updateActiveStakingProgram: updateStakingProgram, - } = useContext(StakingProgramContext); - - const isLoadedActiveStakingProgram = activeStakingProgram !== undefined; - - const activeStakingProgramMeta = - activeStakingProgram === undefined - ? null - : activeStakingProgram === null - ? null - : STAKING_PROGRAM_META[activeStakingProgram]; - - return { - activeStakingProgram, - activeStakingProgramMeta, - defaultStakingProgram, - updateStakingProgram, - isLoadedActiveStakingProgram, - }; -}; diff --git a/frontend/hooks/useStore.ts b/frontend/hooks/useStore.ts deleted file mode 100644 index ddc4a66b8..000000000 --- a/frontend/hooks/useStore.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { useContext } from 'react'; - -import { StoreContext } from '@/context/StoreProvider'; - -export const useStore = () => useContext(StoreContext); diff --git a/frontend/hooks/useWallet.ts b/frontend/hooks/useWallet.ts deleted file mode 100644 index 3ac343b60..000000000 --- a/frontend/hooks/useWallet.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { useContext } from 'react'; - -import { WalletContext } from '@/context/WalletProvider'; - -export const useWallet = () => useContext(WalletContext); diff --git a/frontend/jest.config.ts b/frontend/jest.config.ts deleted file mode 100644 index 849f963f0..000000000 --- a/frontend/jest.config.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { Config } from 'jest'; -import nextJest from 'next/jest.js'; - -const createJestConfig = nextJest({ - // Provide the path to your Next.js app to load next.config.js and .env files in your test environment - dir: './', -}); - -// Add any custom config to be passed to Jest -const config: Config = { - coverageProvider: 'v8', - testEnvironment: 'jsdom', - globals: { fetch }, - // Add more setup options before each test is run - setupFilesAfterEnv: ['/jest.setup.ts'], -}; - -// createJestConfig is exported this way to ensure that next/jest can load the Next.js config which is async -export default createJestConfig(config); diff --git a/frontend/jest.setup.ts b/frontend/jest.setup.ts deleted file mode 100644 index 7b0828bfa..000000000 --- a/frontend/jest.setup.ts +++ /dev/null @@ -1 +0,0 @@ -import '@testing-library/jest-dom'; diff --git a/frontend/next-env.d.ts b/frontend/next-env.d.ts deleted file mode 100644 index 4f11a03dc..000000000 --- a/frontend/next-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/frontend/next.config.mjs b/frontend/next.config.mjs deleted file mode 100644 index 33b7fe23f..000000000 --- a/frontend/next.config.mjs +++ /dev/null @@ -1,42 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - images: { - remotePatterns: [ - { - protocol: 'http', - hostname: '**', - }, - { - protocol: 'https', - hostname: '**', - }, - ], - }, - transpilePackages: [ - 'rc-util', - '@babel/runtime', - '@ant-design', - 'rc-pagination', - 'rc-picker', - ], - webpack: (config) => { - if (config.snapshot) { - config.snapshot = { - ...(config.snapshot ?? {}), - // Add all node_modules but @next module to managedPaths - // Allows for hot refresh of changes to @next module - managedPaths: [/^(.+?[\\/]node_modules[\\/])(?!@next)/], - }; - } - - return config; - }, - env: { - GNOSIS_RPC: - process.env.NODE_ENV === 'production' - ? process.env.FORK_URL - : process.env.DEV_RPC, - }, -}; - -export default nextConfig; diff --git a/frontend/package.json b/frontend/package.json deleted file mode 100644 index ec20ee33a..000000000 --- a/frontend/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "author": "Valory AG", - "dependencies": { - "@ant-design/cssinjs": "^1.18.4", - "@ant-design/icons": "^5.3.0", - "@fontsource/inter": "^5.0.17", - "antd": "^5.14.0", - "ethers": "5.7.2", - "ethers-multicall": "^0.2.3", - "lodash": "^4.17.21", - "next": "^14.2.3", - "react": "^18.3.1", - "react-canvas-confetti": "1.2.1", - "react-dom": "^18.3.1", - "sass": "^1.72.0", - "styled-components": "^6.1.8", - "usehooks-ts": "^2.14.0" - }, - "devDependencies": { - "@testing-library/jest-dom": "^6.4.2", - "@testing-library/react": "^14.2.1", - "@types/jest": "^29.5.12", - "@types/lodash": "^4.14.202", - "@types/node": "20.14.10", - "@types/react": "18.3.3", - "@types/react-dom": "^18", - "@typescript-eslint/eslint-plugin": "^7.0.1", - "@typescript-eslint/parser": "^7.0.1", - "eslint": "^8.56.0", - "eslint-config-next": "14.1.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-next": "^0.0.0", - "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-simple-import-sort": "^12.0.0", - "eslint-plugin-unused-imports": "^3.0.0", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", - "prettier": "^3.2.5", - "ts-node": "^10.9.2", - "typescript": "5.5.3" - }, - "name": "olas-operate-app", - "private": true, - "scripts": { - "dev": "next dev", - "build": "NODE_ENV=production next build", - "lint": "next lint", - "test": "jest", - "start": "next start" - }, - "version": "0.1.0" -} diff --git a/frontend/pages/_app.tsx b/frontend/pages/_app.tsx deleted file mode 100644 index 42657f818..000000000 --- a/frontend/pages/_app.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import '../styles/globals.scss'; - -import { ConfigProvider } from 'antd'; -import type { AppProps } from 'next/app'; -import { useEffect, useState } from 'react'; - -import { Layout } from '@/components/Layout'; -import { BalanceProvider } from '@/context/BalanceProvider'; -import { ElectronApiProvider } from '@/context/ElectronApiProvider'; -import { MasterSafeProvider } from '@/context/MasterSafeProvider'; -import { ModalProvider } from '@/context/ModalProvider'; -import { OnlineStatusProvider } from '@/context/OnlineStatusProvider'; -import { PageStateProvider } from '@/context/PageStateProvider'; -import { RewardProvider } from '@/context/RewardProvider'; -import { ServicesProvider } from '@/context/ServicesProvider'; -import { SettingsProvider } from '@/context/SettingsProvider'; -import { SetupProvider } from '@/context/SetupProvider'; -import { StakingContractInfoProvider } from '@/context/StakingContractInfoProvider'; -import { StakingProgramProvider } from '@/context/StakingProgramContext'; -import { StoreProvider } from '@/context/StoreProvider'; -import { WalletProvider } from '@/context/WalletProvider'; -import { mainTheme } from '@/theme'; - -export default function App({ Component, pageProps }: AppProps) { - const [isMounted, setIsMounted] = useState(false); - useEffect(() => { - setIsMounted(true); - }, []); - - return ( - - - - - - - - - - - - - - - - {isMounted ? ( - - - - ) : null} - - - - - - - - - - - - - - - - ); -} diff --git a/frontend/pages/index.tsx b/frontend/pages/index.tsx deleted file mode 100644 index 0eca2b8db..000000000 --- a/frontend/pages/index.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { useEffect, useMemo } from 'react'; - -import { HelpAndSupport } from '@/components/HelpAndSupportPage'; -import { Main } from '@/components/MainPage'; -import { ManageStakingPage } from '@/components/ManageStakingPage'; -import { Settings } from '@/components/SettingsPage'; -import { Setup } from '@/components/SetupPage'; -import { Pages } from '@/enums/PageState'; -import { useElectronApi } from '@/hooks/useElectronApi'; -import { usePageState } from '@/hooks/usePageState'; - -const DEFAULT_APP_HEIGHT = 700; - -export default function Home() { - const { pageState } = usePageState(); - const electronApi = useElectronApi(); - - useEffect(() => { - function updateAppHeight() { - const bodyElement = document.querySelector('body'); - if (bodyElement) { - const scrollHeight = bodyElement.scrollHeight; - electronApi?.setAppHeight?.(Math.min(DEFAULT_APP_HEIGHT, scrollHeight)); - } - } - - const resizeObserver = new ResizeObserver(updateAppHeight); - resizeObserver.observe(document.body); - updateAppHeight(); - - return () => { - resizeObserver.unobserve(document.body); - }; - }, [electronApi]); - - const page = useMemo(() => { - switch (pageState) { - case Pages.Setup: - return ; - case Pages.Main: - return
; - case Pages.Settings: - return ; - case Pages.HelpAndSupport: - return ; - case Pages.ManageStaking: - return ; - default: - return
; - } - }, [pageState]); - - return page; -} diff --git a/frontend/public/broken-robot.svg b/frontend/public/broken-robot.svg deleted file mode 100644 index 5f99a0375..000000000 --- a/frontend/public/broken-robot.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/frontend/public/happy-robot.svg b/frontend/public/happy-robot.svg deleted file mode 100644 index 4ca51d1d2..000000000 --- a/frontend/public/happy-robot.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/frontend/public/onboarding-robot.svg b/frontend/public/onboarding-robot.svg deleted file mode 100644 index c7cca155c..000000000 --- a/frontend/public/onboarding-robot.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/frontend/public/sad-robot.svg b/frontend/public/sad-robot.svg deleted file mode 100644 index 1cc45bdc7..000000000 --- a/frontend/public/sad-robot.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/frontend/public/splash-robot-head.png b/frontend/public/splash-robot-head.png deleted file mode 100644 index d43fb2873a75ea35c968de5f186d2a5c20db2bfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 319634 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%0Dqaw(HHB$h?SQPf*$s{)V}Re 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
9qNCJU79y1Se_Yro zjVJ@gEQ#0zp}Hvf!g#``0w>#A!vc%>iz9ZTl27*14tv_i0VljvAyuFRQ9>D(%>3P+_4j{w{ z%E`qtNT>La_q%hdI3Q)Y70#z|9gnMTk_5@QN06Intd=RKP_JoyFTI0RMq1r(CF(eS zrBkOt0AwDlO^3Ux+Ufff?cV`QQ1P_~{>Bx;0zN)vNth{IRMZ4A7F-G8vU4QJ!r{|5 z;oJ9LY*T?T*HY)nBJfp|2^9^iU2l{*+F&ug?&(mW=Qk)uXskp;-5|9zFsEjfQ<%zB z-nC9+hR+YSJ`)w@>73x4%n;p2Ak33)$+Eb?nBm>U;1zEM>KC5I*F(38(|<;lu$HA& zhY;|Pb_}&|z8herxFx&*yZOTatZ!sFZaCa-$H)!F3n@E23fsScusSEW^X1|43FSmOKX z^k3ru>8}hL)|($L@bBBf5+;BIfdTro-cnilbh<3U=qXXA`4d{MvOTWV3-S|mkCg@7 zm?u=etfp}m=3O_&Q_E?72thE=6-R5s z=GsC(RmXu++iPqn6SY(&_(>CU3Y;o#aXx4sWVf29?q0TtR={aZ+Og-sc3;3os!Zhl z2cu#^aKAN6bzB0DG|vVF4tnXbVzrs!9F|ymgN=Kkm$y_7aU0lVt6cuCh zO6}%!6?idJDvGsgR@@)-?$4=GsciXQSB-obrpzH^v&O->tl_NxH*jTefQ%YGTpN9e zi4p!68VbR`9XVA^b&tnZIL36B*^EPxb|w6>7jrC`u>Xwo03-uKNKb|8fs!g>&bVr@ zr-<#?1`xp(2h5UWF98F{XETlxxKt65nt{Q!+nWvyVa|j=TL~zc`g>KoTM-=y2CT5i zOKDOkvyNY$n7}=#1y&|vHwzAPDASll7~B%hP6U@t98H+0O+@q(ls7gFGlDC9C$=o- zAvHspEpko&kb_zGu$Xd8jl9;-ZD(V%)0qOZL#lCM4>DCY+XHJyzjAZE(Ji^u_#)3( zfmE&%nM|{Z$~wP;eoL136p47IjkL%4$vCyMovi+|x_K?QQn7Rh+P81DzfJjJRx4v`G7|NA#y^Y)B5EDe$> zea-V6Wj^7>`0Y8Jc0?5a|q(A zE6Ic$#$)w+hNtqF!YWst5|&^VO4QeZ=hJjQSM0V#R>E4p!kkRJGI^d-djP7WNuUvz zm%AZ2ZHBb5Bd9G`9_hg0uQG$9r<_YVKV{p>Vga;~gRkVDx8oQS&DM6>2)AGpI<8p{ z=m1-H@1s8sZNXh#T~gmI>nHKq7lOG2|9vNBLVo=bb8JM5c!1^r(-l&DyJAMy`6bzr zuIv3RhaTuj z*k|u`=9)3a97A3f>)v8b!UC+?lhsPWg|AI6TaEL+d=9LyH&n`cwEfX9DXb@0mJG!L z>N~+*EV^s^&vi~Vy&ot_0{1v~NAF65_XPnCv*&Trw0k09DMN~-q9IKt_g^?)eiBuU zejM@Hk9!KVi|KmYtd9?EqP_;gXd{(OhD_=HB>oE5g)l@Rj<8qIo@Q@dfNrR(Ru1irY#VVl^mxYqN4$4 z2D1voX=9Y!GtsK=YR#ym)FLXEKxVfkze^@1*w$*EcZ%En3fN!kH)El_e=@$?7c~m; zK?6$cjx(5CxrC2cj|Bzl7E9q3?QVQ>)8A7jhx)IJyk!|@aG%Kyo|G}P$?m{-!7UTr z+wT)gZ;W~fDw{uiZ3d>iZ&exrB9LVW5pfO){UZ< z(eA>a?|sr#H~X_aVEdN}YjOc7c!f!R#Bs+eq37ELqZ~4~Rf$U|L^v;X#L`Iywc^|j zW_jK$D*^5n>A`J~r1|AlHq?0gjdklr5VG-6Qn^a?0>nf#$JCXOGEBhCB(traX$~WZ z%Bps)=6cnSY~oh)(7Q5o*Q$8%sQH7z7txiPYD{TOt|t1wHm2isqj|?(#(YOp>!OHo za9X{kEvtB6UJfVfeC{Exlq(#942n<+&X5qY5 ze?aPEPSB*|DfCY8lEYs0w>|5Gu$Xw@6av!3l-^;mS0P+UXmfno)4*dKftNzyV2kLv zccD@@PYbKycP~kD?_|N`E%j7YtSukAIXhbk9*Fg&E8)y8r$qzz^^8e9(SyT79SKlX zgcsz;ZUDJ4R-_bzS;&ye{3#7Y4>l4cbuGk3BA-6j=_9@Y=WXG=&sv!lk@22ldJaaX z4jz~tKOnQ?Qu)D2|B*A$VmS%PQw*~uGEahK_@k8?JBxymQYM9^bLgsfBgI_$D*qyR2A4$^}?V@4pcC%sNL0Ja%YnqP^U;i-JvnO-21> zNMyxzl5i$-mFEqUT|S2VDYNb}#Tn&lBA$=4#g4#AA@m8}ljl3?E=2p&;n^;-~ z#;ew|)aCi>T63#R4TE@mu;Kwwe8+>!vYjT*$%@4-@M}INsI50Yjy;oSdy<**T3U>3 zClQ@J`wwW7{1T&g+hSEd3>}-yz_V}v#)dbcu4$ZF24Q7*yo%FUt}%iE!WZp|%UJc4 z-e1@uXMU4`TyY^^;U9Zu9eN%Hja_0h4D-xN+#8C;Bt`0oD})#x1Io=@=6c!|dA&$n5%Af{M zj2FqpJu!i1%KZcJ|F{5X3kIJFne{!${I?BiaC$aGv@X(Gb5W?dJQ1%2vvQcJxN^B* zP)(W*^(ZBY$&q-sLCh~KNJn*%)b<>j{@Bi#!gYUip}U+$N6rA-;vN80hi=kEg*pRP zQJe~x&U}p1ph7^bhZ0Um}Q4@bA{YV&_QLGH>JOTTQ@C0~IIVXVZx8?GxoYWkn^GS_(QmMaihx}vZ(Bi~29L>fx3NV1%HPD4-& z*U#t!+uU={GcD_(QLGQ7T8}13Hf_;Q!pIuA5t;dxZgBMy{quDeVn;tI*vfn^X>J(h zh3rcA4il90c|0#RB~=o%%N!&I_JQ4D?7IbleKF;7z>UtK(7)sK%(OHAW6_lcvU1fb zjGhFg!ByQB<1AK=D<}7J{eGe0d>u;J{85)lTG*-gb+t&tJa_`oyO6I*YA?}d77@KD z6#wuKEeya=kvEbEdIKGR01CkXz@rPH)5}}7j@u%xz40|btsf6Q9L|6#_q#TDh5W2q z)^T8j>91;31gF9`?F@KLpk1>u$Cmqs_lsfMPEy^+v;-0^ja{82M9$Zjz0L{YX4T%l z^=?bv7u#+J6?p%@{s#G^<+Ob%T~24M%$BaI+FxeOvLq>zLpVW;EU z$KBl{&tf(zX7-VJZE-MDaJ6<9l+w$ng2%(5QBPyJnum_(Z_;#e4Y+sXV*o-rHQ{A^3AOZ(Uer+b3?vSt>q^(fXV7 zm-$jdAD56?9k3ij4kNuB^VJF$Dz@MGW$q;?spC$r8cma8=sUvnUG93jiukD7iYt{n z1K$^;L7u^{7a~muX?LXibh)!NRyvy1nwN@wocinaE%z;UhOPH0diKs)gB>|JIW2?t z3i*Hk(F6b&W6O4KZKmpiL|`rr;0$m8#z&5h_LMtB>brBqmV2?w5?Q=ebYzT*^4GJt zf^KA<108QxYjoPE=~Ru^uG(ojyF0W(<{i0Kr6ka(yBeSCMQtSMeBZd@>VkuY9?Pq> z=kz$>Gu`p%GA=5ehNF6CbF3U6T^1iSVxnY$>YQ9LR4O^9dix+S`yl{5o0{bguYr>Q zE)iIXJ1Qp->-*whUsamxg#=8E)r4aSDTctPc&X1DBSD)#?&T_66dc`WA@*}T@Z?w4#tw*ia=+GB0!v=wgN6oM z-=ki;jY4C6B4em(3(X#b-xT(k+g;MNFMe0uw$h}5;{fjBa&d1=CxraSFJD_Dv^lT0 zn#>mgBar7|FhuvQk1@l5%;EiI*>Sqx?Qz6MHz`;=#62!la**yh3zxgw=F5Sn)T>Vz ztWyD%wS}?eB57Km{a_OX+ZK(l-sV)b6&mHUj+(bnc5&oX7Lew=x46-d{keCvhvML* z+`$#*!H8k@ro?1w`&;8&F9-h@vyu_(R%~j?_B!U#mKj-y>e>3f5hEOb@+7#(VI+uI z!|6`~XAobW4wW|wP7V5fr$>`HxsOoUowch~(q5b?DN#bS+$BtWaJJJ9aHlw@tUvfP zK6af@kE&WWt=3<|2~M+*OS*Qv&!r-C&VL@BPIe9}MSUP`Z62Fdbd*6sL+cfXCj&Gj zJSb{+QkZsH7n4<9BYsNlXbiDL+VTI%*KL}OUGHoZz)MifNHu-H#r0N^P0?TVpULr% zyZiL;qe?a6mR;Sa>#29l;n!yP#b}v!8JcHzKNOMD$i~kjTT`^ z<5_*a%Aoo{Q5)^c8+V<7sE?YbfLweCZv@YiD3g^grmo z1$|N-ZbZ7u;b5r=0`n~b*mbCuksn~`2G^T=_m!w`wO-Fq~2kQOsp$mQfK?~2=F_LN?Y zgFj)FrlpfVb9%}!>ejZ%7n2{#rKn%N8*u8!^4d$D7H?$iF)UoQU|QdPCAKJ%Wqy`P zQa3f{QNI*c!`)SJ2{k3e--qPtF%#){{E77@owV5y#TIyYTs>){ofKv6r=HEMbs6O! z&!|1C-|_)QNKjS_fqJBB4%DXe;ZKS#j#Ppy1CCWt&3^BNduksA7h2e&p)abFCTRzF zcbWb=>D23j28FSuK(0t#P1iL7&j9~6rlkGDY!tQJk5R;^BMJ4Q0w;&x4dyQ`UFX&K z%31fj@=gL~kY<0fYwAj3{y(uP?<|-W{$J77Ck8Q6DN}g<(*3&2HbnefY!>Hk(4t>G z4<3G(@-B_O4NGGwWC*uGau|!}xBSo{rCssLl^IAS=PRlNdO8G{Tk(t--L?hIw==QF zjnHA4#2t*6X$KkDlczo$eCoOK%b=VbhFHfM_xiz?AaA;+Pg0D?{-rR5C1X&y$UH0* zRhHhep;2PfBF)gUAXgWn*(TV0Z(}#rFifr6i}49CxD94VEDcEJ5(td47RkZI2~dDd z;EF1pt;yN_a9O2j;xSX=Hgu@+PBN7`AcI%Fup-=B^@N&A?$hB=WPSFz(z(mWD%qZS zM$^1_`VSf?npjfB<0YrwZ2Cg(thSdCcCG7%#ihd$EPs1gV!m(FFfU_}uU?S%wa-|d za>MKpl#P`o=X;wD4jX;1dFC!LEIQy|_A^B=ohyIuaEHmYVLvGhU&gw3B8JYAF7h=L z>Wq}ekWhM2+og7{vmxVs*|7FGA^q`30{`Ux$-dbuRKp^O)2J~mX6H%a{S{GC$DQfa zB+&f_0<$qoiGK+OptX_(&VLUg_G>>t_zzL@0uVK@svl9;-O}+snc()+YM6BsgWCk$ z@Ca;+N`8pU$$5g~xv4H^W86d5sG4g5ea{@rpl<}bO24&ItXba!ku8G!njwtn=L*{pc4txPhyF0upCVKzM>(eRJ{M6T<8Fi%HO(<$wplM5Jv0 zSI~U;d~bisf%rBosh0TD^XX(?dFjuf?&nEocGm|SC4Ccc1a*zMcGldPFt?4&JWQ4yG8~E zOPczsoHRkVx^t@CnwU+*l;9~RSoD1kG;Ny0-1LXu+ME}jq%m`cI*EK{ys0eS>TFiG zQ(M>iuc&6+8jNzx2dvjUZPAAfH79o#te=?;8u~joI*<(oFVf6dM|a1`IKo2p4*ub0 zK&~f-Sy;fb;kPUC{TE5v#{hQLWI7Nj$CS#J>3tC0ckAJPIAc|F@+%NA1(RL!d&D$C zl?R~KYhuTd{bJ@U`|a!We65EWA4*~(Jmh7*c7>Rc5&DYr>9YzePM-E5B=)YcA-EFt z0)pb56fKpWsz}wfz~Wp$6^9&_enk4LYJBp-7(ri;)DnI!nF59mJsXNoj>y;1V9}Rz zboS3T#BU2~C~9)>Gjtt?ed5*if` zRE*ck-tjo%H<}vjHp$Pv$6hl{{I*LjRu7rH3vx<`{vYO(BW_WsIed(M!uAAd+PMC5 z*hbw__&F z*P4m8f`zrJ`A3UKu2i{f;CA^`6hps5bAREDJjvSe{RzE@e%%wUM5Q;z$2Kt}W!>OC zgxc*}>AZs}c455>O0#b0Ne4zLi}g`!x0i0gTM&@dKOH z{1HcDbl)B_6Fk) zw4NX@Q1lZF;a|+ztqzW`MHmDcH%r4=m|8VR%#{UO&^1^LJ!XxP)rJFtzqJX z=(^c;g{=mJp-yc!U9sH+MIx?`Li8g-i~J-#plYP~M{ioaYs!w!+T2~KN%3kqV4+cT8S;!cJ6w#Ndv+*gGBMFNf` z>RaGZ3`_Kj0ua%OV8cf7<>AA(MopA5c!9ST~kz_Ig|w4Un63aRGpkR#tOpuOIFudMEjphE!hxLf{`M zZ&Iy4g&fX|k}MS=U)SksC6a&8Do>4gYMK)-*EA+1nc~xJ8h}t#2YvSu`wtz1&UyU*k{t+nKG zML8A5J@Likq9j?SR-O|Hb#*to_uf*M)}sbGB|bQ6-w(Z};|P>CC;AQ$ z`U00pLK>s*5#?wDleGz2XzK2Q^lOGueVFXdxRJ(3j{uZ6hEE&+OZzb?dm8+JsdUwP zJtMJJTbXsR?r{RLvzJ74%1;`U^M(dJT!9w9wD+O+nyq= zIemxvi?^Hc;bdV^`-UiN-A`Bm8UnbWi4_{|tFnG{L{ZZf7V{Pul%i?iZs9-IGMQOn zdH=jLu~cux=M(wZwENCQE!w(UBX(S%`{WhMz*ntUehxhYVi<=4zj{TS!f+-!-L_tykI zR@drE;aPe&np>e%6?G$qP{P#{@p6FiPP&RfXdv{;L(ZWSc-5;^)OJ@qQY3s zsWG`FDAy@X{Ubjz-=Us>%i~&V@|r?xJlLSJ&n!;lWk_-THb*DLTv+iiHB*>>rte!PwHbXeX6rq!3$1aHT4mj!?S1M0cO*xBe@ZKk0~IjU9UH&zsFTSHysY?gZ}!hCl1|O863TqtRhi#2=n0|37oHV zuACzx2u_ep9qATmM@@t~&a}Up;oJXoVC#DgBwMn=3`oc^mtvn-Nl4kF3BL;yHCfof zZ1@T#O*!05-Ph1)qPbjl+Iz-{`GFCO{!<0_dxqqhl3~n`h9ZJQaL#FNUyl&4ssN{f z$Bn&A`=IWZNuySO#e5YUX@ol6eD2>^xP$8Tki}@K)$?qQpcLZ6haT=b`%`lb2isMkv&I?1GlO=|ez|~SBcPnKN)rU%2Jf;H>b8D49z zq9_qZEaX~-$xRS*F6>!6y07Ko)4ltuN!m->u9GLGWE;c(?lnP)yv$v-5Aa1X|Bj5n z9sx!?fNA4)-J>s#Oz8H>9$*SEw#9@Q?1&Jd=$}pNA|Vfl>&9aQU735lzo_7X;gID< z#XhZfTRz;`HUrH-S0?i?-;VI3Kb>pXG0dH(p-b`x7w7+S>GzP3N-TrNcgalCp zwG|}uEnsvxGM|MPx@;NMF#YQFOFIi7z4B5w8~fgIlBudHEYSUDV^MeV1s0ankGm=f z6eYe4%ruC?V+@lN%kK#6#rbkuNPKc@zE_^b{&Y9E8c5LWb@WmjkkHtqufHcZLK0)c zLFK*k!Eh<78f4{Sv0oyV&IK^ne{3?k3d}wM(#g{wH9$PjLyqTyjzrCNCvA^8QEbmI z#prvN_iS8)VKR&Ksy6?9|IW9N@fr%#edFsELO@pW{{nOaZ?6)S*Vvu+#_f# zTffM$wn-Y5U+gXrW5tcu1DoTF>QmATlAIK< zc~=#=OX=ft9M_ZMeFFRbq!Ih-`s%zJnC53CBeyZcaBg%Wmuj|1skbcGYA_$}kWl3f z|G^RToG;sAp3!NNE$JD3L`&Ed-*9xVGJ1M)d^451kIM4u+hg;*ieQe-y1+;QB&`zp zA80*~6IV3uvKHl-pQsq+Y_18F-K%)RR;Vn9yPlT!4bIfYIDcA1qq;}>-JB~>pjpO&r>3UhYP+wF;vY#GUx^2`+dkT~8gnA6L1|;OYTqdn(}+PK`|lZQ zTU)JkSjKgq#H4I8L>)%&IexdXkSP2ZtlEYkIWI`;b=Kpsc8?EMaYbM(>*ysnykDl@ z)Nqon!6rJ%&tn-Rf|A3cu<;Ao)b6k}CwS$FqTHdOaF3qgvU>Wd*yBq&b=cM{n{k)J zHnzY;>cXlg0ud+jK)=%IKp}KF{(XaA+k8BP^1)&kX~S{W{UeRC`Z#iHfqW4@!(mzn z!l%%_wEJ25cZ=MV9BYkp4sCMvSZw5hkX?+^Uqf;xpFP-xou984!%5tJLAw1m=eyhC zT|PSsEUUwg6i~qCE|g-@c*j}Ntoo}&%S}F%C-e_7&6ygP3?U?oUFSqK&Gxv?j>bhy z6h9_iy#~csFf3l$+1<8iFt!puU{y+5wn${G>#>e`$;;XZ`lfm$5-$*uSqpfynkuA_ zAJ0D{p30%tAaOk>Gig2SXF2~o25bQSSlxHrBQVsIGGV&>`+-W|ZwWk_OhoC4OEAuf5(W@5P?|r9pwTt#pyGN`eKE+!>81XJ!eLY~ z*V1EB%+qOY3}#}TKjx|F&=pV#-HsK8+waT;j7U{pNJ8-l&UA&76|EJ065 zqk3Ajy$_7;*Hxb%vHHgvU<@XZ}i7x{xnf%~9nE-(8v5yUUOK)k>(FX^CchIm+=~!A2HR z>J_;-lXUn~Kh!%Xr)E;88LDp>S)}p6A*$ct`jODYt-a8V$9w$Hl&w>jku7?IC~Ol= zqw+p0J=i_98~L&(=k{*x@$aj_SP&h7*;*NynKk*p#>NISFy0`!dLVYH{NI>>Kn|#w z>sDmU7P`Doomb>*yB|nfHg!ZUr}URlpTy?(H7nJnb$>&AQ#LxI)x0i`<#^|9T7g|V z8U`qz0?Q6N7nV*F#)CcZy*lfH@cKi0kvKXiAJ42oLB#=9m{O`f0tw$gN0U~jJEFc% z5D?X^rgSlLN5L@fGW1~9P*kb(qcfFLfZuV&*b%}rRP0E|KMjZ&C9hJq%$O=$K13_uyGr9DI@ZvND1gOP_DkaW6*X*%4-a*Xj7GfH z^Y|&nC^i%O=9>3un3|F>?1T4Xz9v4B5=9SIdH)u6tqbMPDuerSRQngRKWs~E6=_I@ z>m5!7``gcBEl4G&zgU^|>&{-#eLX7WLB%VxHg0(bw*U1pEN}b`y>01g8UPRF2@u18 z5r8-aryB{rd@c3A{NummN_Q%`K|~u@;VXLPdDvsQnYmVWH>3H2r#E#puIds^dyO~P zNLwPsVabnbSk8ig^2_Yj0N`BgL+K9hPjp;8Mo_=w=(B4RiEB#Afv_>=jmcL7bZD|f zv)o6q^k}+e8}uK}u@VKF8R$MyIy*`ahe*)R$qzJR9!dnBI;$e7p@kkHb=Ef~4}zIFM&;mT_4K;na`DW!d=w%T z(3^@V@MrF~5h3`0TmUN|Hw{Zbj4-wQ^|Ssfjqi8*f$#YaTYw2Y_E@{j2cV&0h#3}1 zj1*gr2C7C>;y^J7N?fpf*VRP6fbisMoR^ra^bvta9SZlo{f*7qdPeC`H|N_1g#zta zMP0H+xlM8POKtUpp{{5omluAnNO6-X0q}e_kqF{uv6d(O0P^?XjG-*-J>!T6G$Pxj ztorH*#D73YI)E(2!e4YcdUINTOwGMhJ6JP(LhHCVVmjMGX6pq+S<%^^E_2UDnQFn2 zfw)ta+;@Iu7rn>G6C39lk{9rmr<>v4uIF)QXR6i=IgtcdYFJ;B8VAy*wSFy?aWMwm zwB@FxMrlPV=0_+gZ>eV5cm^Qwxe~L>_atr!i#OR=*m^NL6N1pm2XE7E#6lI z=GNny_nVDeO54&%t#q1bMsN}PZ9kaRjGpM{&Bg|0vTc8OnLeY>VjJ{vGpn2aZibeL zy(fFwc=h~SlDTiRytwF$4N*moRe8xEqxZJR(=QIx6cJntb85i39Y6%;k#@Y+gu08k zEoIH}{;j_H-Q?A2t4oXiU24yDu9wpW?mO6# za7FvKE5yx;8QzsjM;{Ue4YjAB1+QmoAZl}h4S{k3QA3Um!l0)Y1E)bb)czyJ*_pDpQqIIcz~vhU!qZ2*MS0cYo)hvQoKXW!>< zWBU@?Q~RK@!JT=wxbidP?_c}QKU%4-R14=<%XgD0ZZHM@5WzyA&J~XDRLB3I-0)Y< zlY-r3jxGKAZ;lsFbdgV})Ox~N-bH42Dg?LrY+3^Of{PR1zK!br@~Izn~n^%ksu zQ4WL7-jG~YP=OJ|6nBv@K0F&SyYQczyjY(S6H&AqXo)YvAZ1I}EBndeCZwgD-$X~8eDPFC)jl`<1;*m2p z`v_A`Jj5%Qkv=?S1#276>@_ql-T+c zkWpU`$()Xg!)c8`3i^TgUMq##%Iz6ON>_2J(rdy^FEb4EC#j=jnNRlfLS_xdGia(S zX~*dxg2tne?B&es?&tl!xN;j5YYF+~e(N3D2$Q-U4GYv=(|n3g)Nw^7+b2H`=gILY zr>H=Cf|9^nOoTL1bt3LA$A!gLm#2C^D z+Xn`mv9tO(KZKgsb4BBf=+q7^@m6xkq6iElGMmHTbNpFszbwQ6R*YdRfkv+m65rf~9oBc+@kjXk?Laf7COgg*74k#QQLL=1SGlCe3;*mwUZb4Th000;S>@hT zPKK!?iEI0AO15fDb80UHOejVk$~57n-ee!s^?6}|vs25PI}F6kzUl4UjjUyO4t;Q% z+b?HLopG*HiIb<3jJT}UWg1m-lCc1lh3Xv7BMC2>3%em;3A?c@85}%#ed*_NS@YU- z*_2}boWc=igZ}VuJO)(C9(I;NN&moTj;}zrzwZeQ6!1Q6y5+EEG3=n|LgaC>SVf5T zfe6Hef$V~mo&i;g5bQ@}w68u@@alFq8$y}Y#f+j(I#RF;)j65}0>mbJVnjP(_1n>Q zL2T$l&thS_IyU#36=@v&N^?7oz`X2gQCgyJE{w^j;;x&qD4I2LIKY6gzS3>8JF;QH zJ@G8OfL5ni#r+IxwCv{)gN@oMw;_HyPy81WdI>>$R699@Dhe1*(!i4uica5bTNYVn z6Fr7B<`>&*k~(d)pThfkXN7?21Yc1BJ8o{N0obcK=AMPKw zWr_zFDQa)@WfjJWIISCrTppuy8Qm#!Kv!qA4UeExI}T{zL$*Q&Bxk?mC2#!|^Q9rI z8Y_Yl>+?{M2KE#$+K_B-UKBTOU~dCVU{sisdgsDuF+ohGc{ZOc;U$a-5DuI<04|X{ z?mW9L_OeDTX_|(dx;pBgfGE(nA;nbVC=JbJoQgC;MN)xu&UfwZ(Kr$=#1h6llz9eR zBQ{moAW&l!Hf+itXv48PoW+{Y>ZYE7sI+4}R;3d`?@v3Th}yk3f<_c_bcrhm^3>Bh z0#6vRDsBcewDY@jExVB+zZaP0_cGQ^`H#7tec1aEXk*vd11JBb+pb4>VcntgJAqlu zJU^q0C2-@B!wjMT`=~ML`2}HbX-t+1p!-7V-#RbqJ3p_;vvzxY&r0VKS|2O?_#Q%= z)Aeg=N9;gCIjU9cr|xA6GhxnIWyoyWta#qx1rs(iHM^lj1@Zws3X8YPRY6%(mN zsIGxCaBIS7vH+VRVM@pLkt78Ju3B-zni+(fm4?5-f9#6fT){;t-#sl=^pOx`A`W{< z6^_I-+X%kZhnNf~?7ot|yXKk%I5;MMMY{Qn^WpqX${k0?jI>iUr(L&&w_K7wN|jahvl_&2pZB z=k!jh;~S$)i&o&Gk=a0TXi~pF_*3iaeU+$@GZw$X?mqTu(hy0x-<`8-47rgdjN5Z+ zsN{aP`Py%dYI(6_{p{_$XLgm!%1vny>o|D5zWdSAS;DxQ@|#nj)Qj3`BXbmOWDT|) zAM#03Lu2B+7)SP$GZg<>-t)$(zc*=B)<6ru7OmoqtV$lIN12WFY*LTUNK;ZbuR$w_ z<>?$k`pvOkr%-5E8w^=u1b_YCC~1Sg$y+5n-l+Q(i^3L z0WgDo$J0`N`$_$>`@1@)&NYl)T6H5}8=-4v+>ffNT0(6O&r5P^?C^kyJ4^;PW#41t z0hK=aks_7Pq$dcruIIGBYoyHz1aq@B*5GY!`KQ*hx zYPs5cJb|#P?C*L7H}em1mlAfJWalZ75HNuxc})M8V#7#Rwvlh2Z-w2w<6m4?>}R;a z%|sh>2K*af-_7DwL%dNYIAcQE+rA55ooaQi{JzsRI!*Z!LFtJ3f)OX1s$A&qJjmofA24D~x8gA?0oV^;Yz6u|l8a!VZKE0Wty%Q}AK%3!q&3r+t0e zzVq^CVZO&&n7tn7+sB<894F}t&`gV4$FN29)?;xcZLd1qI{b2tWbq7q%o4`RBN)2w zw?*c8OAj1^GMfGf(&wBcWx)FZ8Cu+q8YThZQ@l|K&f6qJ8AcVM>L=owo8VCNehu}s zCq_RE%ZV2nN)17X@a=Et6lOmyW4qx}R=z$QPUg-0@DNQL2?ld5pMb3pSH0CD#^F2y z4s{QXLPLA*$X~s{W{B2lhi}ioaZUH%`DBp!^j#Lp9MiwcV2Mf$M$?!2%Lv(E8Wj?b-(bfBQv85v7<(@frQs@QN!F0P0!Oi4-|Av`HHdowf3I08BfGm zgX)hkp`i)gP$NT04M`5)q)oy_uP_l5kdg38IP&V-FSb+|Vj0mXIrtfo^Rc0i9Jy=e zaQ{6YA&?_7;ALeLkEi88zcfjUvfSuzSb4y>=|&qVv)?7lFY}h{I$82xF>q=3#76LE zF1>R@HI@#95ygf<4Bv0YucfN)_2&nC`9G5E34U3SM}T^<<%kJG%0e11R}tNOeRhQMzvqPzOg&SDl{8Q`~1sg=T6NN zP5h}doMEgj0zKiR7+{UFV|xcEAPz zGGM&a{G7io{FwPZj{j&F^`cE8Zd-7LS>xfy0}5EI7Ww5z(+Qop;fRK%lN^y%>(;3u z$1}w1{?^tnfXnO#XmsoYlFXt=N3rO|K1z3A2;hv=k8x*vnR{cGem7G!LjHR!5IpQ& z7{fouCoKz=DgiCv^Xj&qBKo4B2b)FIjp=Z*phSxtm`-6|pkD-!rqk!|MW>P(yUyTn zDzMUKbVtZm75#YsBvXtLDe8a~1z8Cd%vl3{bR9O47H=fbYI;^drvKbe>ix$bln=qi zRZ_L{Ve;&w{J-3s-fu{nQ|CMDJP+mwB37{qCW*(lV3hESu&^u(RIi2%V8CL)L zt3INdV0)iSJ@#UMB>tK{Ip!DHg$_>FV&46n)^LrbQXNw~wY2lmu%{_r_F-h!=+_}W zg;_9;%p|ftnNMH+$pE_0+0^r?|Lcb?9blSJ)K8e-_8}a|Re>CV03*@NG_5TD?XwdD zGrBYwh(}V#yUoR?m)q_ZLR2D@u`(iKJV)2)3!ke@FepGsI**2i>Ho=KVnl0`n?R#rdVhZaXE|6~-*wo_5~$m_5d&AtA4%4VMBaDP# zJ(-z;E48CUsG5k%QKf9q^Zk%G`%}eY94!mjU zzFZBy@Vpcs)HXXo!N^YjSJU%Ey%9|D>;;M5Uf2XCE90{5_4(1c^soDdU;ECb=U6jI z>bqeKX$4$OIE5~DJHs2dlpzdO`FQfgSI#UI}{zA-F$97t7#X+O#5TAO=N`Xa&V$7 zV#V4$jyFd4^dvi6Yb=U19oM|Ne#|!(=_TlEG5c?m!&o24JqxX*hDXE{?2edX>r4>z z=r!6L?zO_VOP41!@(WEw%{>Zz@OT6dlp6I~*&Q6Hn8}pPuGsTUdL!1st>`5%1yAdj z#A3JvTu`mIIgiGDsJsC=Ya$S5;PBx~#=n`#!^(N@Z~L=<%{l+eHndn!h)_)PbO!$H z;r2dDHsytsOpapaVdTosAA&|*4a#b&0Oz7F@XaS;B#NtwYB*Z)j9;j$3h<3i3_W-% zJ2MS4XudK_$1~*C=obFnAJ4LDM?KDeBr~kL$IG0Y*md$J7p;nLaa1uv42+0?2o=Y6 zUMXJ;0k^*4=ENRrHGmz{R!fe@(MVi97=rE0c2L{ULtc7Ljc#lutxtMzDTz%i`LN1| zDM~E!;PY;!O9*jm7xbc$JBiPQ+OkAf5l`T%`Kn8r&1^m!6ObOb*9!CrT z0cI=i&o_4vCg3FRdhtnlMkYc_Rj6qSg86E{4YK2E65n{z*F8Kd9)8GGa-i{|e^HUl~*=HpdN#*maKM+ZaB0gQjhuI_=9awqvtu?mwu397a%v{2YqG zslj^J=r>|IZWB4fL+@t~2v&c;*Nc(T4RA1eh-+yrJZd{+ih0m!x%%tgB?6Du#VKQ; z%9HSXITH<$swP7}w|Fi`ozNuTH@M1q>laKTA*Xx3uJf27V6y=;y54KZVo^P~LU=NEpAkWDs|>08pP{xsU5pw3rE$*hZpmdT zMYV9KW!^Mk5URh+5bHbzRfB&0Ni4?J$^NEWwo)^H^o7ERTeC_Z?y{!y%ZSqZ6Sq(K z#xGg2RT1uTDsjO7F$f~`1Gaflc`ks5zDY<$e)jf0tsn9?xE-~r#TA}(g@*XD6pIY< zNsOdDj3l#uHsn3GtDpmTvMf$iYlsodU1it$FaCY>eG6o(#9y+zArQHT)7#k1+0(_R zcKiX!jo2S@ZzHxhMcYOxF>f@w-0YLw{gau?Yc6?CP}fQCeg`CqkGg3aijwdN&R;Vf z1}!jruIOp~QXP3mf%2nzFMm8P!|2^{wF`ZJ?y+$lCEvGO$f_*Z*x5QVuY+lLzTcm= z1@3)b{NL?~%!L2DEgj!<>b7mg%HM~8r9OZivq-x9N6g>MBY#x4O+~`8nrXX!YqRXP z9!3huW^qwNsM_gOzwFpL)=w9-bW&!5n6wjPU58FAy#kwwdS`vc!yCgr&(YLmM8ZZW z#;NrDy);T~RuIR3{ZADUNIDXfQxBM{a0!}~5aLu3bhRGh1By$~%)_QZ`^y{4C^u`L z-90u#@q5^r*%jnG?zdodE)sJ<^mtGa?q)uV>aZ#N^f_WU1(>9nUHkW4+g_Tisln*} zcakqGqMfc5`TBPZX0{FzKar2PfzKHI)`b!-_Q_{c!O-GCxivkU`roaRDGB`f+UGvG zALY5|$`UsJ3T32@99fN3IAC+b+5CKz#%A555BZdxs0Fbhh)TcX4R#IN*c>7aM&(;V z017^S`mEXvZAqz4;J^NM@sq>Iph2#p<-s1${(;FYikLxJ9k?W!g>mJ;VXPN&Fd5mR zsk^LsA86oyw+KfHh5P&N2J{z$<^7HqrE3pG^QfwR`J9xv8xI{JXCKURO|bb+zO~kg zfKlem;7or zBN(P0;VUEk(ZW^V^+!RimW5Z1xz0343(Lz#-X_oLy`-8Jd=SL?+=Ii5`()Vj?Rx~< zp>Wf+Et$Ifk#<7fdHNqr%6}phI_dsiusS3cB|H^W3Emn>|pA^4cgTK@XR zwv(?*LhN%9QA(zJD@>HTm^k^`#>H;+Uqdwr2Zh5J6XRH*3EawJ$S_c!A|XWF_6|#5 z4_?AaAHLbN!!7J_gle^4bo5pTr>PNmkEJVFT1Dw9HsKmY%24Ada~PWjj-bE^X<&Zq zzc79cz70eEnThP$js_H;KI?tNFfTP4>{joR2+dJvvi|Q4$zgP<@fuV z*>(^)J7LUViSpB*^JQg$Yo^yBZYSx~%#zGrGmw|6c}70(W(s+2<7uIL?#FrY{30xS zF;oSTE1wrU-c+WZ4bvYYpXiCel%shNspIt z7t!#Nlw|Zw5@Ya=9ov@;LVq&MDIY&N3%>hd-kx7)es*?@37>;GEbXIGyWIyX=zpR2 zF9Kz^eN6pl4|8s$@cet-Lo3Kfla2`GsNfYWdPv((;U-_Vb5{;ljS-uYqgxA_o0RFI zAKl8`j`B0TcuJpRAiHFpQD+hiSco)*ukzg7s`JAIoAdzL6x#2D)+|bH1ELdbzx!{0tZU4n zHMw(6013Qk-9gUODY@miHOGWtJeSwE;(E9*j&yc;*&E)>))*$fMDl-IjCoU5)nFyM zx4a!MmZw>HayADD>$z`@V~c1qrd&4LEuzlSZ<(^{vdavXo=leSXig9(lGlfLR$^Rz zu(y4uOyY76)of@F1{RgWNLpT@l16EO3KCvD$&ki(ag6ND-ct* z6~d(i962q9)nSVzUz*-ZhS#!q)pHB&v6tE%6pSWTPuaN<8~#m1Ywe^`v;RlGC-(PV)a;asyZ2~UfsF_8d_}}M8JewT(oddgkAXnl; zPnuY!wYmbG_k=B6vq6P%Lc~hKcD(G!U{gGMc)Hov5cwD^Of77?E>-{ktG5;)pdyBB zGP)Q$aUWuk{k`u;zA$H=*|BErHG9LEVef8`)j@*WHaai>O*Vq+t5j$^a^i1L zqGvnEb=Hg++0x#g&5;<=V^L7)rmavWZLtQtu2#+ik+>&)9Vczqg$7P;&gGh3pW8ZR$I+|Wujps97E(<`s>a!6dQBTgZVuH1H4KX*_Q)K6NrWInJ5hdlc!}csI zKmChD06-$P59aELIy5oP-s>9|%g48MTmpw2aJpxz>r^rZ8w8s4-;PR8vLccXu=QlVDDg3@y$p4ALREehC$(Hd*@- zY|GAI#S#jJOD#q6WKj&)si1#a0BXI^%-b9oNTi9k*3Ie01H9L$uqulVdp?xU?!$?l z7V?06s>r|XK~dJVV}uKWKA6m|$1pG^TPR2%jWBM-#oA#GHRU%qzzh2Ld6%KhLtKT~ zU4AOj@~G4sr5zuwKq?Wtpg{PbIuH~9P%5xE%*&dwtb8pOMBn+{&aFmD9~oHu>~5zc zBTWM!f;KM*=S{U^@WIWC3lsn$L{-1de);? z`9#^RSf5biBFb2kmC_PrGG+-CJ|~LF7yGbD{HAwaG$7l3g|Nzp428WnZERY$Ol9yG zm{R@Ih zB*fwyHO}ecS7)kTU8KO&f$}EI_sBmyj3x%zm0(DQE|q4vY=2W;$F81uT~L!ho?#ZN z9~dXg%ch~f;4JAEoE260#(@r&jsYZV6o_D)&VN~SlzTHUS$bm>V5pW2r%2d>eiOJ6 zCZ+8StxYv4Rzs7y5ap83z}n=&ly9m35L5A^-6R8U$#ZcMvb)iPSMeJ@ISS5kXEfSk zxermm`d=OcK%^3NyhplwN$nwxo9d}-qFiE5+RZjHoQ_CPWzB<#q0e%$>S$UBZeVXE zY-G?^CR*moaV^`{g)#^#6pN>IO<&(7-z%nii0`x2>07`1WB0cU8ynu-FZu*KB^5;h za$rj+_`pM=&?t)ImzZn^3#~}n=y2b!BJy;@N@GY&{xOkYY~s;EphEEvNJ*CwBVRMQJJU-uSTy$C#0L=9aG2PQ3M z4xdS&qHV;O`RHzC)b{+$f4#nFW#w-5g{EVf^U2S`{ZGn$xBIF0zTdUr#=-aB6}Gh8 zh3mW%ctwzzz2j7egdx0PjEgorYjUH2Fmf+YAA7(;sy2r$E=Wi3wf5ZL@k7yD2H#+n zJ}^5d8j2bMF2Wct!cy;yFB?-QX8jVf+`gc_%q2mp_VaQ}g6PhCr5Rb!u}8S`cFzDO z#RLU2qV2rXw~M>8Tv6@W2J= z7!>ep0~I)X3ero}BVW=cFJYc~0wPMK0hsCgNNr7A$`B)bT|U9Imd(i)0e+gW1d-LM z36BTSDkhibnV;d@_a$nM(?Bkcdff{D3#JXFv;m4@NtpRp&4lxO4ons^xO4mb7vnJmlzI?9w|q@rFH5{5!=fauDIN){iJd;d-N{ zXDgN(mT%NwD}vP_!tNWWG9=EhD8xL5x2Ae{33`V~w3TKOl?%p4f-^Gsdg9bDPzPn7 zcw|fR6AgpA$@AboJs&qMG&;6!?G>)9=-1#&d^;A+yOsTGEj~@)Gp@tRfwZ`nr5^*t z+}*E{o_&w189N@|FLnhtBAXHf|5S_&BxEX*&@{<6T*tD=S?O4mHj7fkA*My6NtHMk zDyl*{`8T9o!FRF{IdK>;`~ zPLd!v&0f%X`xW`O8*7VVLuZy%?NJ67ZJCbpual@#I?f*Hx;N1rP>p~DzTir{Tw9)2 z48v6y^k!Js$bMf-~@O8y*`+plUQKM3oiI{gy%Al^F zW86Lr#shax@6 z`-ewV|A+Bff8m9OY&;ev)+q~#Bn752JG#~?%q}`%S}YZ56dJXUPRIxkkRW!5n-Vm> z@kdJg?gKuIRG1pp@HMJeN(TDrd-47Y5;8F=!~cwr9pr{N%m==T)x31N;EJGyo<)=d zZ*8!3g1t|==$HCJR6|V!%cj)FOj-%T>QS+b=AD&7zg8?4$x4zS;*b$^aCIGQY+8@0Y4zNR280abi@a102gU6o- zjg}0)CkhO0gEme0)q%(<%7ix~xMPEzdb60hYR9t&oCxu<$h%c)_NkEpY4yjmw8!WiGm^$ec_2Z~(>HYlq z3Z~8;;Z^&lPwUxrPnb`Qm?mzbyyip5CoE_Vl){47ha}E|9OZ#sT)pu|5l{#!rh2%O zwL2t&`{r7GnNIDufPmcCf7M6ixdsE2c6b9cG6WV2kOsB}?QPd;8V#8OBI0M5jg6ZC za&q>^w*6-{M9GMR95&jFM5Y0aOS=L(jJc&Z>!*Z$azl}$i}J_VpI{2p?1K=znz-VynzUStiAwkpEvd`C| zXJ>QG&3z*h;mgR6IcJE3FaBx`f~Kp>fQsU^1OjhJm{^o+|K+%j<$7WDw)0u}*F)S*eT%p^tO=q2_mVF(30{>Fn#G0EQLfMM~> z+s{15PsC})ez&s*`uZZ)7%1z}f74?~ER@O@Jb@h_31I1;h%b(Xd$Zs)`M7(o^Y*dS zmt+XB7=`sJtd6CUN^ED?y`o%&>YW(2vVNadaaP~i6doQdR*)<@%QUF)O%o(&mOMy8 z0nHv6MzOk89zJ#?S1D^)WvS!@%jw&{aKXX_Yg=VAe?7}ZOs~^PdhVNc&3bhmve^Cnhaaqa{WL%a?u%lq%;; zC!Wi-jki~`&CT1S65;Y1VS6!uO;J}Ce0F6^2|Zp4;EupSjCgf4@8|66iJaE)1%xf6 zB7FE%+F-We-8|>^I*P;|UXQOtXvbcY0xDuO<)0uy6d0P^Kby;2AQ|R8sLe+eT51uy zwVamGd~S91tGxz)Z2|)92nH_DNFC9Rm$QvwK?9L6JG_jSz5|-E93$ojAHe4OTs8=z>pq&nOdprl${hwF={L#C+JX2p9= zxe|8U@YfbhVBuebA~p;5`KXCyuRe_12;M9SXe{IAWvo`h)=d_5ZEmo2!KNNp5J={^ zr!qMjR_?hpiE6vH&OZIzhexhqLl^rBW1kGp}b()4w+_K!NVdcy3ZPBIPf)}) zo!c%q^G^PV13t{Yafb|7W07+^i0NhRrrMeF@39-M@Kb1LIGE!(P<%G-rpde?PNO*| z_*il$MZblfz?AvBXaFlv2!@zT{as1-20Z+#?bkQ{T+*)bW^DhJWvz+ZZiJsBCfba0 zzS3C<;HG;mHk#DP?eNmkvYL2rc^93crUI9FhWu+tLnOP46y{0xM^O}Veh`b<_*|(B zrEroCa?g)5!v9(pLEsZG7#%K^zaEi`$UJ@q7O!Sp4$GjQ zoZzq5DO0e*N+y`Ix}$E$h+ov(1i!UOR~jB1wwoVjqt~2Q&&Q4IU!Eccp5y!f=ht6> z>p*tX8!(R0)a*r=Vn6;+fSW~*qB$MA9S$8>O~nowc9K~%1vWw=O7vdTS_G=YTwQec4mngD7~?38O_TCFwrqEK8`In?4dL z7MGb>9=*2dFw%^cVvIY9%xa*!@qBX4r1Nl|QK+wf!HZ03#p@ya-&|9R1D)gNTYPrW z3w*phUf81K{^#qHXFm?pzE)S)HY&|dB>DZ3dnCB4NOvk!-%D6+o|3t>BrMl*6AT@a z5eg&FO%8g;uXdO$?{&D%dy!T&ZBmq3Ed)KA`Bm24p8tWIAmTujgn5F9lx%ISX-RIB z<@!FCGM}>daFY$2i5t&kz-tcB@GeqgM%a;6YilY^{mk}-$jG4Phhpvn*@CU1hHCaJ z7-SY=`S00Jv}sRUml4=4cL_)B{={p%$p$Z87=;W{G+}+^o>&`%Ne~RqyVk;h6+G^l z>>heP+IZIAxPCy=)mBDOm(n+-CDS-;Yg3rB3EqJw_pXsC!K6!xr|QQ5+4P@nd3x+j z_XPde%TJ#a#|Wlqgk`SbBf#yS;G(BKvaPA_e)nHt#2wnNJtd_>i@Iq1VcW4L(r%CDTXZD+DZ&n?X?=uwyYLymHEm#c4J91$DnL# zo%L%>{Nz1&R--ClhT zBXQZRX*0|pmqbj)h~?>w4C2|;!yH=49Q@qECSkidXF zn=o+d53Z&Y^Y%t~e8n>0LRgIR)_pr(Em|{<^9Zg?DjHWm)$+Fc6xmeLy?l&+zvbEe zx~Aj#OlZhC2V+U>>F@uq17mL5EK$Mcs*HnCECECN`15{9WyyAo-2ds|Tgs@>K!d|r z-~1cR2ARQQ#If?hGkLa5b(S<1qHu*QHLYHZA`}R^{ma;8pvy-M+-f~k5RZo2)R|Rz z7_BHjaR+WE?!S{^PsjX;9ccNg6%TmsSmHq^Z6qy}oNR(fOmkzRhnDs6&;sZfm`Sm} zmy-YK9PW4o8Tol36I404K@FFh7@WdliaWZC#aDw&dhGCYg+Sin@-;jb8#omB%j2D9 zz@#CYG6AKgLC<7BYerBI8Z?(1G`Q3jMN#F!nP_6jJb~R~}ahLnh0+X)ud}n`$~@irQpS*X~JU z1Z-Jo0>9dN|DMg?PdG&bifHV*!zyaz)XI>nz#lJ~MSML`7owzvxbMf0PN%qr)xMWT z0fyo5qQ5|9o*&(UU#D>ar>sGI@|=ZJUti? zhST|lsqb52MD#XHh0{o1{Zm|&zc_|K8T=UjuUnuk_r@i2Row#`)YM3MFicy&%PK+O z05O0A@J{c?bcVnve6Ulkq)-cd&z&2>UbnkxaT3M2P?|JiXt2S$o*2v*6hSzj6EiA* zYQ^Fr*xP`Z*Aph_S>glHQ?r9GsSSV@Cb^J4QO$D%7#S1{>I)`f+zSm?$ZtkRjDMDQ zmO>T(k^bk8^2EflMg;AwH)Y|BS3gnY+;$-!SM6a=yRTp2rq(-TcGg)}7R?Dw7bNF< zHy6vnX_G!hSBMmX)|(-cobIb3Cnt`4SHPThKA`imJ2PI?GmZqTFKnPYaMJ;@LLkOw z`4XsiND#0^u`gg*#Z3@FzqJyS~+n#{TI;yEQL0B%1b*JiF&aD zlw?F26`M_wGSxzAUI_H_gZsE-BRDJw*C48jhisc4r(5+^PUi4}!wh4cgOomLv@9jf3(u zhPL~JEX3_szh8)#>!xg<4&n$tkU!M_Eo9EBS&qeQsy}rj;SY2r-KCB|?ocvTR zXbgUI{HMODTt4UR2jo|+@0l0fjKwBrLSJR`n!OxN9yt)?bVWangaLmB<^XrnSLf3* zw80IIIkDI>q_Y1i^tJut|5M&uo~#xSMu9qhO(y7n8X$j10|*i`GHXa6Qff z?@b4AbwFdzuN9-goHUbE*sR^<|K~3dFaazUjdtw>Jf>~a48oD5yg?Wi3$X^GZ~E;4 zKD%EZAJ}&{Ap|$cSs0CiixySG&ZDB;6qPx2hkMRmsQ#^KS>#XMq8m_Pc`)wk#IAhG z#Mwm8y6+#`%Ic5O^}0TBf^dIL8u_pH@ND~tyfFb&Qxpr`qyrC399Oz#wR<;_DxuZm zOM=QY`439oS2!dSAvl3p6yp71hvOAjuGj8m-rpUR&W=py%?+Pxpbz}2D7L{C<|Mj29p0xv>6g8grXP=N&9Fyw`XAp5AP`1S2B)o| zZwd-aL;9RZBxU`3XH-NQMdDw-euZX#Tt{2?KZU6ymBCcNlB1K>qNR76M>8NSsKQr{ z34bkMl64q9pUJvfuE|uq=Fsxpd4H+i?xDH3c=z+b)vHTO;C>5%`pZjsnYZdiL$-qh zYJ^(9Gt%dH3>u%b+f`2?vux=ia?a^`|JH&HZZ!*E*GX?62nJ0Em~;H z(X_YOZB&Otwo89(&%xd5|Ia<1#3|~BwJb%ou2H(m>nhx%D`!$$(Ppn60lb7j+1Tf}+^od;i$|WYzE9ffp=UM?=JG-GocV(>1eb zAFnf(J;!j7;w+d__y-2u8@iizPqgMX*`>;`2R(+tH2D#?%<_UzW9;*wiW#)Y=G%Y3 zABc_4VtFd_V8(5mo5K|Gjz~4xdNfL1lYT%+jrM%Es8B>QbTjx>tpY0cZcf`o>oH&1 zpdt~y@K_?bD#+p1bfo9t&Y-lm>tscA41oP$%y|dLn>!E5znA2@Pe8Ep6_2@oiCm$8 z9kl}^T=-L8GFMcJ89V90}ar=T1CVLXLZ4dCLC*qNdY8DGC{pOwmSrG9EHZKS&r6*;F( z70hewkNt7QQl_q#R-Kuu`f#+Di*nwO+D#J=&d#EpHY6A#Glqb?VBnM;SJQph9)=XM z7FgAH_~>_m_mb8{U(&iL--X&sph5$=JUtYP<_KS3|7c$FL0D~eHNs$M(kQraeQfGp zH#r`uLZZC}39rhzlLx?T7&x&Q`uDTyevzrR+D31Gpx}<^s`Y}&`oDSyJ4hhZX5tS8 zvVrfLh}N>X-jp5WN^~>v49=1)c%azA38)0+Nl;#AWB6A{nyF=JEjD)jIaU<3vk@4_ zGTpqzTWUV_wro8gG}w5VsnE=dgLH~aS@w$RKliR1CV*-=s+3BL1K^`GfJykFZhCi; zl-r*tI!-6Fn8SvlzN_xbRCy#CG(dg zw#dpGrYKU1Od?DYa-+MbCW-$GfM1w`Kt=G(7f5-|xB!*zfHtk-GB>02Jk)`xriax@ znybkVCEfx)_#Y%=vGY3?sVR3X;UMPE$>9jN-IjXF%asAtzeZP%sx{i429H!+Sg-Xd zrS{`b(0$H4^u3rz@`( za`koBm@dRCZaF7(^v#Jq7!!QLmt8uN5e=T5;Dd4DPfOMbmEv>{&FEM8n!l`eTk+3! z0=p^l`s4Q+E*qGwnyz`sbS+A9HrrsmO!d$VJ)Yp+Z%OYbAw}WrV?B#1Ge)z~=eySK zje2z+wpu#J)3B%^1=R&O>gH^qwro5tel{P9eRKqpK`k4`g~;FB!v)Y0iy7ikEiYs; z-~o{-D|btUvF$hA_vANT43ZaJ5)q!@nMh3)uWU6qx$%&IQ@jmq+tb)?cP zFQlC{vt%;{$!ZrBmKiNpES@%_^gm2mQNe!2+X`bJeQHURGkG5Wyf)VsXi{b9Y=Veg zK>rQhKcNA9+v*KiFhu85K(fpIEPbxmj6=&tz27DRUPf`@;b`-(NOJg}G4o+6UE$1D zy|T;F3aOL2N4H#<%eI1}^ z9V?)cbT@PsB_$YU<71X;D964XIg8@uk-_g?edbhIeMS!XTQNW?z)Y6&@o=PW-zbS9 z&7BfOqVB_ce9;FEEOup55((iHwv_+SC;*F24tu9;@_C-?ftNIiMlx~dJmM=B!R6A~ z)K%DKT|YYXkaNURpLrg>b_PT~rw~0Bm57S8B}84GX*dY}0;>5Gj`k==u=FjDRm$sq zV5sKvZ}b8moWEJ2;)MeCet}C@%pi4nVyI@m-#bZ@?T>#1yJ0{`=|C7}X?&lDfdoTd zft{`gvggZYx6>_t1?^rMfYenhg_cUNj5K@V4J8nY3WEq8@O4i7m^sjaV}C3sEjRjc zh5p9me`cgAmghvH9a%ENu7#~fz%dYdB5Sft5rWRZvf){py?NZSk>47bg{xX#Jg;xF zhJAP`vKG%^+n@Yq70tKD%rs#C-p{h-t-I&xw=aHf$_ffwOyVM_4}aO^yk`Kp>OY&0 z%2>dLa)HWPGlcE_{3doh3qq6#M`J^Q;Nb~y1e+4*f2Crit`PCD#n#yqOJ$|F0>w*+ z4WMuG_K0BnwXVjo539q$bK6+{sx3e;xsV%1suEelUw;7r|3wnriZO|> z6qv^yhDwkoCq*7nesS73G2pEXONeh5x1XTs`GqD6w64~4 z^fA|V%dZOReuI}j<*uZ*($^k$EM{Y&gzq1aotrb4mJ<3BLXU@c>lB!rLh8PDFuw7y z$J_I5*F_@)Bi(rTr3!8Wdxr}+_Z_aX2mv*FBLFziGKIbW)cZymi$WwgTy%!Y6Oz*% zRn>Ra6~aSd@jf>pTVib8cRL{t)!Xym108?7oq^tt*dZ7xR<-FZf6Hb7o0twcM5TNZ z1bl-lI3SteP4A(O;m76ich4LA8xy;#zl*wRv4XYwd34IZSfwG%7cyfhPuGI_rsz*A zUo-oYmaO|BG&VM>ZkA-wHQhy$d!v3=T@QaTrNG`uC^l7;1;G~Grd5VwqK>jbOI1c_ z{$d=Yc&ei9F$D4t7(!1s=9}&OZ|CU7ixOnC7lOFtv@Kb2D?YOogQ@2Q2X#ihahQb= zpvxOfHhixie-$MuuM4G(bxq(R5_jDHWs|sKp(b~Th9X-mfF;R*f)ySxszvz+&+0=v zTX)v(jUQBVjNb_pq*p9#;Q&w818Av$-n^?ynQd3{Zdz)^#n=@akm z7}7{FhD~K-j6^NdjX-?{e~-3F`J01zsg3L2kEEje0$Y;k!XMXvPAlXv2dDqmf{YEl z{O0^9D3z_yldgT{cYrYky0i)X*#b1$y9qK+9}pIuS#9L%XtaqGOOgM4zh^pN$(VLN z5E`IJJ{#BShIaq%h7Y`{tRrRe2}i18I<55U@&XL;uMa?|qyw~cqHz2~JV{}>Fz1$5 z-l`Z3IIC#0OEWQK%ZE$b`E@=+pY3R~kT=`(y--k5|_1snuH!wUXt{!ydT{paq8 zn)cRfWyM?EQ*!`C{R_qX=M?KxX5y||RbIBh&f1#xZKNgZB&A+AQhhhgnUC2b!`N9? zz5B=iAQFIm*}z=VMxU{-QsoJFzZNkN)v6hCNS#*l8u^lbT(d-|Q~eVg<(bS89_4Af z!IhArhoLwqCwyk(Oxwprh!-rP+sDdUzXRT{5iC6xwVey^0aLc$fyht)Y6rwv0juBk z>jk0_ax{>S=UgX+Tz87(?sKdJn{jWTF=Ys7882kvWMitu=rWT~ccRl$)IV-H^+}vo zLeaF=9r9`i7&v7jv9eYR=qh9pYUvs}ybnC(CjTqF36zcm?r>#qBATUF_(b@rkLT!uy`S9BgrWylZ#DF9S!O{FaJ)d*5QA6$Lp@XWqlmS`cVx^p%L25b&n z@Ue#x;e_zDdy6Ab-R&9PzpTCT;=rT_mIMPWedqrzw+XL-4zw{uBH_kNoO5`0od zjAJ1pYC7i!hhrryG_?;Qp65Bydir?%cFC&4 z0n!`~QU8jIWmu%Un47^EqJ*K_RD*zz+ZBnBYJR^#)bVCl#lQVv|M-|y=ga4N)nB(h z;{X%_fa;HKBE#FVXh^&`AmF$^d%T{^W;gB2kIoyvPc7QGdZa!v+W9d>MC}`_2>(b2R zV6`jAKQC$T0{IZi)5D$tY>3^yQK@E$haZ z``vWjq7vJ8QkK^yuIte86o!$Co_mF5wuA!@m*WUuO1}h4;5sZjlZ{-;@9p6%@?NU* zl0{^mTBHiavtV4p5DVNv+1dpBg+H5l3?gbV@iT}`+%}#58?seQAY=+030-l5yrr=f zmrB;$uFVJJiShkQjj*f7{U{&<1o{Cte%D8MTJmsA0xy82y!`TRyxZ^L#+f*IY}ayZ zmqS-~RPShcd^CpxLn~0rHJ2+yET33wg;EmXqPrm&+1S|8ruE%Q7eHKmXs3dIH`v-0 zHbf!{o!LPu`QA=hn&=a6Hk;=Z1>}e83%OJF20~DNjV9~V=F?QQZb-Kx%tropKhoM5mS_l}%B?&?$D873>l-ug~*)o-1cQcai zzr{W=SdY8r0H}+TXo#vb6f-&q^0TtG`>@<~;;AR)y%Hwvfh>udPf^BId8+;_ zwxy=LWxgb$Uct`{O8p^84_7=`iGvu)j8sX;#et4 zojzn>C?yA#@5%DMX|C@z{Nh9sRSwbyZ2jjB8<}}3^Q6;6Kui}*5KI}dhX8#e4i_tO zm@b3PzcVFydHdiG@G|FulLmmkO3VS)18GP&=ml*6Il6%x{OS9kL-#?+w8Z8;^P26dU9qK)kZbg>Mu~@mXXAeykM9t+I^f~_gV&ni1NFuvfdV5Atb{_V zSU+QjZ#>^Gs-zzU~!)ThfZTN_vd}cxd#YU&POx;6r!Je?2((lTN!u& rhYFVlf>+qoTB6@#@XoFv@2gkMROuo#W|^0{rM|bEsRR z@7bngobvHcYf(9{njQh)B|iXzOwOe@E4`xFy2H;?UW6o+6bi+!<3t~?91uu7HdmT| zXhKP$MbK_sOPHGaLiVuXEAzRhHL8jv5QX66@`F$0;U+RT;Qp+oH|huotk|Lvy6Mc zBta^uahg}7y8c}bXu9{1*(V7d1yy&xoKqrcFQErT2_jIlLoj7oZ00b+ zXy|??=oNUP56F*N4cT>ZdB`u$lomNe-$`Q+F*0x-GOzJ1$9k|_@{w)6eczi|dM~j7 z=l)wp+?Go!ffmDrQLrmH=cF`T6la`ET^U>bp(W<<_s`gc#2?Kc!#+@lb0^d=4=6{TE1nBKatos6ICyK_%7;#w$jbxs3SV{ z)fK&sXf^oMzmWP}pe{cdCgqI!$kn@Z#mx;;xmgw3JZfb1W^mE;Qsi_lf1|| z86omTcX+|>v~J(JpJOwt{nqUm#=u};XpQqftOPSiDCUUSrIVbRJs2>hSiz%joNPS@ zgPB8{(PCg^P!(9VIUCR9cxTVI)(c(}v3<&i3t}mqI3W5k6~yj!rEVg~AAgrsP8fPi zJHmmob;i}k=+sZ1VJR&r~n8uR8OF!U8Ad`i@>`o|`NEwq=vZNGu z0oIlJZz8^Oe95)N&XSaE`NvTCelFqSjC{Fkpche=DJ?{m%B3dQI5%{%%7;SYgMvnc`iwialX1tMoAZ)ciag zu~Q?arcmxWtJF7j1dSnCaz@uRmW~u(2O7UPFbgBAsh%mAGB~hts?&Gz?Z=Z0mpeiO zp!wJS(l=l66T#ClFp2{JF^N{Lb8B;eIydP1_wV=i?dNnlKah- zaxf+M%148`s+NAwg?mgJ$jIggCz3;yR~?X_-B0)d-KhGPO{5OAp}DO@&U}%#w5N?r zRC)Ah3FR&&wO_w##~@ZHM-`9IKIYamFixc^VaoEMP0^?M$@Cg(& zk^Adg-DAXkedl60eDm9o4+A0cB&!97K|EP*cZBc1qb>#>wOZGZ-I_?7eXR&dQDm`H zPW!b^=n~~8jmDRpssx+b$h3>p+D3wd>4QkA!{nYI4?Rx}x*l+TDQ=ZA%em|4J_k;vNZ zVozU%T~&$pv|D$YS}8!apB+_#KJ+HbkM$?AXn2*n!CnYAu8FA7}>SclzQau@j`^&E|v4L_qWMBl;}( zoW_!7c`SWVRl=ye(%_j?!4a!BumRge+vp$l^p_~yrKpk;G@H*KF@r~k^`Vl-$i6-N za=rO=sj?M>E)vXUH4*$d*B>oAJDc69o2W8Uaq!$SuyDv$Mn({bnUXR?>;(KSG%Q_L zGiObfsezc(G7|N=vKXuS(jii5uv9GtZT_s=648gGU2Jo6OIA z6*Vv-MC~w;*F!mH4}l0zH++k3xz>jbp5}kK4K7d>WV`0&vZ_Q$QM~3ivz`>|`*gd{ zQ_T2@_PsN@1TOR~D3~@x)6($_yIxf(b$z-%eH%WR-<#l$f(5_(@pyh~FY{S3$sLPbM9iiPma0H4Y~_d=p);zjzaoWO7f@2U)hWLbLGhW-g`*p-h)i?c{|5B! zdt&Q+7#%x1eSRP|^4--y)~;4zc?brb28= z6qf$$@iA%Ln#)-4D05ukX-x}R)$ijblj0PelAh^@elQLtY}jbg5V@8;lcx{&YAFwG zGL3#Z)^p9w zAk{v4PLWS(&zDFK`zdK#DbEiG>%Pyz>D+dB$qKkst!E6HyQwqa1PX07Y<0bZNC#VH zntDlje$DbQJdYgoHp5s=R#_3YmbFFG-}BmG+zYy-+Qz=9x_-B~d0kzs>NfEDrsXpy z^YltqG-@*jH0&JFZu(Uzur6xrrXuczV5#pNDzPEu6qSd`YUq8An4y~GghPWsyJXH* zrxh+h2WERNT?tnDh8L!KS4#A@e($#>&rmFB@y<5?d&5s~%yD}4N45TKmtW25J=!q( z>~NUZV_&=$`bAE#h7Y8mJX7GlWHuPa`D()~YMfp#HXB)}!Yb&CtN!L7yByeb-~i}_ zB-dYBfU5Mqh7P+m_Emnzc7KzO5p;85%K02%y+QB@xtx_C@BB#wPjm4Z^pqTmA&4vQ8Hg1QNkg zTs=O9x$XnoK%#fmjk1L`UP4MX&KHUYVNAy(nz2YexfA=|WCBqTb%mJFQ{PkXy5*A0 z{!n5^@EFS%7Ts8B>@zW{o+`TCIW(#UvnaN{PkdD<0O?WC4JF)CUO(6E@qxHIG9+B= zyO9L}38kif%E&qQ7oWRDf(r9o>4JsmS1DLO`FK#zYEG~^pAPNLuIY0FhRFOu>pqWe zKYwL}QS%d3mX)dRo!BNbVJT#`Y1r0PG{%po7C0#W=2?MTt(*x-XryaWAYcf=XKbxw zs->{pZRu&kvv0n&sv8;1?2~7%m5O{N1dC-V>nADKF z>=%GIwgZsKKDT;e1b5T2AnY$N{YkrV?eR^-qoR>SPbNJ5IbFEjQDRr>C^p4E1Cbid?}J**f~!)Jnrp-RvZ=1A(uq?h{Uvf5PPX;>=p zE``r&UMkAt$F=nG;J{mWV=Jbr8PRS~4#o>-ZUmb{JzLGG$X;yk_s59@Bb2Cw-IKMV z8+jkQ{X97=(G(9GWGeXsKNke(-y;~Q?Pq>)4webvGAEk832}TKqDyF+d0yqG14k@d zDqR%lRTD3RNBART?!=`Hg|uJ51ehWoaNPVInrGEQ<0pX#it6W(A=gAdchdqUTb4oj zeJ$HQwu04fmkwg<9*&xL(EZ3vZa_H9)bv&L z??F#-0$fzq={>!D_j$?vM8@MT!Q?f|DpjGuOs(o+9@6S~XKP%%Ew^kVP8mHoKe$0B zFiAxS5l!ePy_6wkX$ey&BQD;+AHonha^l_&R4iC8lovnvHNF*OE^3DvpzSLc|wA{xR*H{OsB z5%e87Nd)4~vK0TCT9p#f(f7-505z#gl`?D>ka=rhwwOlWI*J8&05THzz zeS;Ym`FR-fc6F}=)gz;8I63sKx>gxfWh)}F{z~K-Dc)X@g=5#DL1pNB0T?}c3LnaD8(O$EFO;Yj`-F# zr9;KI%9ZrE%bjqS3+^)I#AT>tJ;@7J9S*%@r&_g zHuQE%Lu^?!t#&Wa?CW|%>rO@P`|m_`$?b>Wjp5_n4S$1Y5#rdCu&vb!-KY=9>9X+k z!cO}m?&;`i$LXYfa|L3a;$G1NoOV<I_ ze_DVb=EtjH>ZjW!a}|`Kk*?h(N_AO26$nx=5jlBO0V{*{bdX%_x@pE6ciI3s?+385 zpfA$r-3%_&!cXP$)B00y&Yobf0zW)trDqdS(Z{CAbrl_YCPlH9|7I}=I1LK`q0vZ- zKAgd{UL}rgcHfuwRghT*@)}!$|P;)m>TPs@|T~sGA;(B7>mvNQa$4w7O>Emfa-+6KIv*(cc?J0xC=+tNymf z3N_R~i4wo2p@ZRRPOE9&v}~H=jWXQJ0Y#)GY&5UPf6>apB#~WdJChzQE})$?-sY(; zEb;)%&jMVcPvO}wLLHcI775iC8mXg}^j-*$@G+gRLtEkvV^>6&B&mI(Id6yCoj!_l z3{9r`hl)6Du9DbX9-X+@AmhSB=39b(e5R6zI}xDU2SL|WV%S(Czv{x7 zxc}}6RMd7?OXhZ+$ATc9aTz4}8tVgfwVW3XtnSS^@lZ?(L! zqwKj1&;o#>Y-(zbB;M`&w4SsRZ!U;#fS$ddeXSWAG3YaGO`2J$8rj(xcf$zW z6lh<+jx1*qX?8bacD4C`G<{=ZoNKslY};&Xr(t8;YHZu~#I`+gV>GteG-+(xJhS%M z`^)@*c^};uM-XSQ&{P5yuNQ9c05O!O6H(cQ)l{(yv&`Sl61_Zfi3AfSHa1FyHq9$Y z2a<#ZF(g^I2xNca175oMSg3B!3OA*#i{T8vsOYc$o*C>SkH zdN|Un=xMy{Jab?SJGOfS{QpC{^FQ;p+m)cSSecm)XP#^ff@I1@FBF1J2HtH<192DHc=0dZK@wzPj zXnSmnX=tKhSbefx(yAoSgnfd=_LI*UXz`g$0bKBK#K=a9Sxmk!6yJ>&@Lm#M z+1J~}YjtG~TYLBac<4nza5Eg9mo6bvKyqXdZx61~Dhd&^tZOo3?d)xXU3;3tJ4n7he z8mE#9#q~*CtO{3`P%*V>*0MRLDH9y$PhQSJE{x|) z%~@z5)zm~uyI48hJcHWER3F|Y!_$KgDoNlYxD4F>95W-{3a%7VT-luJp8Qo&%jR+_ z{BqM>r22{g-gVXU@7?h87L+E745LU%G?ABIpNDRR0#YSp55|DrXAwjo$xH6I;$QDk zV#k-Oe~xY5`Gy#xSSGztTq>6=*b&*J)z{I$l^|$?pZIm%=PrNkVy63@8?&)=M@A8H zyk2y+NT};^Vghuz;+71*Nx%TUv728YR{@s$>?rCI`$SETKn7X-fR}2+0pXv|uvi-u zaC(VbNFJQ`I)hgESjsBUY#O!E@%2PWdl2B!@RDX8bzk|9qpCv=YYY_?D|N4g-u4n- z(~1q4T&u}}?2;=^S_~D{RxF`VcIFL${$L%7j#4wHFn=e&rtz}80 z@4vk41S*XbJ$hHPqQfcbsz%aYBBNG97A#2(8iL3CUOk(OSFfSwM^JJ2-Ppr{k(6B3 zX&B!}Lq?PBqQ*LOsf#v`Qghm16g7!fAxpIolAv1p`rsBC&M$#P^6knK?ESt%m@-yW zPjpjd*HRW*uDK>%R^8cRwd+rcNBMky-@gY~h&W$kjb75JmnLK7n#Lg3XK9R1v~t zVYCmh9)3umGh6%pKeP2s@2FomNWDu=*435qwVk4rklp?;R01v@Po%RAZnfV~}WmAeByS`(~81VvEh|k)Fg`$QZ2t6;%-}7Gv5>Y{D8wtV6YPj)V0avCGU|Jf zc2HJ=8%kMk?)T;lv1&L0HdY=s*~?-Nv03n=$p5yd&jqn?td@W5tnBSU#tn=xv=CGN zR|8X(*Lr*m84`K|Dg4O0wE%a%GS*H!F``i|sTGVbsW0;K!(BFI)TB%j*|;#E>ByUu z7_V6RVn{qSm_Nvf#9kik?%^R?lo&crQvd@J#NuZERpBdBz^jNx_MtwhFSeA}kV3@N ziSaAVkw|_`_>#wLQn!ETqI~Ho6fzIr_6C2qdLkVF4GJ=Qi3`qjadYY;GRfLpui+YRkSa8=^j>_xQ4&Nvnj?ohH z+g>_)-!`u5Iu6&a!q^#Q;Gtu~$MJFw!9PlSCcIJ$lb951K){l5Bngu6+lz`7k&=jJ zX>4?}ZuIN!GGagsih$5v2zg@EIAvhgkY0@J9~wU))@Mno$XhS^{*I$uSe{KEN^PUi zy}!z*%ql_g{xRyI*+FIS7R#a@aR=rlBkWBFV_Veov|=X9#d-G+LyP7g;Z;W3R0h#B z^IW4kX&5!FDD2+aT(wnf7U6|9;Zd|0zS6fH-h_(0m!L*ip~tYLPTUV}rQFDeFVyQy(aN88clhp5vX0puLtbQ?~~N&4@)3;efJ}MGqzru zFd>E(uVM?T37^F8$C~_n*m0~CELXFrgDFG`Ih?Wx7Xg>#ZngEc>gakPzeZ?-ERIyA z5_XoQm@cv8vYNkq*?m6-3VPt(;Zy|IiY{h=^I`o?*I6xMnJheDxOhN7Rk!L)Nf2?0 zpQmhy;G4fan?3c$LxdU}hiQ#0Y9>{q+iV(MZ_#M37$T3S{BL4K-V-R$+hKvfaRP-x zM70b@jlF&>!a?TsgSZ&RH8d{Z`tcyJeK)d0|FSG1zMt?v<$dCRsU757(0E{yg+dV8 z{-79=kGA}VWr>17wx-&yYC<_5(})lkA8z_eXb2VPQ@T43;6PZ!0=Gs;PQaFb!}+ht zkUf(J5!2ip`0Er7@PJ=TbHqAJ{408Lb<51(zK`QhV9%kxWTxl9>n$WyIN2p6GWKrq|AH+HaD6VNYDQ({tf!kf^z$r!WZ<*K=$6%Ia9=sZ;T6j%&t$`N~Tea^<=s_`sAgZRS&eCX%Qj8dXg8Oz}l!~f~%>A`S z2*sg(q#{id#g?6?N}0VjVI*;;zeL@Xud(z`+^EVf8 z=Uj?-X-58IEgEpXE)M&Rj7(kSqR7xFGOz=;LYY ztC=-501ZZw-8>2+C#-h{LZl3m$cJ`kUnq53F37#N2}l2}LRh3Oapkae;+d#dnvWa0-Y*@Rv3V#3=u()Q9eY#%B$nV)5?2oiJ#bNUAM=~TaLF!g-;tR$$Y zv34IcCd_Zw`+=cWh5lpxk$p;muddnK?cqd!OXKI=vd9l(9km@V^i%UYR2t>Ug^8fHoKs$ueb<+5r0-_ zo+1mtc*DNiCZ5fi2@?7=(H4M@l24RVrcz=*Qp~8u0C9j!!Ky{ z5QJtdL^q`M2x&w{ZDY8Bu-}H+z~d^ek1hY_D0nFLklT@ls`9L*fE)kV_gyO|V2@0T z7bBq}-wss!M?62-QRh;dig^z382`67JC??w;35NjH9`2jBQ4`jVLjoe<1J`f>fH)} z)u#=6HZ)zC{2!-|vSd(&x7f?&T?+@qZ;)$8fA6>?J{vTnCY(n{tl-^gi-u`;tV7Lx zpdT)(Xx)^KPcV!zEWElq7Cm9h-(utsnF9wbNHW;T4gdUBW zZtr(=sfVl@2EcRlX2Lu6+`x1{zS>?d^nOA&^*o1AuWNfFr_rQlBYOSJq0ag1pqiCr z!^lNk*Sm0Q2cK?cQ+9GxCFW z&O-{_4!E%<#s8puoIo>Fc)1W`zn4;~s-M8(-yw+~?w<*ufB$OqUWld{xCs0}bZc%A z>!_g*!oU~rI2nl*?D zEa)E^W$ZyKhW?Nq>)xL(9 zyDmGAR=}Jp&?xW{dBO>YL987l40!%2a;9ECDEtHl2Q+0=>ob#nhJxB5qR8O1s=cs< zk;GtWT6pPr@*6(b1Qjr}d3X8%Rs*d?ze|uoZ~>e7W*rZJQE?&W-$@6b@G6X^rA;x{ zc%PsYGQGmCDD&lQ{kWq$=av`=%j0i~PX!w394bKt9TMWj=2oWJU{8 zs(u6vsnY45O53<>RGZX9_w?tW2thfmzhEb*$AQ{w35Z<&7O~p?$yl=N?Ch)r))=cK zkIb{_RBL3y_ezKvRri#qO5_1#yP4iTDbfJAa6fQe-G5Q*k|9}Bhjig= z{mLg#sRTOshxDrT_wriiQtcF((dKjX3J;~FY9+cDA7?I=HfJGa>G~LTU5`G`hc?v< zhs;U)&i#`9Sj+7G#UzNLNIlHFym~|rarqNooG#W6Z<@_$;?_41t^XYKyg>fJ<1EM5 zK-F*!|59;EOofvUo-<@?ZE}BXzVwTrD=k?i;g9p$!3bo2o{Y&4T(AjHxw$2>rfrxJ6|4EXRBKAEmXHN~FjqXO6ry8YI zm$zyuRFOOtDGjXh0+(O2WyusU|3yK0kKl(jqmoJtEwS43-|NsGcs|qWB(xd6cXqbL5D`27Uk1Bw^iiQU+zZzt*#V_R#IxW zayP9=|AzJhm8KVyT0Y2mZv;dM#}yTlKn8r%!tN+paJDKeicC{90CbwE_9c>aIMo%> zztAlp)nlmzIW-47uFAKcj1Ynnu^oe6TrI_lw8Q2yj5joSGWo96__uDRf4Gv6Q(8@ z*jfJEBR26e5fhSQq{dkA()h;Pm*dz29{4&R~w&p65%BSvbCWX&*2`6&WJK#Zf#K-D6WA}WZ(;EUAaBEumjICOeZBq)2%XTVX z+It?)2>>!4>jfA+?geiGhq9$H6%^uUeqIumRhb4tKi@I6^^JqT#9@!4J>^dDu2|t5q$$h!z$^{hyW`Ep^IkEr+<#Uy`iWXp^)_uKeXbM$-X1~!nF(- z4ZQghBM(bfyZbNR2ZsTq-4X%@PE>D z{^U?2XGv)f5RonW#Kj*XR;x-$$Yrw7mz{SktRClo$6&|gBbFcGlPSe;kd^~j@#^^z z=1%NOFKyUc!n^C5eE`YCAwdrBaxCwNkHXhKWCek#6XI4`@brqBYAz5+iO$JY(bV6H zuI1_NWkfsF$syq5?4CA#N%43b1U`^8q$I7ay4_?#P?3Ijkr;9=O4F^n$+mKqPaj>ji*7BO8aAV-#WAJI z2*wD*dcD*ch`=WeM6%3vCJ=bPHg)sg*r0N9sZ-SW6QIjEW7FYv!j?of^(uct5K4K6 zG;oCLWBLMKhUVd!woN1a!X_{D!0A(m9pl|eU?86vpopU?11E*4HJuk|Oo^s3da)So zOZ{u9OY4Py_iwgvJtp^>7v;5}uv*PfH?2CQs_ek#b7S^Jxhj2TV2)TZZdZ}{>YwAX zj1bTRz}SL(g`EYiTgiU3m2F&E8ok|nWv1)JrLl$fuEQ^i{viDi4lNdfagp+M7@D+) zdxWtzs2?v-1gw6QyBi6N6l89AgCe~e`tMH00Rew7=e0W#Y!J(ER>eSQFipe|BP1W8 zf7~iUOg*HrulI|yy$}Dj+ke!yZQ6hw-ffYA_w%ujS%y=LpgC|wM7T<}%)~qY3M$x< z9KBGQu8G1P{N+g1o$VeUJ)O!<7zq-#w=cTI{vS42R<&VXxuYjj_Grp3W!Mi{ZSUc< z?Ygcj^@(_K-Q@VfUCbM`8plG^px>$t9h}jNbZq;RMR8*-HDDF#X|m8RFGTXcA7-6) z>1f2Hq+s3LJ=Ew)A5~Oc3S}WI8~5?CF+ylR+sWRI{@8I<|SP5mpiI1G-|e~Rq-r2BZ- z^>&VaKMDc4He$rQgEDE^^MpWaLQ=KZh;*~uZKyZMUC2~1w?!BcoN2CC4I{h z_GCV9x)Qqnge6^QA51mWds|4-;Y(7bp4I{mz-A9oYf!w(9S}X=POggUJ6?y9_K`=D zK;+nUSE&l`!ZQ^v2})>JHDdX@h5GnNe8Uw@HuC|*mM>;X;MfzCp`JpM@TMas2)wfr zxt_CaYdM`4Gqq5UVOI5y@CuP&;xCnykFLzEAOE0WR)NOC))**G6&G~x&Q zMZs8Y1g|nMtf{VQN`D)LPC2kM7^&6MI>nymSkwKh?NHa&BObqL!nY)Y=tG$2ss|d3 z6b2m1Xz+dRPRPaJiAlkW3kluvzsOWbkO%b@x#q3E))>@FXf=RfjyvckYs3In^Rp@y z_2qaFpYZEVn5E_8u7KsazWY}8KTTZF%iWP_*^gK;m$jPgZ%eAOqp8>l)C4|~c}P+U zbBh18i{)O85jCK&lp%tM=<9c*W%UF3@!7e$LWt^L=?B1RjttV+<-fmR{k-r+>e6=R!{ zD&!FJ15G3e$cj?ocxA+TYe2yAeby^n~uD@zhW(zNvPJGVFaJ9oZo%~#aD%5D)I(P*UZc? z_hAWTYbTy42#_S7CX?_>v~*Lfb${M-a!3?$mLXK_5$S1AcHfNTjQPS zqc|?v!T;UGU)sJJ7Q02DD6!7HMNpToDu#6I`Gh(5?E_DB(PK`NCXa@~PU6)yC&Y$8 z50O6Z(@GPZr#0Y})-K7&gB1RLOykrSARN)Ec^`pz>f8WF`!^)sxK`NcJ zNjRm)8S+DIU*j=ooGODP|2*4Tbl~))B0oar?NY(IHjJiL+6qxwfm*i>{N#LqmpU3Q)EotUov}=;eG5P*PHJvbyedIuI+SmdDy12iV#W=A3~B!9aHX-wOid5Rx}SP9_|l zCh~!^x&i{c+TEyOXXsLLqSr|-xa zq*1FL07Q(&Nb8$N4vB8EJK^h)7e+k4sbH+bqO~KGe=1bc05uy4yA5OxurEWv^kd#wKq3U6yU|uJ$~=nXV);^`uA86)cnm2SzlxzI zZE19LAt{oiY0y7Jc2}{|!rXVN$f9r>kHS}6=x(P8-j4Ad7lHyK_u_;7dIViMi2qLu zkhYM*2upT#NQvnoPZvA=_pF5x*|Mp$c8y=|4R|B7k6opjn3^&{DyMzD&N163ltQhN zCiY*m{p~QtaA_SLc1wD3C@X=MLld3RCM!aPL=`TX!SVn~}r?s>escru99)}0$El5kLRI@a31HRH|P7j@d; zG3xXBcIl$Hc{+2Yw=0lFcT?kUM(?v9PR;GK#&*;oN;v672aQ)5SRZ`!)WA`1_WMY< z_^#Ve18CO6v=X;{N#4vQ*KxQkH_&#$zWv=M%|vML%@2 ztr57G7|@tp&Aj@@Z_z8EhpeIRnQNAn1N3u$ame*_wYF!z-8g zVDJ$et^dWhBC(_U&;@spHo>SkTxlhjRO6+s(u2Mr)5CKAhOCC#GM{^Ln0>!|STny{ zdy7T(PX<3CT{jWqGt)7)k$cl=Zvkho?b)i9tJl@Av4s~KEZ=hPxyMa$GZI~!6GRNR zSUDXvu|sfy&f{p=-8ErE}fEh+J>c&y6fI7 zoCe1G+!wlia+DvQo1#X?=FJ%t{|iMU11C8ZfByp`OxbQ+Osh(qzC0B575@FbvOr8b zXiMVJ6bR zV>M1X!tW=xQQ^OmkLg$?w+)$h(aRLS&O`L5t31`8-q;1w%T;X~Fcpef5X2W3tWT32 zrHNt6Sxut^{`WC?Egj^4&R6vu>6?NdpnITW$M~l|VtshH<>s{vB61MCrhS4&6vTh`{oY4ZN z0)l^&Y8qKX!w^9&_X+NAF_xz=bftvgMg&oeYBOE;GG@_&`cJ{y`ZCtQXi`C0_mE8q zfHXV@2la6imOpX?(TC3jS9GACq7=$5J{JOY!%U*815 zZNslmRE2is)llp2ci<_jKz@AozjTlmvV?J}d4Ucm)91h!n_zxc=nhE(li^U0RstTm zaT;n!{!n4L@^z1O)gHJ^V6nSyd$e$(&ih?z0Ij+K+r>NcW*mw4h{qD7dLltMM&IYF z(=0r0)bo^F)Q<7B$90@@gu`2?`U9Ra!NAGf`*4`EvqV?X-|&c%$>HlznkYVutr#1( zi=d&a?FBw+Z!5*%_c(6ZunS=5AI3F+vJLQMq6co{FpVYA zJQ7|xm!66Ld%9WKrp!`o1s$F*k*XMV%IYVnvHjKfL=u#Ywfy?LA}Dwhp+FX*Bp(Dd zPxFa2o-86#yq`+~()5K$qq#*>&`WFoz(GUP_Q(j|Fqa8Y@*7(^^0 ztVYCY2^9nZph9i%p^b#v%LK(*9JdaIhvoJ^CuMq+U7p?^6#mP5`}7i<626aHRdLe_ z3wFzY+^f4JSaIkr*SZG217EdU%g0#1qFLtgCB>r`Z&+VM$0#6;mJ}JNIS6Kh%D+)zJVZg_N!y~x|l0qsdW+zG;z038v z8?0H;t=X8Asq)$Nhe$nkoIUj#?qyki)+^I#*)f>wRHd4)*t8z7LZ+^}d5;jN!zZqm zRn4W4w^xbdMVob?)f@%zg#)Ipf6z^*!)HQnlAg0Q$kgR^RbdT8L`YR1)?8NK1+GAO z%?lP0-W^R3hRI+`__g=Q%J>a78Q%|X-_+wU$fKrSRpibZjSd&O0E|Wko;w8~d zQ{&Baa>JDCQj-*Q#@r7Z%~ViZHyv#CJ;sNR$J~p}GE`{y6L+n} z2ne8=Z@w*LW5jdLO<(WO|4h}n5|#^w-al63$6qoR;!CoWP=x8Xe|rB!$@TuDb9|ZG z7tc1Wet_qTjUsrNEonpbHu;4lNFvM2X%e5j_p@lM%?9~pMgS+E9WKMr1OGqFbpg)g5>L)heowzGXh34>q);keMTEmpicq!Jy5Lc77S4I1SC5eJjsCH`BBeTW% zvTYM3$)hY~o&mN1?8v5eKtL1(c@Q14cttVbxHQ6NNmkK@FOd*t`lFw(pet*gb@ubb z$kvz$7I~;GtL0D@R4=pt2f>1psJM}$I7pNBv39xmnoVFVt=TR0NTZB@(!m-+6QUUI zs@zGb$c=eR`r1qk8_P|FZ5=vkktB9xUvK}Qrg zR6AL!Bfm%YDuO-{S^?ZWQw%-1#cT1!m zghAJNdYbVcl7|L@7Xl)cjO`CsG{33%(Wi>c|-7sKtKUEhAVCcZl>Bf6pE`rX`?1XO-k?dhf}~P1ri~g<6NVCY^C)mZgj6?Yygg zG)G96l4{ ztb6Z|Q5l`aibR#RB(u`~ob~oYCMx0f(M=@xA7}YKXI3`iWr#kco=8!E0Vs8H#K1)=EXY z7#SE9+S;-rl?@e9y!;q3I!igjgB+i2h9bClz;!?K?{Waf@C#V^UL7*k&e0Djo4+M- zh|w$@=Sr@NNFOPZjy8R*@o!mO%7n zHI@aZD-~N;mNhdj{6;?@hU+LNov27$>s>spf1C)54(6dQ!6p$z@f=~Lm@Ed86zU-! z8EWvEsy<}nHZJJW8;{-0WiQ&1RJVxGcvRdJRk8wx=-seEUlim0^3T7`tsQ zpNTOh!_(KC?6~1}l{dC6Wq$(6=_p<)74p2dvAJ6^K1MP6L(bvtMMKwPf7oF_kc z`pB}~v>zed#1Z<=LnVg~0eao_>G$*fX@T)2-)x5#tj!t_hv`>Qo7I$3a^pfDp0d^P z^xY_}z!w!b0i@=~$H!lge~gV+d4EvcylI~3fs*3vLC$Y4uQ<$2fC9Wh2NsV%%|lG> z15v2vGwPcK=}HfE)*L8{t{}obyWG5tu}hVnzf88V`BSUs{d8W6=xq)Jth@oz#(VP> z_Y}Yc;k7iIg5?90zRmrF=j1|Md+Xe{j)u}Cf|m}cCMtt}e0cD`eCq9T?X~XxZQX?` z{5*>b)fQxp5sB=2omsB%zQ~G{L^(tVOz*BZB0LTwC5f&@b%OqOZa>AIJ;}k?e9U|m z(SXSD-e_YnLT@U~lc-k3srl0z;ZTSdcU3?AMP+I9=p;^5C}L}7f5x0LI7ldLVtvt3 zKRchI9*AxBOGp2I2-=iSaTij*RA#b9j`PnjX@=GQ~>l0k+6y|AG(E~Tq3Fv}?Zs<5`rSDMH5GhYxN zH3B+>jm#xVu_Y8$lDpGni?kWZ^BNP!ajrjmxB4CHev@=vv?9K~z0NOh&{>dkEJt|* zQ5ZsYT5CtNz1J#F)Yf~-AY8RawAnSi3Va_XsB zq=JIEp|#k?C~-cdWx8H#ga!vJOR?8Kwd%ji9z06|ZO*_f^IssRa=)jj!JQ-yRnz`! zNYRBf#cJmIjeW=DSDT)yyaK2^lAJj=x`0g(Q_5P*Rxs&`u=R$ultgGXa0Wnz9?CK( zU4q>8l=jyX$&gz8vErfNv1AUzOF2u<_3snIqI~n z>z`%rfWqveE>>p_87mUe=c7xJb#fWzhv>e|3wh7FKWN{J7jblCK_DhR=e(n9v>qU{ zWHRb+EzUDm37d8P2d^Fu4q59@9=JNW>0}UZ2K6(Iyk{LkS*Mj$p){EdF=qwK8&%sm6e_$E@AN;ctU7p*$oden+c3`Rny~V%c~F{&pLj2)A2N z+G(*@7i`W(7g?K~0ZtreoB%hgcyY15aqUq1Rktlma0>ikNn4mizrBM4L&+l(wv8efivil7W0dLWEnO7_Ko zACmr2jt~$qUQFft^P{@@>#WZAYQ3FTTfaJyC2=pWs)GyYm#m_%IM9J({J~D!AJb#g zl?d5S;RBU!Ci&#yA#7mXj$+0EIjraP4c=iwzTd+((|Z=Frtwd<9q-#r?BOD95$B!Q z8guu4a0wl_1nqmTl29JRU zCjUoC11kE;8f5(jDc=Jj)mVC0bN6vRb4;F<~@ScQWvU+X`z!YL9WNO0~yZNP3G&GN?`6rY? zev^GDg=_2y{(1iP`?vEARR+gjt1?;$O{Y^TMKL)5Zzpbey2Hb-qT1B{>cKN^rkOMw zXg!A;ru)Z7Xs@;I-z{|+ML0v8R#q281}YH+B-z7$4d(`fKS=N9`Qp_$qIdESJzG@k z@L)DyFPXapJVB-6-H%nEsdKhU{WJkA{hQg%N||~; zouHtgtzqCsGjRa_$Dt|1@ULYRS~D0q3F_hIzlmjE2cda@vrc@W6X&W4vYJ-M(?J(7 z(JYNYJN2f25HnmUi#gBx!0PQHZ^U+0Os$y3nC>CsoVeXg>I9N3sDVpkuwO~SfG8BB z2F{?b?kAGg4F_L050B!%!f*^37WB*NYbF)Zs!7!HpsS-y@UP1xlhcM{os^OisA%C- z6adc9-yw$XzmLUm$;rY*hrn^$c}!&{t}GhapPFQs?fy1mHR@?f5 za}KQ0u5=!OcjOrJ#Uxt(LlnRBU3!;!mw_RJVa&{>@{jCai%I+INkfA{MStqN^t5@i zHJ!qS6d`KL#o_%+ANVB+(lNPb-vcrR+9WriB#J$JhdxOpi3@H1*Q6^gs-}?zQaks} zLU3@_t`YpIK8yn(s0Ms0?+#6<<+Wm`Q)A!N8(l{Z8vouKC`BY;JcJC(ili$MtiAKH z!5jxC*BC&ewnDo*QKxY;As0Bz+;urX*DE?^(u@6t&Gtl?Y~kC6+QfmuefOxT@~up@ zZlGCS@$L8hu3Y1+&>N+kEt|OyJ8NBuc5RK;pxsXwy>2MZMp#gTL_oF66$G114+?a7 zo_sKs-otK8#cqT(51GPpz<1ebh-88|-#P8OKbW;Vd(yUM*y4l9cWUZ9sq@7x1XQGb@(??)2wLbVgs@f}5f5PjL-n5~zoDNH>5 zt<08U5;8$vd_f#v_I`ntDbAwJ+XDw*V=8dhWLEI0FC6#hkVdv{!#}|kVVxn#a_kcS zHZ2vk@H<SnKN*fw||IoydD> z=lJSOOiL?68h4*l9Kt4q3p&(Ks8e&qdt4=(ut)QI)x-%A0A{4$#|BF`jtsrZ2Z}%$ z3kiMY>tFwHb>-yB z*zXJ0%d0we204{nR3K!NQXZ8wpNYZ3AKDVP0O(SZv*MDE`LMW?wc@0Y+ zFlp9=x1MQwelNz4X{!t9p#k608V2_;N^pzH{5UNd%gL|PnKBj;ttm3? zsxhvlrrq`14l^wPD8(23!QgHl`_pPlFa2+kM1Eu6PxO6SV@G6xIIZ4=$)mOH7jNgn7bMEo|*xuY8Yi>lvnCw<$QaMzN$G zvgA2}S1U0xjs1YBS*^S#w(aYK+hRI5 zjwR6AA8V2dq-N-ArL&hwEqekw!>lt%@YUFwY2T!w6(hZQAW8>HVX^+%eKT8vk@8Tl z&J^Bli6qwZ4ZxLW5<6r<`*lKi-d+r!JMRrg*%3`Fsu ztDR1q!Ub3eI_ybR@)GD+2z0#2-I(00IsQ56Bq-7_kNaS69SO)NCAmN&)QCXhwGCRV?#^fLr}9ORzO%%5wia{jq>XG}13rVS zRtAfP8eM=l%b6kTio6KF9>`YP$uR~M>%`dpXiOTD@d1g4o>zeBs<`x zxvE+3ey8f^O=6SLAd|h(0*cOQt$^)wr#wv`*S`@EKNbrr9YtQ1&oBA41m6Md!t)aw zyRg4`NXiKRgG`$F=!BqT;#aJsLK`0}sztJz8ZJfZi=jEPZ

cYB@Hs+)CJu)KfVj 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≥3d{ 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

B2 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 z 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 diff --git a/frontend/public/twitter.svg b/frontend/public/twitter.svg deleted file mode 100644 index f2ddba13f..000000000 --- a/frontend/public/twitter.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/service/Account.ts b/frontend/service/Account.ts deleted file mode 100644 index 49a61c29a..000000000 --- a/frontend/service/Account.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { BACKEND_URL } from '@/constants/urls'; - -/** - * Gets account status "is_setup" - */ -const getAccount = () => - fetch(`${BACKEND_URL}/account`).then((res) => res.json()); - -/** - * Creates a local user account - */ -const createAccount = (password: string) => - fetch(`${BACKEND_URL}/account`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ password }), - }).then((res) => res.json()); - -/** - * Updates user's password - */ -const updateAccount = (oldPassword: string, newPassword: string) => - fetch(`${BACKEND_URL}/account`, { - method: 'PUT', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - old_password: oldPassword, - new_password: newPassword, - }), - }).then((res) => res.json()); - -/** - * Logs in a user - */ -const loginAccount = (password: string) => - fetch(`${BACKEND_URL}/account/login`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - password, - }), - }).then((res) => { - if (![200, 201].includes(res.status)) throw new Error('Login failed'); - res.json(); - }); - -export const AccountService = { - getAccount, - createAccount, - updateAccount, - loginAccount, -}; diff --git a/frontend/service/Autonolas.ts b/frontend/service/Autonolas.ts deleted file mode 100644 index b0e9e74d6..000000000 --- a/frontend/service/Autonolas.ts +++ /dev/null @@ -1,348 +0,0 @@ -import { BigNumber, ethers } from 'ethers'; -import { Contract as MulticallContract } from 'ethers-multicall'; - -import { AGENT_MECH_ABI } from '@/abis/agentMech'; -import { MECH_ACTIVITY_CHECKER_ABI } from '@/abis/mechActivityChecker'; -import { SERVICE_REGISTRY_L2_ABI } from '@/abis/serviceRegistryL2'; -import { SERVICE_REGISTRY_TOKEN_UTILITY_ABI } from '@/abis/serviceRegistryTokenUtility'; -import { SERVICE_STAKING_TOKEN_MECH_USAGE_ABI } from '@/abis/serviceStakingTokenMechUsage'; -import { Chain } from '@/client'; -import { - AGENT_MECH_CONTRACT_ADDRESS, - MECH_ACTIVITY_CHECKER_CONTRACT_ADDRESS, - SERVICE_REGISTRY_L2_CONTRACT_ADDRESS, - SERVICE_REGISTRY_TOKEN_UTILITY_CONTRACT_ADDRESS, - SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESSES, -} from '@/constants/contractAddresses'; -import { gnosisMulticallProvider } from '@/constants/providers'; -import { ServiceRegistryL2ServiceState } from '@/enums/ServiceRegistryL2ServiceState'; -import { StakingProgram } from '@/enums/StakingProgram'; -import { Address } from '@/types/Address'; -import { StakingContractInfo, StakingRewardsInfo } from '@/types/Autonolas'; - -const REQUIRED_MECH_REQUESTS_SAFETY_MARGIN = 1; - -const agentMechContract = new MulticallContract( - AGENT_MECH_CONTRACT_ADDRESS[Chain.GNOSIS], - AGENT_MECH_ABI.filter((abi) => abi.type === 'function'), // weird bug in the package where their filter doesn't work.. -); - -const serviceStakingTokenMechUsageContracts: Record< - StakingProgram, - MulticallContract -> = { - [StakingProgram.Alpha]: new MulticallContract( - SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESSES[Chain.GNOSIS][ - StakingProgram.Alpha - ], - SERVICE_STAKING_TOKEN_MECH_USAGE_ABI.filter( - (abi) => abi.type === 'function', - ), // same as above - ), - [StakingProgram.Beta]: new MulticallContract( - SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESSES[Chain.GNOSIS][ - StakingProgram.Beta - ], - SERVICE_STAKING_TOKEN_MECH_USAGE_ABI.filter( - (abi) => abi.type === 'function', - ), // same as above - ), -}; - -const serviceRegistryTokenUtilityContract = new MulticallContract( - SERVICE_REGISTRY_TOKEN_UTILITY_CONTRACT_ADDRESS[Chain.GNOSIS], - SERVICE_REGISTRY_TOKEN_UTILITY_ABI.filter((abi) => abi.type === 'function'), // same as above -); - -const serviceRegistryL2Contract = new MulticallContract( - SERVICE_REGISTRY_L2_CONTRACT_ADDRESS[Chain.GNOSIS], - SERVICE_REGISTRY_L2_ABI.filter((abi) => abi.type === 'function'), // same as above -); - -const mechActivityCheckerContract = new MulticallContract( - MECH_ACTIVITY_CHECKER_CONTRACT_ADDRESS[Chain.GNOSIS], - MECH_ACTIVITY_CHECKER_ABI.filter((abi) => abi.type === 'function'), // same as above -); - -const getAgentStakingRewardsInfo = async ({ - agentMultisigAddress, - serviceId, - stakingProgram, -}: { - agentMultisigAddress: Address; - serviceId: number; - stakingProgram: StakingProgram; -}): Promise => { - if (!agentMultisigAddress) return; - if (!serviceId) return; - - const contractCalls = [ - agentMechContract.getRequestsCount(agentMultisigAddress), - serviceStakingTokenMechUsageContracts[stakingProgram].getServiceInfo( - serviceId, - ), - serviceStakingTokenMechUsageContracts[stakingProgram].livenessPeriod(), - mechActivityCheckerContract.livenessRatio(), - serviceStakingTokenMechUsageContracts[stakingProgram].rewardsPerSecond(), - serviceStakingTokenMechUsageContracts[ - stakingProgram - ].calculateStakingReward(serviceId), - serviceStakingTokenMechUsageContracts[stakingProgram].minStakingDeposit(), - serviceStakingTokenMechUsageContracts[stakingProgram].tsCheckpoint(), - ]; - - await gnosisMulticallProvider.init(); - - const multicallResponse = await gnosisMulticallProvider.all(contractCalls); - - const [ - mechRequestCount, - serviceInfo, - livenessPeriod, - livenessRatio, - rewardsPerSecond, - accruedStakingReward, - minStakingDeposit, - tsCheckpoint, - ] = multicallResponse; - - /** - * struct ServiceInfo { - // Service multisig address - address multisig; - // Service owner - address owner; - // Service multisig nonces - uint256[] nonces; <-- (we use this in the rewards eligibility check) - // Staking start time - uint256 tsStart; - // Accumulated service staking reward - uint256 reward; - // Accumulated inactivity that might lead to the service eviction - uint256 inactivity;} - */ - - const nowInSeconds = Math.floor(Date.now() / 1000); - - const requiredMechRequests = - (Math.ceil(Math.max(livenessPeriod, nowInSeconds - tsCheckpoint)) * - livenessRatio) / - 1e18 + - REQUIRED_MECH_REQUESTS_SAFETY_MARGIN; - - const mechRequestCountOnLastCheckpoint = serviceInfo[2][1]; - const eligibleRequests = mechRequestCount - mechRequestCountOnLastCheckpoint; - - const isEligibleForRewards = eligibleRequests >= requiredMechRequests; - - const availableRewardsForEpoch = Math.max( - rewardsPerSecond * livenessPeriod, // expected rewards for the epoch - rewardsPerSecond * (nowInSeconds - tsCheckpoint), // incase of late checkpoint - ); - - // Minimum staked amount is double the minimum staking deposit - // (all the bonds must be the same as deposit) - const minimumStakedAmount = - parseFloat(ethers.utils.formatEther(`${minStakingDeposit}`)) * 2; - - return { - mechRequestCount, - serviceInfo, - livenessPeriod, - livenessRatio, - rewardsPerSecond, - isEligibleForRewards, - availableRewardsForEpoch, - accruedServiceStakingRewards: parseFloat( - ethers.utils.formatEther(`${accruedStakingReward}`), - ), - minimumStakedAmount, - } as StakingRewardsInfo; -}; - -const getAvailableRewardsForEpoch = async ( - stakingProgram: StakingProgram, -): Promise => { - const contractCalls = [ - serviceStakingTokenMechUsageContracts[stakingProgram].rewardsPerSecond(), - serviceStakingTokenMechUsageContracts[stakingProgram].livenessPeriod(), // epoch length - serviceStakingTokenMechUsageContracts[stakingProgram].tsCheckpoint(), // last checkpoint timestamp - ]; - - await gnosisMulticallProvider.init(); - - const multicallResponse = await gnosisMulticallProvider.all(contractCalls); - - const [rewardsPerSecond, livenessPeriod, tsCheckpoint] = multicallResponse; - - const nowInSeconds = Math.floor(Date.now() / 1000); - - return Math.max( - rewardsPerSecond * livenessPeriod, // expected rewards - rewardsPerSecond * (nowInSeconds - tsCheckpoint), // incase of late checkpoint - ); -}; - -const getStakingContractInfoByServiceIdStakingProgram = async ( - serviceId: number, - stakingProgram: StakingProgram, -): Promise => { - if (!serviceId) return; - - const contractCalls = [ - serviceStakingTokenMechUsageContracts[stakingProgram].availableRewards(), - serviceStakingTokenMechUsageContracts[stakingProgram].maxNumServices(), - serviceStakingTokenMechUsageContracts[stakingProgram].getServiceIds(), - serviceStakingTokenMechUsageContracts[stakingProgram].minStakingDuration(), - serviceStakingTokenMechUsageContracts[stakingProgram].getServiceInfo( - serviceId, - ), - serviceStakingTokenMechUsageContracts[stakingProgram].getStakingState( - serviceId, - ), - serviceStakingTokenMechUsageContracts[stakingProgram].minStakingDeposit(), - ]; - - await gnosisMulticallProvider.init(); - - const multicallResponse = await gnosisMulticallProvider.all(contractCalls); - const [ - availableRewardsInBN, - maxNumServicesInBN, - getServiceIdsInBN, - minStakingDurationInBN, - serviceInfo, - serviceStakingState, - minStakingDeposit, - ] = multicallResponse; - - const availableRewards = parseFloat( - ethers.utils.formatUnits(availableRewardsInBN, 18), - ); - const serviceIds = getServiceIdsInBN.map((id: BigNumber) => id.toNumber()); - const maxNumServices = maxNumServicesInBN.toNumber(); - - return { - availableRewards, - maxNumServices, - serviceIds, - minimumStakingDuration: minStakingDurationInBN.toNumber(), - serviceStakingStartTime: serviceInfo.tsStart.toNumber(), - serviceStakingState, - minStakingDeposit: parseFloat(ethers.utils.formatEther(minStakingDeposit)), - }; -}; - -const getStakingContractInfoByStakingProgram = async ( - stakingProgram: StakingProgram, -) => { - const contractCalls = [ - serviceStakingTokenMechUsageContracts[stakingProgram].availableRewards(), - serviceStakingTokenMechUsageContracts[stakingProgram].maxNumServices(), - serviceStakingTokenMechUsageContracts[stakingProgram].getServiceIds(), - serviceStakingTokenMechUsageContracts[stakingProgram].minStakingDuration(), - serviceStakingTokenMechUsageContracts[stakingProgram].minStakingDeposit(), - ]; - - await gnosisMulticallProvider.init(); - - const multicallResponse = await gnosisMulticallProvider.all(contractCalls); - const [ - availableRewardsInBN, - maxNumServicesInBN, - getServiceIdsInBN, - minStakingDurationInBN, - minStakingDeposit, - ] = multicallResponse; - - const availableRewards = parseFloat( - ethers.utils.formatUnits(availableRewardsInBN, 18), - ); - const serviceIds = getServiceIdsInBN.map((id: BigNumber) => id.toNumber()); - const maxNumServices = maxNumServicesInBN.toNumber(); - - return { - availableRewards, - maxNumServices, - serviceIds, - minimumStakingDuration: minStakingDurationInBN.toNumber(), - minStakingDeposit: parseFloat(ethers.utils.formatEther(minStakingDeposit)), - }; -}; - -const getServiceRegistryInfo = async ( - operatorAddress: Address, // generally masterSafeAddress - serviceId: number, -): Promise<{ - bondValue: number; - depositValue: number; - serviceState: ServiceRegistryL2ServiceState; -}> => { - const contractCalls = [ - serviceRegistryTokenUtilityContract.getOperatorBalance( - operatorAddress, - serviceId, - ), - serviceRegistryTokenUtilityContract.mapServiceIdTokenDeposit(serviceId), - serviceRegistryL2Contract.mapServices(serviceId), - ]; - - await gnosisMulticallProvider.init(); - - const [ - operatorBalanceResponse, - serviceIdTokenDepositResponse, - mapServicesResponse, - ] = await gnosisMulticallProvider.all(contractCalls); - - const [bondValue, depositValue, serviceState] = [ - parseFloat(ethers.utils.formatUnits(operatorBalanceResponse, 18)), - parseFloat(ethers.utils.formatUnits(serviceIdTokenDepositResponse[1], 18)), - mapServicesResponse.state as ServiceRegistryL2ServiceState, - ]; - - return { - bondValue, - depositValue, - serviceState, - }; -}; - -const getCurrentStakingProgramByServiceId = async ( - serviceId: number, -): Promise => { - const contractCalls = [ - serviceStakingTokenMechUsageContracts[StakingProgram.Alpha].getStakingState( - serviceId, - ), - serviceStakingTokenMechUsageContracts[StakingProgram.Beta].getStakingState( - serviceId, - ), - ]; - - await gnosisMulticallProvider.init(); - - try { - const [isAlphaStaked, isBetaStaked] = - await gnosisMulticallProvider.all(contractCalls); - - // Alpha should take precedence, as it must be migrated from - return isAlphaStaked - ? StakingProgram.Alpha - : isBetaStaked - ? StakingProgram.Beta - : null; - } catch (error) { - console.error('Error while getting current staking program', error); - return null; - } -}; - -export const AutonolasService = { - getAgentStakingRewardsInfo, - getAvailableRewardsForEpoch, - getCurrentStakingProgramByServiceId, - getServiceRegistryInfo, - getStakingContractInfoByServiceIdStakingProgram, - getStakingContractInfoByStakingProgram, -}; diff --git a/frontend/service/Ethers.ts b/frontend/service/Ethers.ts deleted file mode 100644 index 20ad4cc70..000000000 --- a/frontend/service/Ethers.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { ContractInterface, ethers, providers, utils } from 'ethers'; - -import { gnosisProvider } from '@/constants/providers'; -import { Address } from '@/types/Address'; - -/** - * Returns native balance of the given address - * @param address - * @param rpc - * @returns Promise - */ -const getEthBalance = async ( - address: Address, - rpc: string, -): Promise => { - try { - const provider = new providers.StaticJsonRpcProvider(rpc, { - name: 'Gnosis', - chainId: 100, // we currently only support Gnosis Trader agent - }); - return provider.getBalance(address).then((balance) => { - const formattedBalance = utils.formatEther(balance); - return Number(formattedBalance); - }); - } catch (e) { - return Promise.reject('Failed to get ETH balance'); - } -}; - -/** - * Returns the ERC20 balance of the given address - * @param address Address - * @param rpc string - * @param contractAddress Address - * @returns Promise - */ -const getErc20Balance = async ( - address: Address, - rpc: string, - contractAddress?: Address, -): Promise => { - try { - if (!contractAddress) - throw new Error('Contract address is required for ERC20 balance'); - const provider = new providers.StaticJsonRpcProvider(rpc, { - name: 'Gnosis', - chainId: 100, // we currently only support Gnosis Trader agent - }); - const contract = new ethers.Contract( - contractAddress, - [ - 'function balanceOf(address) view returns (uint256)', - 'function decimals() view returns (uint8)', - ], - provider, - ); - const [balance, decimals] = await Promise.all([ - contract.balanceOf(address), - contract.decimals(), - ]); - if (!balance || !decimals) - throw new Error('Failed to resolve balance or decimals'); - return Number(utils.formatUnits(balance, decimals)); - } catch (e) { - return Promise.reject(e); - } -}; - -/** - * Checks if the given RPC is valid - * @param rpc string - * @returns Promise - */ -const checkRpc = async (rpc: string): Promise => { - try { - if (!rpc) throw new Error('RPC is required'); - - const provider = new providers.StaticJsonRpcProvider(rpc, { - name: 'Gnosis', - chainId: 100, // we currently only support Gnosis Trader agent - }); - - const networkId = (await provider.getNetwork()).chainId; - if (!networkId) throw new Error('Failed to get network ID'); - - return Promise.resolve(true); - } catch (e) { - return Promise.resolve(false); - } -}; - -const readContract = ({ - address, - abi, -}: { - address: string; - abi: ContractInterface; -}) => { - const contract = new ethers.Contract(address, abi, gnosisProvider); - return contract; -}; - -export const EthersService = { - getEthBalance, - getErc20Balance, - checkRpc, - readContract, -}; diff --git a/frontend/service/GnosisSafe.ts b/frontend/service/GnosisSafe.ts deleted file mode 100644 index 5c2879499..000000000 --- a/frontend/service/GnosisSafe.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ethers } from 'ethers'; - -import { GNOSIS_SAFE_ABI } from '@/abis/gnosisSafe'; -import { gnosisProvider } from '@/constants/providers'; -import { Address } from '@/types/Address'; - -const getOwners = async ({ - address, -}: { - address: Address; -}): Promise => { - const gnosisSafeContract = new ethers.Contract( - address, - GNOSIS_SAFE_ABI, - gnosisProvider, - ); - - return gnosisSafeContract.getOwners(); -}; - -export const GnosisSafeService = { - getOwners, -}; diff --git a/frontend/service/Multicall.ts b/frontend/service/Multicall.ts deleted file mode 100644 index 390274f14..000000000 --- a/frontend/service/Multicall.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { BigNumber, ethers } from 'ethers'; -import { Contract as MulticallContract, ContractCall } from 'ethers-multicall'; - -import { ERC20_BALANCEOF_FRAGMENT } from '@/abis/erc20'; -import { MULTICALL3_ABI } from '@/abis/multicall3'; -import { MULTICALL_CONTRACT_ADDRESS } from '@/constants/contractAddresses'; -import { gnosisMulticallProvider } from '@/constants/providers'; -import { Address } from '@/types/Address'; -import { AddressNumberRecord } from '@/types/Records'; - -const multicallContract = new MulticallContract( - MULTICALL_CONTRACT_ADDRESS, - MULTICALL3_ABI, -); - -/** - * Gets ETH balances for a list of addresses - * @param addresses - * @param rpc - * @returns Promise - */ -const getEthBalances = async ( - addresses: Address[], -): Promise => { - if (!addresses.length) return {}; - - const callData: ContractCall[] = addresses.map((address: Address) => - multicallContract.getEthBalance(address), - ); - - if (!callData.length) return {}; - - await gnosisMulticallProvider.init(); - const multicallResponse = await gnosisMulticallProvider.all(callData); - - return multicallResponse.reduce( - (acc: AddressNumberRecord, balance: BigNumber, index: number) => ({ - ...acc, - [addresses[index]]: parseFloat(ethers.utils.formatUnits(balance, 18)), - }), - {}, - ); -}; - -/** - * Gets ERC20 balances for a list of addresses - * @param addresses - * @param rpc - * @param contractAddress - * @returns Promise - */ -const getErc20Balances = async ( - addresses: Address[], - contractAddress: Address, -): Promise => { - if (!contractAddress) return {}; - if (!addresses.length) return {}; - - const callData: ContractCall[] = addresses.map((address: Address) => - new MulticallContract(contractAddress, ERC20_BALANCEOF_FRAGMENT).balanceOf( - address, - ), - ); - - await gnosisMulticallProvider.init(); - - const multicallResponse = await gnosisMulticallProvider.all(callData); - - return multicallResponse.reduce( - (acc: AddressNumberRecord, balance: BigNumber, index: number) => ({ - ...acc, - [addresses[index]]: parseFloat(ethers.utils.formatUnits(balance, 18)), - }), - {}, - ); -}; - -const MulticallService = { - getEthBalances, - getErc20Balances, -}; - -export default MulticallService; diff --git a/frontend/service/Services.ts b/frontend/service/Services.ts deleted file mode 100644 index 44730835c..000000000 --- a/frontend/service/Services.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { Deployment, Service, ServiceHash, ServiceTemplate } from '@/client'; -import { BACKEND_URL } from '@/constants/urls'; -import { StakingProgram } from '@/enums/StakingProgram'; - -/** - * Get a single service from the backend - * @param serviceHash - * @returns - */ -const getService = async (serviceHash: ServiceHash): Promise => - fetch(`${BACKEND_URL}/services/${serviceHash}`).then((response) => - response.json(), - ); - -/** - * Gets an array of services from the backend - * @returns An array of services - */ -const getServices = async (): Promise => - fetch(`${BACKEND_URL}/services`, { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, - }).then((response) => response.json()); - -/** - * Creates a service - * @param serviceTemplate - * @returns Promise - */ -const createService = async ({ - deploy, - serviceTemplate, - stakingProgram, -}: { - deploy: boolean; - serviceTemplate: ServiceTemplate; - stakingProgram: StakingProgram; -}): Promise => - new Promise((resolve, reject) => - fetch(`${BACKEND_URL}/services`, { - method: 'POST', - body: JSON.stringify({ - ...serviceTemplate, - deploy, - configurations: { - 100: { - ...serviceTemplate.configurations[100], - staking_program_id: stakingProgram, - rpc: `${process.env.GNOSIS_RPC}`, - }, - }, - }), - headers: { - 'Content-Type': 'application/json', - }, - }).then((response) => { - if (response.ok) { - resolve(response.json()); - } - reject('Failed to create service'); - }), - ); - -const deployOnChain = async (serviceHash: ServiceHash): Promise => - fetch(`${BACKEND_URL}/services/${serviceHash}/onchain/deploy`, { - method: 'POST', - }).then((response) => response.json()); - -const stopOnChain = async (serviceHash: ServiceHash): Promise => - fetch(`${BACKEND_URL}/services/${serviceHash}/onchain/stop`, { - method: 'POST', - }).then((response) => response.json()); - -const buildDeployment = async (serviceHash: ServiceHash): Promise => - fetch(`${BACKEND_URL}/services/${serviceHash}/deployment/build`, { - method: 'POST', - }).then((response) => response.json()); - -const startDeployment = async (serviceHash: ServiceHash): Promise => - fetch(`${BACKEND_URL}/services/${serviceHash}/deployment/start`, { - method: 'POST', - }).then((response) => response.json()); - -const stopDeployment = async (serviceHash: ServiceHash): Promise => - fetch(`${BACKEND_URL}/services/${serviceHash}/deployment/stop`, { - method: 'POST', - }).then((response) => response.json()); - -const deleteDeployment = async ( - serviceHash: ServiceHash, -): Promise => - fetch(`${BACKEND_URL}/services/${serviceHash}/deployment/delete`, { - method: 'POST', - }).then((response) => response.json()); - -const getDeployment = async (serviceHash: ServiceHash): Promise => - fetch(`${BACKEND_URL}/services/${serviceHash}/deployment`).then((response) => - response.json(), - ); - -export const ServicesService = { - getService, - getServices, - getDeployment, - createService, - deployOnChain, - stopOnChain, - buildDeployment, - startDeployment, - stopDeployment, - deleteDeployment, -}; diff --git a/frontend/service/Wallet.ts b/frontend/service/Wallet.ts deleted file mode 100644 index b09a8e95c..000000000 --- a/frontend/service/Wallet.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Chain } from '@/client'; -import { BACKEND_URL } from '@/constants/urls'; - -/** - * Returns a list of available wallets - */ -const getWallets = async () => - fetch(`${BACKEND_URL}/wallet`).then((res) => res.json()); - -const createEoa = async (chain: Chain) => - fetch(`${BACKEND_URL}/wallet`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ chain_type: chain }), - }).then((res) => res.json()); - -const createSafe = async (chain: Chain, owner?: string) => - fetch(`${BACKEND_URL}/wallet/safe`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ chain_type: chain, owner: owner }), - }).then((res) => res.json()); - -const addBackupOwner = async (chain: Chain, owner: string) => - fetch(`${BACKEND_URL}/wallet/safe`, { - method: 'PUT', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ chain_type: chain, owner: owner }), - }).then((res) => res.json()); - -export const WalletService = { - getWallets, - createEoa, - createSafe, - addBackupOwner, -}; diff --git a/frontend/styles/globals.scss b/frontend/styles/globals.scss deleted file mode 100644 index 034f055f6..000000000 --- a/frontend/styles/globals.scss +++ /dev/null @@ -1,207 +0,0 @@ -@import '@fontsource/inter'; -@import '@fontsource/inter/600.css'; -@import '@fontsource/inter/700.css'; -@import '@fontsource/inter/900.css'; - -html, body { - margin: 0; - padding: 0; - height: auto; -} - - /* Hide scrollbar for Chrome, Safari and Opera */ -*::-webkit-scrollbar { - display: none; -} - -body { - max-width: 460px; - border-radius: 8px; - user-select: none; -} - -button, input, select, textarea, .ant-input-suffix { - -webkit-app-region: no-drag; -} - -// antd overrides -.ant-card { - -webkit-app-region: no-drag; -} - -.ant-alert { - .anticon { - margin-top: 3px; - } -} - -.antd-card { - background-color: white; - overflow-y: scroll; -} - -.balance { - font-family: 'Inter'; - font-weight: 900; - font-size: 56px; - line-height: 48px; -} - -.balance-symbol { - @extend .balance; - font-size: 32px; - line-height: 32px; -} - -.balance-currency { - @extend .balance; - font-weight: 600; - font-size: 24px; - line-height: 24px; -} - -.custom-alert { - align-items: flex-start; - - &--primary { - border-color: #ECD7FE; - background-color: #F8F0FF; - color: #7E22CE; - - .ant-alert-icon { - color: #7E22CE; - } - } - - &--info { - color: #002C8C; - } - - &--warning { - color: #873800; - } - - &--error { - color: #A8071A; - } - - .ant-typography { - color: inherit; - } - - &--full-width { - flex: auto; - margin: 0; - border-radius: 0; - border-left: 0; - border-right: 0; - padding: 12px 24px; - margin: -24px; - } -} - -.can-select-text { - user-select: text !important; -} - -.justify-start { - justify-content: flex-start; -} - -.m-0 { - margin: 0 !important; -} - -.mb-4 { - margin-bottom: 4px !important; -} - -.mb-8 { - margin-bottom: 8px !important; -} - -.mb-16 { - margin-bottom: 16px !important; -} - -.ml-auto { - margin-left: auto !important; -} - -.mb-auto { - margin-bottom: auto !important; -} - -.mt-8 { - margin-top: 8px !important; -} - -.mt-12 { - margin-top: 12px !important; -} - -.p-0 { - padding: 0 !important; -} - -.mx-auto { - margin-left: auto !important; - margin-right: auto !important; -} - -.text-xl { - font-size: 20px; -} - -.text-base { - font-size: 16px !important; -} - -.text-sm { - font-size: 14px !important; -} - -.text-center { - text-align: center !important; -} - -.font-weight-600 { - font-weight: 600 !important; -} - -.break-word { - white-space: normal !important; - word-wrap: break-word !important; -} - -ul.alert-list { - margin: 0 0.5em; - padding-left: 1.25em; -} - -.w-3\/4 { - width: 75% !important; -} - -.loading-ellipses:after { - overflow: hidden; - display: inline-block; - vertical-align: bottom; - -webkit-animation: ellipsis steps(4, end) 900ms infinite; - animation: ellipsis steps(4, end) 900ms infinite; - content: "\2026"; - /* ascii code for the ellipsis character */ - width: 0px; -} - -@keyframes ellipsis { - to { - width: 40px; - } -} - -@-webkit-keyframes ellipsis { - to { - width: 40px; - } -} \ No newline at end of file diff --git a/frontend/theme/index.ts b/frontend/theme/index.ts deleted file mode 100644 index e42767da3..000000000 --- a/frontend/theme/index.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { ThemeConfig } from 'antd'; - -export const mainTheme: ThemeConfig = { - token: { - colorLink: '#7E22CE', - colorPrimary: '#7E22CE', - colorWarning: '#FF9C27', - colorInfoText: '#36075F', - colorText: '#0F172A', - colorTextSecondary: '#4D596A', - colorFillSecondary: '#E4E4E4', - fontSize: 16, - fontFamily: 'Inter', - colorBgContainer: '#FFFFFF', - }, - components: { - Alert: { - fontSize: 16, - }, - Button: { - fontSize: 16, - fontSizeLG: 16, - }, - Card: { - colorBgContainer: '#FFFFFF', - padding: 20, - fontWeightStrong: 400, - }, - Input: { - fontSize: 20, - colorTextDisabled: '#334155', - }, - Tooltip: { - fontSize: 16, - colorText: 'black', - colorTextLightSolid: 'black', - colorBgSpotlight: 'white', - }, - Typography: { - colorTextDescription: '#4D596A', - }, - }, -}; diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json deleted file mode 100644 index ca51cb094..000000000 --- a/frontend/tsconfig.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2015", - "allowJs": true, - "esModuleInterop": true, - "incremental": true, - "isolatedModules": true, - "jsx": "preserve", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], - "module": "esnext", - "moduleResolution": "bundler", - "noEmit": true, - "paths": { - "@/*": [ - "./*" - ] - }, - "resolveJsonModule": true, - "skipLibCheck": true, - "strict": true, - "types": [ - "@testing-library/jest-dom" - ] - }, - "exclude": [ - "node_modules" - ], - "include": [ - "**/*.ts", - "**/*.tsx", - "next-env.d.ts", - "**/*.d.ts" - ] -} \ No newline at end of file diff --git a/frontend/types/Address.ts b/frontend/types/Address.ts deleted file mode 100644 index f64ddbb97..000000000 --- a/frontend/types/Address.ts +++ /dev/null @@ -1 +0,0 @@ -export type Address = `0x${string}`; diff --git a/frontend/types/Autonolas.ts b/frontend/types/Autonolas.ts deleted file mode 100644 index 3cd552d1c..000000000 --- a/frontend/types/Autonolas.ts +++ /dev/null @@ -1,25 +0,0 @@ -export type StakingRewardsInfo = { - mechRequestCount: number; - serviceInfo: unknown[]; - livenessPeriod: number; - livenessRatio: number; - rewardsPerSecond: number; - isEligibleForRewards: boolean; - availableRewardsForEpoch: number; - accruedServiceStakingRewards: number; - minimumStakedAmount: number; -}; - -export type StakingContractInfo = { - availableRewards: number; - maxNumServices: number; - serviceIds: number[]; - /** minimum staking duration (in seconds) */ - minimumStakingDuration: number; - /** time when service was staked (in seconds) */ - serviceStakingStartTime: number; - /** 0: not staked, 1: staked, 2: unstaked - current state of the service */ - serviceStakingState: number; - /** OLAS cost of staking */ - minStakingDeposit: number; -}; diff --git a/frontend/types/ElectronApi.ts b/frontend/types/ElectronApi.ts deleted file mode 100644 index 61d551e8b..000000000 --- a/frontend/types/ElectronApi.ts +++ /dev/null @@ -1,13 +0,0 @@ -export type ElectronStore = { - environmentName?: string; - isInitialFunded?: boolean; - firstStakingRewardAchieved?: boolean; - firstRewardNotificationShown?: boolean; - agentEvictionAlertShown?: boolean; -}; - -export type ElectronTrayIconStatus = - | 'low-gas' - | 'running' - | 'paused' - | 'logged-out'; diff --git a/frontend/types/Records.ts b/frontend/types/Records.ts deleted file mode 100644 index 20a8611a9..000000000 --- a/frontend/types/Records.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Token } from '@/enums/Token'; - -import { Address } from './Address'; - -export type AddressNumberRecord = Record; -export type AddressBooleanRecord = Record; - -// defines token balances in a wallet by token name -export type WalletAddressNumberRecord = Record< - Address, - Record ->; diff --git a/frontend/types/StakingProgram.ts b/frontend/types/StakingProgram.ts deleted file mode 100644 index 77d551d18..000000000 --- a/frontend/types/StakingProgram.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { StakingProgramStatus } from '@/enums/StakingProgramStatus'; - -import { Address } from './Address'; - -export type StakingProgram = { - name: string; - rewardsPerWorkPeriod: number; - requiredOlasForStaking: number; - isEnoughSlots?: boolean; - status: StakingProgramStatus; - contractAddress: Address; -}; diff --git a/frontend/utils/copyToClipboard.ts b/frontend/utils/copyToClipboard.ts deleted file mode 100644 index 12b85dddb..000000000 --- a/frontend/utils/copyToClipboard.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const copyToClipboard = async (text: string): Promise => - navigator.clipboard.writeText(text); diff --git a/frontend/utils/isDev.ts b/frontend/utils/isDev.ts deleted file mode 100644 index 0bd4ecf30..000000000 --- a/frontend/utils/isDev.ts +++ /dev/null @@ -1 +0,0 @@ -export const isDev = process.env.NODE_ENV === 'development'; diff --git a/frontend/utils/numberFormatters.ts b/frontend/utils/numberFormatters.ts deleted file mode 100644 index 7613469fa..000000000 --- a/frontend/utils/numberFormatters.ts +++ /dev/null @@ -1,11 +0,0 @@ -export const balanceFormat = ( - balance: number | undefined, - decimals: 2, -): string => { - if (balance === undefined) return '--'; - return Intl.NumberFormat('en-US', { - notation: 'compact', - maximumFractionDigits: decimals, - minimumFractionDigits: decimals, - }).format(balance); -}; diff --git a/frontend/utils/service.ts b/frontend/utils/service.ts deleted file mode 100644 index 5a957ce93..000000000 --- a/frontend/utils/service.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ServiceTemplate } from '@/client'; -import { StakingProgram } from '@/enums/StakingProgram'; - -/** TODO: update from hardcoded, workaround for quick release */ -export const getMinimumStakedAmountRequired = ( - serviceTemplate: ServiceTemplate, - stakingProgram: StakingProgram = StakingProgram.Beta, -) => { - // const olasCostOfBond = Number( - // formatUnits( - // `${serviceTemplate.configurations[CHAINS.GNOSIS.chainId].cost_of_bond}`, - // 18, - // ), - // ); - - if (stakingProgram === StakingProgram.Alpha) { - return 20; - } - - return 40; -}; diff --git a/frontend/utils/truncate.ts b/frontend/utils/truncate.ts deleted file mode 100644 index ff8781d30..000000000 --- a/frontend/utils/truncate.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { Address } from '@/types/Address'; - -export const truncateAddress = (address: Address) => - `${address?.substring(0, 6)}...${address?.substring(address.length - 4, address.length)}`; diff --git a/frontend/yarn.lock b/frontend/yarn.lock deleted file mode 100644 index dee5388e7..000000000 --- a/frontend/yarn.lock +++ /dev/null @@ -1,6263 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@adobe/css-tools@^4.3.2": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.3.tgz#90749bde8b89cd41764224f5aac29cd4138f75ff" - integrity sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ== - -"@ampproject/remapping@^2.2.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@ant-design/colors@^7.0.0", "@ant-design/colors@^7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-7.0.2.tgz#c5c753a467ce8d86ba7ca4736d2c01f599bb5492" - integrity sha512-7KJkhTiPiLHSu+LmMJnehfJ6242OCxSlR3xHVBecYxnMW8MS/878NXct1GqYARyL59fyeFdKRxXTfvR9SnDgJg== - dependencies: - "@ctrl/tinycolor" "^3.6.1" - -"@ant-design/cssinjs@^1.18.4", "@ant-design/cssinjs@^1.19.1": - version "1.20.0" - resolved "https://registry.yarnpkg.com/@ant-design/cssinjs/-/cssinjs-1.20.0.tgz#878bc6c5b08f73db76da54c347a7ebb3fa4858bb" - integrity sha512-uG3iWzJxgNkADdZmc6W0Ci3iQAUOvLMcM8SnnmWq3r6JeocACft4ChnY/YWvI2Y+rG/68QBla/O+udke1yH3vg== - dependencies: - "@babel/runtime" "^7.11.1" - "@emotion/hash" "^0.8.0" - "@emotion/unitless" "^0.7.5" - classnames "^2.3.1" - csstype "^3.1.3" - rc-util "^5.35.0" - stylis "^4.0.13" - -"@ant-design/icons-svg@^4.4.0": - version "4.4.2" - resolved "https://registry.yarnpkg.com/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz#ed2be7fb4d82ac7e1d45a54a5b06d6cecf8be6f6" - integrity sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA== - -"@ant-design/icons@^5.3.0", "@ant-design/icons@^5.3.7": - version "5.3.7" - resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-5.3.7.tgz#d9f3654bf7934ee5faba43f91b5a187f5309ec68" - integrity sha512-bCPXTAg66f5bdccM4TT21SQBDO1Ek2gho9h3nO9DAKXJP4sq+5VBjrQMSxMVXSB3HyEz+cUbHQ5+6ogxCOpaew== - dependencies: - "@ant-design/colors" "^7.0.0" - "@ant-design/icons-svg" "^4.4.0" - "@babel/runtime" "^7.11.2" - classnames "^2.2.6" - rc-util "^5.31.1" - -"@ant-design/react-slick@~1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-1.1.2.tgz#f84ce3e4d0dc941f02b16f1d1d6d7a371ffbb4f1" - integrity sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA== - dependencies: - "@babel/runtime" "^7.10.4" - classnames "^2.2.5" - json2mq "^0.2.0" - resize-observer-polyfill "^1.5.1" - throttle-debounce "^5.0.0" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" - integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== - dependencies: - "@babel/highlight" "^7.24.2" - picocolors "^1.0.0" - -"@babel/compat-data@^7.23.5": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" - integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" - integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.24.5" - "@babel/helpers" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.24.5", "@babel/generator@^7.7.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" - integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== - dependencies: - "@babel/types" "^7.24.5" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" - integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== - dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-validator-option" "^7.23.5" - browserslist "^4.22.2" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.24.3": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" - integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== - dependencies: - "@babel/types" "^7.24.0" - -"@babel/helper-module-transforms@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" - integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.24.3" - "@babel/helper-simple-access" "^7.24.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/helper-validator-identifier" "^7.24.5" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" - integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== - -"@babel/helper-simple-access@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" - integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== - dependencies: - "@babel/types" "^7.24.5" - -"@babel/helper-split-export-declaration@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" - integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== - dependencies: - "@babel/types" "^7.24.5" - -"@babel/helper-string-parser@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" - integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== - -"@babel/helper-validator-identifier@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" - integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== - -"@babel/helper-validator-option@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" - integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== - -"@babel/helpers@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" - integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== - dependencies: - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" - -"@babel/highlight@^7.24.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" - integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.5" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" - integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.7.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" - integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" - integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/runtime@^7.10.1", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.0", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.6", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.4", "@babel/runtime@^7.24.5", "@babel/runtime@^7.9.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" - integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" - integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.24.0" - "@babel/types" "^7.24.0" - -"@babel/traverse@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" - integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== - dependencies: - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/types" "^7.24.5" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" - integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== - dependencies: - "@babel/helper-string-parser" "^7.24.1" - "@babel/helper-validator-identifier" "^7.24.5" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@ctrl/tinycolor@^3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz#b6c75a56a1947cc916ea058772d666a2c8932f31" - integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA== - -"@emotion/hash@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" - integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== - -"@emotion/is-prop-valid@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz#d4175076679c6a26faa92b03bb786f9e52612337" - integrity sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw== - dependencies: - "@emotion/memoize" "^0.8.1" - -"@emotion/memoize@^0.8.1": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" - integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== - -"@emotion/unitless@0.8.1": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" - integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== - -"@emotion/unitless@^0.7.5": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== - -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" - integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" - integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - -"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" - integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - -"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" - integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - -"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" - integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - -"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" - integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" - integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - bn.js "^5.2.1" - -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" - integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" - integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - -"@ethersproject/contracts@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" - integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== - dependencies: - "@ethersproject/abi" "^5.7.0" - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - -"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" - integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" - integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wordlists" "^5.7.0" - -"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" - integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hdnode" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" - integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - js-sha3 "0.8.0" - -"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" - integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== - -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" - integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" - integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - -"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" - integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/providers@5.7.2": - version "5.7.2" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" - integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" - integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" - integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" - integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - hash.js "1.1.7" - -"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" - integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - bn.js "^5.2.1" - elliptic "6.5.4" - hash.js "1.1.7" - -"@ethersproject/solidity@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" - integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" - integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" - integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - -"@ethersproject/units@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" - integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/wallet@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" - integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/hdnode" "^5.7.0" - "@ethersproject/json-wallets" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wordlists" "^5.7.0" - -"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" - integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== - dependencies: - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" - integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@fontsource/inter@^5.0.17": - version "5.0.18" - resolved "https://registry.yarnpkg.com/@fontsource/inter/-/inter-5.0.18.tgz#eaddac790ee74b70932030f37ebaa9fc76decbd8" - integrity sha512-YCsoYPTcs713sI7tLtxaPrIhXAXvEetGg5Ry02ivA8qUOb3fQHojbK/X9HLD5OOKvFUNR2Ynkwb1kR1hVKQHpw== - -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== - dependencies: - "@humanwhocodes/object-schema" "^2.0.2" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" - integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - -"@jest/core@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" - integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== - dependencies: - "@jest/console" "^29.7.0" - "@jest/reporters" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.7.0" - jest-config "^29.7.0" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-resolve-dependencies "^29.7.0" - jest-runner "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - jest-watcher "^29.7.0" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" - integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== - dependencies: - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - -"@jest/expect-utils@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" - integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== - dependencies: - jest-get-type "^29.6.3" - -"@jest/expect@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" - integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== - dependencies: - expect "^29.7.0" - jest-snapshot "^29.7.0" - -"@jest/fake-timers@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" - integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== - dependencies: - "@jest/types" "^29.6.3" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -"@jest/globals@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" - integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/types" "^29.6.3" - jest-mock "^29.7.0" - -"@jest/reporters@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" - integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^6.0.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - jest-worker "^29.7.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jest/source-map@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" - integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.18" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" - integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== - dependencies: - "@jest/console" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" - integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== - dependencies: - "@jest/test-result" "^29.7.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - slash "^3.0.0" - -"@jest/transform@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" - integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== - dependencies: - "@jest/schemas" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@next/env@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.3.tgz#d6def29d1c763c0afb397343a15a82e7d92353a0" - integrity sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA== - -"@next/eslint-plugin-next@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.0.tgz#29b041233fac7417e22eefa4146432d5cd910820" - integrity sha512-x4FavbNEeXx/baD/zC/SdrvkjSby8nBn8KcCREqk6UuwvwoAPZmaV8TFCAuo/cpovBRTIY67mHhe86MQQm/68Q== - dependencies: - glob "10.3.10" - -"@next/swc-darwin-arm64@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz#db1a05eb88c0224089b815ad10ac128ec79c2cdb" - integrity sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A== - -"@next/swc-darwin-x64@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz#a3f8af05b5f9a52ac3082e66ac29e125ab1d7b9c" - integrity sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA== - -"@next/swc-linux-arm64-gnu@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz#4e63f43879285b52554bfd39e6e0cc78a9b27bbf" - integrity sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA== - -"@next/swc-linux-arm64-musl@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz#ebdaed26214448b1e6f2c3e8b3cd29bfba387990" - integrity sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw== - -"@next/swc-linux-x64-gnu@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz#19e3bcc137c3b582a1ab867106817e5c90a20593" - integrity sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w== - -"@next/swc-linux-x64-musl@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz#794a539b98e064169cf0ff7741b2a4fb16adec7d" - integrity sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ== - -"@next/swc-win32-arm64-msvc@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz#eda9fa0fbf1ff9113e87ac2668ee67ce9e5add5a" - integrity sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A== - -"@next/swc-win32-ia32-msvc@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz#7c1190e3f640ab16580c6bdbd7d0e766b9920457" - integrity sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw== - -"@next/swc-win32-x64-msvc@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz#2be4e39ee25bfbd85be78eea17c0e7751dc4323c" - integrity sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@pkgr/core@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" - integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== - -"@rc-component/async-validator@^5.0.3": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@rc-component/async-validator/-/async-validator-5.0.4.tgz#5291ad92f00a14b6766fc81735c234277f83e948" - integrity sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg== - dependencies: - "@babel/runtime" "^7.24.4" - -"@rc-component/color-picker@~1.5.3": - version "1.5.3" - resolved "https://registry.yarnpkg.com/@rc-component/color-picker/-/color-picker-1.5.3.tgz#f3b0e14bb67ec5ee77d1fd5d261f63dd4fd00449" - integrity sha512-+tGGH3nLmYXTalVe0L8hSZNs73VTP5ueSHwUlDC77KKRaN7G4DS4wcpG5DTDzdcV/Yas+rzA6UGgIyzd8fS4cw== - dependencies: - "@babel/runtime" "^7.23.6" - "@ctrl/tinycolor" "^3.6.1" - classnames "^2.2.6" - rc-util "^5.38.1" - -"@rc-component/context@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@rc-component/context/-/context-1.4.0.tgz#dc6fb021d6773546af8f016ae4ce9aea088395e8" - integrity sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w== - dependencies: - "@babel/runtime" "^7.10.1" - rc-util "^5.27.0" - -"@rc-component/mini-decimal@^1.0.1": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz#7b7a362b14a0a54cb5bc6fd2b82731f29f11d9b0" - integrity sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ== - dependencies: - "@babel/runtime" "^7.18.0" - -"@rc-component/mutate-observer@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz#ee53cc88b78aade3cd0653609215a44779386fd8" - integrity sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw== - dependencies: - "@babel/runtime" "^7.18.0" - classnames "^2.3.2" - rc-util "^5.24.4" - -"@rc-component/portal@^1.0.0-8", "@rc-component/portal@^1.0.0-9", "@rc-component/portal@^1.0.2", "@rc-component/portal@^1.1.0", "@rc-component/portal@^1.1.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@rc-component/portal/-/portal-1.1.2.tgz#55db1e51d784e034442e9700536faaa6ab63fc71" - integrity sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg== - dependencies: - "@babel/runtime" "^7.18.0" - classnames "^2.3.2" - rc-util "^5.24.4" - -"@rc-component/tour@~1.15.0": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@rc-component/tour/-/tour-1.15.0.tgz#37a66ae5af8eefaf0ab0e22ddd8e6fecdbdc14a7" - integrity sha512-h6hyILDwL+In9GAgRobwRWihLqqsD7Uft3fZGrJ7L4EiyCoxbnNYwzPXDfz7vNDhWeVyvAWQJj9fJCzpI4+b4g== - dependencies: - "@babel/runtime" "^7.18.0" - "@rc-component/portal" "^1.0.0-9" - "@rc-component/trigger" "^2.0.0" - classnames "^2.3.2" - rc-util "^5.24.4" - -"@rc-component/trigger@^2.0.0", "@rc-component/trigger@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@rc-component/trigger/-/trigger-2.1.1.tgz#47973f1156ba63810c913eb46cbaedeba913874b" - integrity sha512-UjHkedkgtEcgQu87w1VuWug1idoDJV7VUt0swxHXRcmei2uu1AuUzGBPEUlmOmXGJ+YtTgZfVLi7kuAUKoZTMA== - dependencies: - "@babel/runtime" "^7.23.2" - "@rc-component/portal" "^1.1.0" - classnames "^2.3.2" - rc-motion "^2.0.0" - rc-resize-observer "^1.3.1" - rc-util "^5.38.0" - -"@rushstack/eslint-patch@^1.3.3": - version "1.10.3" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz#391d528054f758f81e53210f1a1eebcf1a8b1d20" - integrity sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg== - -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - -"@sinonjs/commons@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" - integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@swc/counter@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" - integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== - -"@swc/helpers@0.5.5": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.5.tgz#12689df71bfc9b21c4f4ca00ae55f2f16c8b77c0" - integrity sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A== - dependencies: - "@swc/counter" "^0.1.3" - tslib "^2.4.0" - -"@testing-library/dom@^9.0.0": - version "9.3.4" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.3.4.tgz#50696ec28376926fec0a1bf87d9dbac5e27f60ce" - integrity sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/runtime" "^7.12.5" - "@types/aria-query" "^5.0.1" - aria-query "5.1.3" - chalk "^4.1.0" - dom-accessibility-api "^0.5.9" - lz-string "^1.5.0" - pretty-format "^27.0.2" - -"@testing-library/jest-dom@^6.4.2": - version "6.4.5" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.4.5.tgz#badb40296477149136dabef32b572ddd3b56adf1" - integrity sha512-AguB9yvTXmCnySBP1lWjfNNUwpbElsaQ567lt2VdGqAdHtpieLgjmcVyv1q7PMIvLbgpDdkWV5Ydv3FEejyp2A== - dependencies: - "@adobe/css-tools" "^4.3.2" - "@babel/runtime" "^7.9.2" - aria-query "^5.0.0" - chalk "^3.0.0" - css.escape "^1.5.1" - dom-accessibility-api "^0.6.3" - lodash "^4.17.21" - redent "^3.0.0" - -"@testing-library/react@^14.2.1": - version "14.3.1" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.3.1.tgz#29513fc3770d6fb75245c4e1245c470e4ffdd830" - integrity sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ== - dependencies: - "@babel/runtime" "^7.12.5" - "@testing-library/dom" "^9.0.0" - "@types/react-dom" "^18.0.0" - -"@tootallnate/once@2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== - -"@tsconfig/node10@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" - integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/aria-query@^5.0.1": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" - integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== - -"@types/babel__core@^7.1.14": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.8" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" - integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" - integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== - dependencies: - "@babel/types" "^7.20.7" - -"@types/canvas-confetti@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@types/canvas-confetti/-/canvas-confetti-1.4.0.tgz#22127a1a9ed9d456e626d6e2b9a4d3b0a240e18b" - integrity sha512-Neq4mvVecrHmTdyo98EY5bnKCjkZGQ6Ma7VyOrxIcMHEZPmt4kfquccqfBMrpNrdryMHgk3oGQi7XtpZacltnw== - -"@types/graceful-fs@^4.1.3": - version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" - integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" - integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== - -"@types/istanbul-lib-report@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" - integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" - integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^29.5.12": - version "29.5.12" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" - integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - -"@types/jsdom@^20.0.0": - version "20.0.1" - resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" - integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== - dependencies: - "@types/node" "*" - "@types/tough-cookie" "*" - parse5 "^7.0.0" - -"@types/json-schema@^7.0.9": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/lodash@^4.14.202": - version "4.17.4" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.4.tgz#0303b64958ee070059e3a7184048a55159fe20b7" - integrity sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ== - -"@types/node@*": - version "20.12.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.12.tgz#7cbecdf902085cec634fdb362172dfe12b8f2050" - integrity sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw== - dependencies: - undici-types "~5.26.4" - -"@types/node@20.14.10": - version "20.14.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.10.tgz#a1a218290f1b6428682e3af044785e5874db469a" - integrity sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ== - dependencies: - undici-types "~5.26.4" - -"@types/prop-types@*": - version "15.7.12" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" - integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== - -"@types/react-dom@^18", "@types/react-dom@^18.0.0": - version "18.3.0" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" - integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@18.3.3": - version "18.3.3" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f" - integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== - dependencies: - "@types/prop-types" "*" - csstype "^3.0.2" - -"@types/semver@^7.3.12": - version "7.5.8" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" - integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== - -"@types/stack-utils@^2.0.0": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" - integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== - -"@types/stylis@4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@types/stylis/-/stylis-4.2.5.tgz#1daa6456f40959d06157698a653a9ab0a70281df" - integrity sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw== - -"@types/tough-cookie@*": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" - integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== - -"@types/yargs-parser@*": - version "21.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" - integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== - -"@types/yargs@^17.0.8": - version "17.0.32" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" - integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@^7.0.1": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.10.0.tgz#07854a236f107bb45cbf4f62b89474cbea617f50" - integrity sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.10.0" - "@typescript-eslint/type-utils" "7.10.0" - "@typescript-eslint/utils" "7.10.0" - "@typescript-eslint/visitor-keys" "7.10.0" - graphemer "^1.4.0" - ignore "^5.3.1" - natural-compare "^1.4.0" - ts-api-utils "^1.3.0" - -"@typescript-eslint/parser@^5.4.2 || ^6.0.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" - integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== - dependencies: - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/typescript-estree" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - debug "^4.3.4" - -"@typescript-eslint/parser@^7.0.1": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.10.0.tgz#e6ac1cba7bc0400a4459e7eb5b23115bd71accfb" - integrity sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w== - dependencies: - "@typescript-eslint/scope-manager" "7.10.0" - "@typescript-eslint/types" "7.10.0" - "@typescript-eslint/typescript-estree" "7.10.0" - "@typescript-eslint/visitor-keys" "7.10.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" - integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - -"@typescript-eslint/scope-manager@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" - integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== - dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - -"@typescript-eslint/scope-manager@7.10.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz#054a27b1090199337a39cf755f83d9f2ce26546b" - integrity sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg== - dependencies: - "@typescript-eslint/types" "7.10.0" - "@typescript-eslint/visitor-keys" "7.10.0" - -"@typescript-eslint/type-utils@7.10.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.10.0.tgz#8a75accce851d0a331aa9331268ef64e9b300270" - integrity sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g== - dependencies: - "@typescript-eslint/typescript-estree" "7.10.0" - "@typescript-eslint/utils" "7.10.0" - debug "^4.3.4" - ts-api-utils "^1.3.0" - -"@typescript-eslint/types@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" - integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== - -"@typescript-eslint/types@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" - integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== - -"@typescript-eslint/types@7.10.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.10.0.tgz#da92309c97932a3a033762fd5faa8b067de84e3b" - integrity sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg== - -"@typescript-eslint/typescript-estree@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" - integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/typescript-estree@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" - integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== - dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "9.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/typescript-estree@7.10.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz#6dcdc5de3149916a6a599fa89dde5c471b88b8bb" - integrity sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g== - dependencies: - "@typescript-eslint/types" "7.10.0" - "@typescript-eslint/visitor-keys" "7.10.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^1.3.0" - -"@typescript-eslint/utils@7.10.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.10.0.tgz#8ee43e5608c9f439524eaaea8de5b358b15c51b3" - integrity sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "7.10.0" - "@typescript-eslint/types" "7.10.0" - "@typescript-eslint/typescript-estree" "7.10.0" - -"@typescript-eslint/utils@^5.10.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" - integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - eslint-scope "^5.1.1" - semver "^7.3.7" - -"@typescript-eslint/visitor-keys@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" - integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== - dependencies: - "@typescript-eslint/types" "5.62.0" - eslint-visitor-keys "^3.3.0" - -"@typescript-eslint/visitor-keys@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" - integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== - dependencies: - "@typescript-eslint/types" "6.21.0" - eslint-visitor-keys "^3.4.1" - -"@typescript-eslint/visitor-keys@7.10.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz#2af2e91e73a75dd6b70b4486c48ae9d38a485a78" - integrity sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg== - dependencies: - "@typescript-eslint/types" "7.10.0" - eslint-visitor-keys "^3.4.3" - -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -abab@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -acorn-globals@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" - integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== - dependencies: - acorn "^8.1.0" - acorn-walk "^8.0.2" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.0.2, acorn-walk@^8.1.1: - version "8.3.2" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" - integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== - -acorn@^8.1.0, acorn@^8.4.1, acorn@^8.8.1, acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== - -aes-js@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" - integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -antd@^5.14.0: - version "5.17.3" - resolved "https://registry.yarnpkg.com/antd/-/antd-5.17.3.tgz#c969755335cdef6fa671152602b7100557bff80c" - integrity sha512-U99hyy7t8dOQtNHzHifmwAXJLgmPMadavFBsd2mnfICD6m8l7u/NvCefRhd2jOf/SBNE2579YhwCEwTUiX2GnQ== - dependencies: - "@ant-design/colors" "^7.0.2" - "@ant-design/cssinjs" "^1.19.1" - "@ant-design/icons" "^5.3.7" - "@ant-design/react-slick" "~1.1.2" - "@babel/runtime" "^7.24.5" - "@ctrl/tinycolor" "^3.6.1" - "@rc-component/color-picker" "~1.5.3" - "@rc-component/mutate-observer" "^1.1.0" - "@rc-component/tour" "~1.15.0" - "@rc-component/trigger" "^2.1.1" - classnames "^2.5.1" - copy-to-clipboard "^3.3.3" - dayjs "^1.11.10" - qrcode.react "^3.1.0" - rc-cascader "~3.26.0" - rc-checkbox "~3.3.0" - rc-collapse "~3.7.3" - rc-dialog "~9.4.0" - rc-drawer "~7.1.0" - rc-dropdown "~4.2.0" - rc-field-form "~2.0.1" - rc-image "~7.6.0" - rc-input "~1.5.0" - rc-input-number "~9.1.0" - rc-mentions "~2.13.1" - rc-menu "~9.14.0" - rc-motion "^2.9.1" - rc-notification "~5.4.0" - rc-pagination "~4.0.4" - rc-picker "~4.5.0" - rc-progress "~4.0.0" - rc-rate "~2.12.0" - rc-resize-observer "^1.4.0" - rc-segmented "~2.3.0" - rc-select "~14.14.0" - rc-slider "~10.6.2" - rc-steps "~6.0.1" - rc-switch "~4.1.0" - rc-table "~7.45.6" - rc-tabs "~15.1.0" - rc-textarea "~1.7.0" - rc-tooltip "~6.2.0" - rc-tree "~5.8.7" - rc-tree-select "~5.21.0" - rc-upload "~4.5.2" - rc-util "^5.40.1" - scroll-into-view-if-needed "^3.1.0" - throttle-debounce "^5.0.0" - -anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-query@5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" - integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== - dependencies: - deep-equal "^2.0.5" - -aria-query@^5.0.0, aria-query@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== - dependencies: - dequal "^2.0.3" - -array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" - -array-includes@^3.1.6, array-includes@^3.1.7: - version "3.1.8" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" - integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - is-string "^1.0.7" - -array-tree-filter@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" - integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.findlast@^1.2.4: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" - integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.findlastindex@^1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" - integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.toreversed@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" - integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.tosorted@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" - integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.1.0" - es-shim-unscopables "^1.0.2" - -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" - is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" - -ast-types-flow@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" - integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axe-core@=4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" - integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== - -axobject-query@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" - integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== - dependencies: - dequal "^2.0.3" - -babel-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" - integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== - dependencies: - "@jest/transform" "^29.7.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.6.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" - integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" - integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== - dependencies: - babel-plugin-jest-hoist "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -bech32@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" - integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3, braces@~3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browserslist@^4.22.2: - version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== - dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -busboy@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -camelize@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" - integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== - -caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001587: - version "1.0.30001621" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001621.tgz#4adcb443c8b9c8303e04498318f987616b8fea2e" - integrity sha512-+NLXZiviFFKX0fk8Piwv3PfLPGtRqJeq2TiNoUff/qB5KJgwecJTvCXDpmlyP/eCI/GUEmp/h/y5j0yckiiZrA== - -canvas-confetti@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/canvas-confetti/-/canvas-confetti-1.4.0.tgz#840f6db4a566f8f32abe28c00dcd82acf39c92bd" - integrity sha512-S18o4Y9PqI/uabdlT/jI3MY7XBJjNxnfapFIkjkMwpz6qNxLFZOm2b22OMf4ZYDL9lpNWI+Ih4fEMVPwO1KHFQ== - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -"chokidar@>=3.0.0 <4.0.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -ci-info@^3.2.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -cjs-module-lexer@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" - integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== - -classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2, classnames@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" - integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== - -client-only@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" - integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" - integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -compute-scroll-into-view@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz#753f11d972596558d8fe7c6bcbc8497690ab4c87" - integrity sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -copy-to-clipboard@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" - integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== - dependencies: - toggle-selection "^1.0.6" - -create-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" - integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-config "^29.7.0" - jest-util "^29.7.0" - prompts "^2.0.1" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" - integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== - -css-to-react-native@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" - integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^4.0.2" - -css.escape@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" - integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== - -cssom@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" - integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -csstype@3.1.3, csstype@^3.0.2, csstype@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -damerau-levenshtein@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" - integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== - -data-urls@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" - integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== - dependencies: - abab "^2.0.6" - whatwg-mimetype "^3.0.0" - whatwg-url "^11.0.0" - -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -dayjs@^1.11.10: - version "1.11.11" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.11.tgz#dfe0e9d54c5f8b68ccf8ca5f72ac603e7e5ed59e" - integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg== - -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decimal.js@^10.4.2: - version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== - -dedent@^1.0.0: - version "1.5.3" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" - integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== - -deep-equal@^2.0.5: - version "2.2.3" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" - integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.5" - es-get-iterator "^1.1.3" - get-intrinsic "^1.2.2" - is-arguments "^1.1.1" - is-array-buffer "^3.0.2" - is-date-object "^1.0.5" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - isarray "^2.0.5" - object-is "^1.1.5" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - side-channel "^1.0.4" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.13" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -dequal@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-accessibility-api@^0.5.9: - version "0.5.16" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" - integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== - -dom-accessibility-api@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" - integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== - -domexception@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" - integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== - dependencies: - webidl-conversions "^7.0.0" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -electron-to-chromium@^1.4.668: - version "1.4.780" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.780.tgz#8c6d7ff82b56b4219f2ae7918ee271ae25654f07" - integrity sha512-NPtACGFe7vunRYzvYqVRhQvsDrTevxpgDKxG/Vcbe0BTNOY+5+/2mOXSw2ls7ToNbE5Bf/+uQbjTxcmwMozpCw== - -elliptic@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -enhanced-resolve@^5.12.0: - version "5.16.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz#e8bc63d51b826d6f1cbc0a150ecb5a8b0c62e567" - integrity sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -entities@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-get-iterator@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" - integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - has-symbols "^1.0.3" - is-arguments "^1.1.1" - is-map "^2.0.2" - is-set "^2.0.2" - is-string "^1.0.7" - isarray "^2.0.5" - stop-iteration-iterator "^1.0.0" - -es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: - version "1.0.19" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" - integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.3" - es-errors "^1.3.0" - es-set-tostringtag "^2.0.3" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - globalthis "^1.0.3" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - internal-slot "^1.0.7" - iterator.prototype "^1.1.2" - safe-array-concat "^1.1.2" - -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== - dependencies: - get-intrinsic "^1.2.4" - has-tostringtag "^1.0.2" - hasown "^2.0.1" - -es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.1, escalade@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escodegen@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" - integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionalDependencies: - source-map "~0.6.1" - -eslint-config-next@14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.1.0.tgz#7e309d426b8afacaba3b32fdbb02ba220b6d0a97" - integrity sha512-SBX2ed7DoRFXC6CQSLc/SbLY9Ut6HxNB2wPTcoIWjUMd7aF7O/SIE7111L8FdZ9TXsNV4pulUDnfthpyPtbFUg== - dependencies: - "@next/eslint-plugin-next" "14.1.0" - "@rushstack/eslint-patch" "^1.3.3" - "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" - eslint-import-resolver-node "^0.3.6" - eslint-import-resolver-typescript "^3.5.2" - eslint-plugin-import "^2.28.1" - eslint-plugin-jsx-a11y "^6.7.1" - eslint-plugin-react "^7.33.2" - eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - -eslint-config-prettier@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" - integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== - -eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-import-resolver-typescript@^3.5.2: - version "3.6.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" - integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== - dependencies: - debug "^4.3.4" - enhanced-resolve "^5.12.0" - eslint-module-utils "^2.7.4" - fast-glob "^3.3.1" - get-tsconfig "^4.5.0" - is-core-module "^2.11.0" - is-glob "^4.0.3" - -eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@^2.28.1, eslint-plugin-import@^2.29.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" - semver "^6.3.1" - tsconfig-paths "^3.15.0" - -eslint-plugin-jest@^27.6.3: - version "27.9.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz#7c98a33605e1d8b8442ace092b60e9919730000b" - integrity sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug== - dependencies: - "@typescript-eslint/utils" "^5.10.0" - -eslint-plugin-jsx-a11y@^6.7.1: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" - integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== - dependencies: - "@babel/runtime" "^7.23.2" - aria-query "^5.3.0" - array-includes "^3.1.7" - array.prototype.flatmap "^1.3.2" - ast-types-flow "^0.0.8" - axe-core "=4.7.0" - axobject-query "^3.2.1" - damerau-levenshtein "^1.0.8" - emoji-regex "^9.2.2" - es-iterator-helpers "^1.0.15" - hasown "^2.0.0" - jsx-ast-utils "^3.3.5" - language-tags "^1.0.9" - minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" - -eslint-plugin-next@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-next/-/eslint-plugin-next-0.0.0.tgz#f9ef680e8f68763c716ab44697c4b3cc3e0b2069" - integrity sha512-IldNDVb6WNduggwRbYzSGZhaskUwVecJ6fhmqwX01+S1aohwAWNzU4me6y47DDzpD/g0fdayNBGxEdt9vKkUtg== - -eslint-plugin-prettier@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz#17cfade9e732cef32b5f5be53bd4e07afd8e67e1" - integrity sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== - dependencies: - prettier-linter-helpers "^1.0.0" - synckit "^0.8.6" - -"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": - version "4.6.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" - integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== - -eslint-plugin-react@^7.33.2: - version "7.34.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" - integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlast "^1.2.4" - array.prototype.flatmap "^1.3.2" - array.prototype.toreversed "^1.1.2" - array.prototype.tosorted "^1.1.3" - doctrine "^2.1.0" - es-iterator-helpers "^1.0.17" - estraverse "^5.3.0" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" - object.hasown "^1.1.3" - object.values "^1.1.7" - prop-types "^15.8.1" - resolve "^2.0.0-next.5" - semver "^6.3.1" - string.prototype.matchall "^4.0.10" - -eslint-plugin-simple-import-sort@^12.0.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.0.tgz#8186ad55474d2f5c986a2f1bf70625a981e30d05" - integrity sha512-Y2fqAfC11TcG/WP3TrI1Gi3p3nc8XJyEOJYHyEPEGI/UAgNx6akxxlX74p7SbAQdLcgASKhj8M0GKvH3vq/+ig== - -eslint-plugin-unused-imports@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.2.0.tgz#63a98c9ad5f622cd9f830f70bc77739f25ccfe0d" - integrity sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ== - dependencies: - eslint-rule-composer "^0.3.0" - -eslint-rule-composer@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" - integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@^8.56.0: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -ethers-multicall@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/ethers-multicall/-/ethers-multicall-0.2.3.tgz#872b5ad7d6b5d4d7f2960c33bf36bd46d034ac41" - integrity sha512-RaWQuLy+HzeKOibptlc9RZ6j7bT1H6VnkdAKTHiLx2t/lpyfS2ckXHdQhhRbCaXNc1iu6CgoisgMejxKHg84tg== - dependencies: - ethers "^5.0.0" - -ethers@5.7.2, ethers@^5.0.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" - integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== - dependencies: - "@ethersproject/abi" "5.7.0" - "@ethersproject/abstract-provider" "5.7.0" - "@ethersproject/abstract-signer" "5.7.0" - "@ethersproject/address" "5.7.0" - "@ethersproject/base64" "5.7.0" - "@ethersproject/basex" "5.7.0" - "@ethersproject/bignumber" "5.7.0" - "@ethersproject/bytes" "5.7.0" - "@ethersproject/constants" "5.7.0" - "@ethersproject/contracts" "5.7.0" - "@ethersproject/hash" "5.7.0" - "@ethersproject/hdnode" "5.7.0" - "@ethersproject/json-wallets" "5.7.0" - "@ethersproject/keccak256" "5.7.0" - "@ethersproject/logger" "5.7.0" - "@ethersproject/networks" "5.7.1" - "@ethersproject/pbkdf2" "5.7.0" - "@ethersproject/properties" "5.7.0" - "@ethersproject/providers" "5.7.2" - "@ethersproject/random" "5.7.0" - "@ethersproject/rlp" "5.7.0" - "@ethersproject/sha2" "5.7.0" - "@ethersproject/signing-key" "5.7.0" - "@ethersproject/solidity" "5.7.0" - "@ethersproject/strings" "5.7.0" - "@ethersproject/transactions" "5.7.0" - "@ethersproject/units" "5.7.0" - "@ethersproject/wallet" "5.7.0" - "@ethersproject/web" "5.7.1" - "@ethersproject/wordlists" "5.7.0" - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expect@^29.0.0, expect@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" - integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== - dependencies: - "@jest/expect-utils" "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" - integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== - -fast-glob@^3.2.9, fast-glob@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== - dependencies: - call-bind "^1.0.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - -get-tsconfig@^4.5.0: - version "4.7.5" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.5.tgz#5e012498579e9a6947511ed0cd403272c7acbbaf" - integrity sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw== - dependencies: - resolve-pkg-maps "^1.0.0" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@10.3.10: - version "10.3.10" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== - dependencies: - foreground-child "^3.1.0" - jackspeak "^2.3.5" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" - -glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -html-encoding-sniffer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" - integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== - dependencies: - whatwg-encoding "^2.0.0" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== - dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ignore@^5.2.0, ignore@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== - -immutable@^4.0.0: - version "4.3.6" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.6.tgz#6a05f7858213238e587fb83586ffa3b4b27f0447" - integrity sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -internal-slot@^1.0.4, internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - -is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-async-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" - integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== - dependencies: - has-tostringtag "^1.0.0" - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== - dependencies: - hasown "^2.0.0" - -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== - dependencies: - is-typed-array "^1.1.13" - -is-date-object@^1.0.1, is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-finalizationregistry@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" - integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== - dependencies: - call-bind "^1.0.2" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-generator-function@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-map@^2.0.2, is-map@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" - integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== - -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-set@^2.0.2, is-set@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" - integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== - -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== - dependencies: - call-bind "^1.0.7" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== - dependencies: - which-typed-array "^1.1.14" - -is-weakmap@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" - integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-weakset@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" - integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" - integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== - -istanbul-lib-instrument@^5.0.4: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-instrument@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz#91655936cf7380e4e473383081e38478b69993b1" - integrity sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw== - dependencies: - "@babel/core" "^7.23.9" - "@babel/parser" "^7.23.9" - "@istanbuljs/schema" "^0.1.3" - istanbul-lib-coverage "^3.2.0" - semver "^7.5.4" - -istanbul-lib-report@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" - integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^4.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" - integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== - dependencies: - define-properties "^1.2.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - reflect.getprototypeof "^1.0.4" - set-function-name "^2.0.1" - -jackspeak@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" - integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jest-changed-files@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" - integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== - dependencies: - execa "^5.0.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - -jest-circus@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" - integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^1.0.0" - is-generator-fn "^2.0.0" - jest-each "^29.7.0" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - pretty-format "^29.7.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" - integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== - dependencies: - "@jest/core" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - chalk "^4.0.0" - create-jest "^29.7.0" - exit "^0.1.2" - import-local "^3.0.2" - jest-config "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - yargs "^17.3.1" - -jest-config@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" - integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.7.0" - "@jest/types" "^29.6.3" - babel-jest "^29.7.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.7.0" - jest-environment-node "^29.7.0" - jest-get-type "^29.6.3" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-runner "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" - integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.6.3" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-docblock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" - integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" - integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - jest-get-type "^29.6.3" - jest-util "^29.7.0" - pretty-format "^29.7.0" - -jest-environment-jsdom@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz#d206fa3551933c3fd519e5dfdb58a0f5139a837f" - integrity sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/jsdom" "^20.0.0" - "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" - jsdom "^20.0.0" - -jest-environment-node@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" - integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -jest-get-type@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" - integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== - -jest-haste-map@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" - integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== - dependencies: - "@jest/types" "^29.6.3" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - jest-worker "^29.7.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" - integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== - dependencies: - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-matcher-utils@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" - integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== - dependencies: - chalk "^4.0.0" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-message-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" - integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" - integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-util "^29.7.0" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" - integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== - -jest-resolve-dependencies@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" - integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== - dependencies: - jest-regex-util "^29.6.3" - jest-snapshot "^29.7.0" - -jest-resolve@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" - integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.7.0" - jest-validate "^29.7.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" - integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== - dependencies: - "@jest/console" "^29.7.0" - "@jest/environment" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.7.0" - jest-environment-node "^29.7.0" - jest-haste-map "^29.7.0" - jest-leak-detector "^29.7.0" - jest-message-util "^29.7.0" - jest-resolve "^29.7.0" - jest-runtime "^29.7.0" - jest-util "^29.7.0" - jest-watcher "^29.7.0" - jest-worker "^29.7.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" - integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/globals" "^29.7.0" - "@jest/source-map" "^29.6.3" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" - integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.7.0" - graceful-fs "^4.2.9" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - natural-compare "^1.4.0" - pretty-format "^29.7.0" - semver "^7.5.3" - -jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" - integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== - dependencies: - "@jest/types" "^29.6.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.6.3" - leven "^3.1.0" - pretty-format "^29.7.0" - -jest-watcher@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" - integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== - dependencies: - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.7.0" - string-length "^4.0.1" - -jest-worker@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" - integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== - dependencies: - "@types/node" "*" - jest-util "^29.7.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" - integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== - dependencies: - "@jest/core" "^29.7.0" - "@jest/types" "^29.6.3" - import-local "^3.0.2" - jest-cli "^29.7.0" - -js-sha3@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsdom@^20.0.0: - version "20.0.3" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" - integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== - dependencies: - abab "^2.0.6" - acorn "^8.8.1" - acorn-globals "^7.0.0" - cssom "^0.5.0" - cssstyle "^2.3.0" - data-urls "^3.0.2" - decimal.js "^10.4.2" - domexception "^4.0.0" - escodegen "^2.0.0" - form-data "^4.0.0" - html-encoding-sniffer "^3.0.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.1" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.2" - parse5 "^7.1.1" - saxes "^6.0.0" - symbol-tree "^3.2.4" - tough-cookie "^4.1.2" - w3c-xmlserializer "^4.0.0" - webidl-conversions "^7.0.0" - whatwg-encoding "^2.0.0" - whatwg-mimetype "^3.0.0" - whatwg-url "^11.0.0" - ws "^8.11.0" - xml-name-validator "^4.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json2mq@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" - integrity sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA== - dependencies: - string-convert "^0.2.0" - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: - version "3.3.5" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" - integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - object.assign "^4.1.4" - object.values "^1.1.6" - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -language-subtag-registry@^0.3.20: - version "0.3.23" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" - integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== - -language-tags@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" - integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== - dependencies: - language-subtag-registry "^0.3.20" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^10.2.0: - version "10.2.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" - integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lz-string@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" - integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== - -make-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" - integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== - dependencies: - semver "^7.5.3" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4: - version "4.0.7" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" - integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.1, minimatch@^9.0.4: - version "9.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": - version "7.1.1" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.1.tgz#f7f85aff59aa22f110b20e27692465cf3bf89481" - integrity sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nanoid@^3.3.6, nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -next@^14.2.3: - version "14.2.3" - resolved "https://registry.yarnpkg.com/next/-/next-14.2.3.tgz#f117dd5d5f20c307e7b8e4f9c1c97d961008925d" - integrity sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A== - dependencies: - "@next/env" "14.2.3" - "@swc/helpers" "0.5.5" - busboy "1.6.0" - caniuse-lite "^1.0.30001579" - graceful-fs "^4.2.11" - postcss "8.4.31" - styled-jsx "5.1.1" - optionalDependencies: - "@next/swc-darwin-arm64" "14.2.3" - "@next/swc-darwin-x64" "14.2.3" - "@next/swc-linux-arm64-gnu" "14.2.3" - "@next/swc-linux-arm64-musl" "14.2.3" - "@next/swc-linux-x64-gnu" "14.2.3" - "@next/swc-linux-x64-musl" "14.2.3" - "@next/swc-win32-arm64-msvc" "14.2.3" - "@next/swc-win32-ia32-msvc" "14.2.3" - "@next/swc-win32-x64-msvc" "14.2.3" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nwsapi@^2.2.2: - version "2.2.10" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.10.tgz#0b77a68e21a0b483db70b11fad055906e867cda8" - integrity sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ== - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== - -object-is@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" - integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4, object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.entries@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" - integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -object.fromentries@^2.0.7: - version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.groupby@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.hasown@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" - integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== - dependencies: - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.values@^1.1.6, object.values@^1.1.7: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" - integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse5@^7.0.0, parse5@^7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== - dependencies: - entities "^4.4.0" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.10.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0, picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pirates@^4.0.4: - version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== - -postcss-value-parser@^4.0.2: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@8.4.31: - version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" - integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@8.4.38: - version "8.4.38" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.2.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@^3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" - integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== - -pretty-format@^27.0.2: - version "27.5.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" - integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== - dependencies: - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -pretty-format@^29.0.0, pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -pure-rand@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" - integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== - -qrcode.react@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/qrcode.react/-/qrcode.react-3.1.0.tgz#5c91ddc0340f768316fbdb8fff2765134c2aecd8" - integrity sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -rc-cascader@~3.26.0: - version "3.26.0" - resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-3.26.0.tgz#1bcc9c29451047dc99e28fdd125c94828d7ddf76" - integrity sha512-L1dml383TPSJD1I11YwxuVbmqaJY64psZqFp1ETlgl3LEOwDu76Cyl11fw5dmjJhMlUWwM5dECQfqJgfebhUjg== - dependencies: - "@babel/runtime" "^7.12.5" - array-tree-filter "^2.1.0" - classnames "^2.3.1" - rc-select "~14.14.0" - rc-tree "~5.8.1" - rc-util "^5.37.0" - -rc-checkbox@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-3.3.0.tgz#0ffcb65ab78c7d2fcd1a0d6554af36786516bd02" - integrity sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.3.2" - rc-util "^5.25.2" - -rc-collapse@~3.7.3: - version "3.7.3" - resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-3.7.3.tgz#68161683d8fd1004bef4eb281fc106f3c8dc16eb" - integrity sha512-60FJcdTRn0X5sELF18TANwtVi7FtModq649H11mYF1jh83DniMoM4MqY627sEKRCTm4+WXfGDcB7hY5oW6xhyw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.3.4" - rc-util "^5.27.0" - -rc-dialog@~9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-9.4.0.tgz#194c107d34cb36a56f1db4a49dc73f6d59eeae85" - integrity sha512-AScCexaLACvf8KZRqCPz12BJ8olszXOS4lKlkMyzDQHS1m0zj1KZMYgmMCh39ee0Dcv8kyrj8mTqxuLyhH+QuQ== - dependencies: - "@babel/runtime" "^7.10.1" - "@rc-component/portal" "^1.0.0-8" - classnames "^2.2.6" - rc-motion "^2.3.0" - rc-util "^5.21.0" - -rc-drawer@~7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-7.1.0.tgz#2beabb8bab1784aea255d0d850bc206c3dc715da" - integrity sha512-nBE1rF5iZvpavoyqhSSz2mk/yANltA7g3aF0U45xkx381n3we/RKs9cJfNKp9mSWCedOKWt9FLEwZDaAaOGn2w== - dependencies: - "@babel/runtime" "^7.23.9" - "@rc-component/portal" "^1.1.1" - classnames "^2.2.6" - rc-motion "^2.6.1" - rc-util "^5.38.1" - -rc-dropdown@~4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-4.2.0.tgz#c6052fcfe9c701487b141e411cdc277dc7c6f061" - integrity sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng== - dependencies: - "@babel/runtime" "^7.18.3" - "@rc-component/trigger" "^2.0.0" - classnames "^2.2.6" - rc-util "^5.17.0" - -rc-field-form@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-2.0.1.tgz#97dc352f3899e9617f2abfd0c09bf0fcd17409e2" - integrity sha512-3WK/POHBcfMFKrzScrkmgMIXqoVQ0KgVwcVnej/ukwuQG4ZHCJaTi2KhM+tWTK4WODBXbmjKg5pKHj2IVmSg4A== - dependencies: - "@babel/runtime" "^7.18.0" - "@rc-component/async-validator" "^5.0.3" - rc-util "^5.32.2" - -rc-image@~7.6.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-7.6.0.tgz#2867087b77c8595ea9eb37d18ca863e47904b191" - integrity sha512-tL3Rvd1sS+frZQ01i+tkeUPaOeFz2iG9/scAt/Cfs0hyCRVA/w0Pu1J/JxIX8blalvmHE0bZQRYdOmRAzWu4Hg== - dependencies: - "@babel/runtime" "^7.11.2" - "@rc-component/portal" "^1.0.2" - classnames "^2.2.6" - rc-dialog "~9.4.0" - rc-motion "^2.6.2" - rc-util "^5.34.1" - -rc-input-number@~9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-9.1.0.tgz#fd577db284b65548c156500322a2feaa04321565" - integrity sha512-NqJ6i25Xn/AgYfVxynlevIhX3FuKlMwIFpucGG1h98SlK32wQwDK0zhN9VY32McOmuaqzftduNYWWooWz8pXQA== - dependencies: - "@babel/runtime" "^7.10.1" - "@rc-component/mini-decimal" "^1.0.1" - classnames "^2.2.5" - rc-input "~1.5.0" - rc-util "^5.40.1" - -rc-input@~1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/rc-input/-/rc-input-1.5.1.tgz#36d37eb045f1fa17de7da1a3fab94edfa331ab92" - integrity sha512-+nOzQJDeIfIpNP/SgY45LXSKbuMlp4Yap2y8c+ZpU7XbLmNzUd6+d5/S75sA/52jsVE6S/AkhkkDEAOjIu7i6g== - dependencies: - "@babel/runtime" "^7.11.1" - classnames "^2.2.1" - rc-util "^5.18.1" - -rc-mentions@~2.13.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-2.13.1.tgz#14586ffa4a1ddd4079564f38abf2b4351671feca" - integrity sha512-DSyUDq/PPCleUX1eghIn371lTSRQsIuCs1N7xR9nZcHP9R1NkE7JjpWUP8Gy4EGVPu0JN0qIcokxYJaoGPnofg== - dependencies: - "@babel/runtime" "^7.22.5" - "@rc-component/trigger" "^2.0.0" - classnames "^2.2.6" - rc-input "~1.5.0" - rc-menu "~9.14.0" - rc-textarea "~1.7.0" - rc-util "^5.34.1" - -rc-menu@~9.14.0: - version "9.14.0" - resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-9.14.0.tgz#5e072cfc731a6dd95005d4247f02543679b0836b" - integrity sha512-La3LBCDMLMs9Q/8mTGbnscb+ZeJ26ebkLz9xJFHd2SD8vfsCKl1Z/k3mwbxyKL01lB40fel1s9Nn9LAv/nmVJQ== - dependencies: - "@babel/runtime" "^7.10.1" - "@rc-component/trigger" "^2.0.0" - classnames "2.x" - rc-motion "^2.4.3" - rc-overflow "^1.3.1" - rc-util "^5.27.0" - -rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.3, rc-motion@^2.4.4, rc-motion@^2.6.1, rc-motion@^2.6.2, rc-motion@^2.9.0, rc-motion@^2.9.1: - version "2.9.1" - resolved "https://registry.yarnpkg.com/rc-motion/-/rc-motion-2.9.1.tgz#5b405437f9f673ed1a59b6b797c2227c2d6b3d91" - integrity sha512-QD4bUqByjVQs7PhUT1d4bNxvtTcK9ETwtg7psbDfo6TmYalH/1hhjj4r2hbhW7g5OOEqYHhfwfj4noIvuOVRtQ== - dependencies: - "@babel/runtime" "^7.11.1" - classnames "^2.2.1" - rc-util "^5.39.3" - -rc-notification@~5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-5.4.0.tgz#c5ea20bfe4ed2dbacc7ef945777626c050945db8" - integrity sha512-li19y9RoYJciF3WRFvD+DvWS70jdL8Fr+Gfb/OshK+iY6iTkwzoigmSIp76/kWh5tF5i/i9im12X3nsF85GYdA== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.9.0" - rc-util "^5.20.1" - -rc-overflow@^1.3.1, rc-overflow@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/rc-overflow/-/rc-overflow-1.3.2.tgz#72ee49e85a1308d8d4e3bd53285dc1f3e0bcce2c" - integrity sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw== - dependencies: - "@babel/runtime" "^7.11.1" - classnames "^2.2.1" - rc-resize-observer "^1.0.0" - rc-util "^5.37.0" - -rc-pagination@~4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-4.0.4.tgz#ea401388ae86eac17ed5b41212d487f12b65b773" - integrity sha512-GGrLT4NgG6wgJpT/hHIpL9nELv27A1XbSZzECIuQBQTVSf4xGKxWr6I/jhpRPauYEWEbWVw22ObG6tJQqwJqWQ== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.3.2" - rc-util "^5.38.0" - -rc-picker@~4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-4.5.0.tgz#ae7a028ed6184e0ef40a2c8aaeb9d5dbef89d4b8" - integrity sha512-suqz9bzuhBQlf7u+bZd1bJLPzhXpk12w6AjQ9BTPTiFwexVZgUKViG1KNLyfFvW6tCUZZK0HmCCX7JAyM+JnCg== - dependencies: - "@babel/runtime" "^7.10.1" - "@rc-component/trigger" "^2.0.0" - classnames "^2.2.1" - rc-overflow "^1.3.2" - rc-resize-observer "^1.4.0" - rc-util "^5.38.1" - -rc-progress@~4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-4.0.0.tgz#5382147d9add33d3a5fbd264001373df6440e126" - integrity sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.6" - rc-util "^5.16.1" - -rc-rate@~2.12.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/rc-rate/-/rc-rate-2.12.0.tgz#0182deffed3b009cdcc61660da8746c39ed91ed5" - integrity sha512-g092v5iZCdVzbjdn28FzvWebK2IutoVoiTeqoLTj9WM7SjA/gOJIw5/JFZMRyJYYVe1jLAU2UhAfstIpCNRozg== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.5" - rc-util "^5.0.1" - -rc-resize-observer@^1.0.0, rc-resize-observer@^1.1.0, rc-resize-observer@^1.3.1, rc-resize-observer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz#7bba61e6b3c604834980647cce6451914750d0cc" - integrity sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q== - dependencies: - "@babel/runtime" "^7.20.7" - classnames "^2.2.1" - rc-util "^5.38.0" - resize-observer-polyfill "^1.5.1" - -rc-segmented@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/rc-segmented/-/rc-segmented-2.3.0.tgz#b3fe080fb434a266c02e30bb62a47d2c6e094341" - integrity sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg== - dependencies: - "@babel/runtime" "^7.11.1" - classnames "^2.2.1" - rc-motion "^2.4.4" - rc-util "^5.17.0" - -rc-select@~14.14.0: - version "14.14.0" - resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-14.14.0.tgz#110771fad72496843b245236bcb0007553b9fe0d" - integrity sha512-Uo2wulrjoPPRLCPd7zlK4ZFVJxlTN//yp1xWP/U+TUOQCyXrT+Duvq/Si5OzVcmQyWAUSbsplc2OwNNhvbOeKQ== - dependencies: - "@babel/runtime" "^7.10.1" - "@rc-component/trigger" "^2.1.1" - classnames "2.x" - rc-motion "^2.0.1" - rc-overflow "^1.3.1" - rc-util "^5.16.1" - rc-virtual-list "^3.5.2" - -rc-slider@~10.6.2: - version "10.6.2" - resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-10.6.2.tgz#8bd3b63b24f2f3682ea1bf86d021073189cf33eb" - integrity sha512-FjkoFjyvUQWcBo1F3RgSglky3ar0+qHLM41PlFVYB4Bj3RD8E/Mv7kqMouLFBU+3aFglMzzctAIWRwajEuueSw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.5" - rc-util "^5.36.0" - -rc-steps@~6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/rc-steps/-/rc-steps-6.0.1.tgz#c2136cd0087733f6d509209a84a5c80dc29a274d" - integrity sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g== - dependencies: - "@babel/runtime" "^7.16.7" - classnames "^2.2.3" - rc-util "^5.16.1" - -rc-switch@~4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/rc-switch/-/rc-switch-4.1.0.tgz#f37d81b4e0c5afd1274fd85367b17306bf25e7d7" - integrity sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg== - dependencies: - "@babel/runtime" "^7.21.0" - classnames "^2.2.1" - rc-util "^5.30.0" - -rc-table@~7.45.6: - version "7.45.6" - resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.45.6.tgz#53286fc08cd18f0be704de76fdbf19d1de7749da" - integrity sha512-FYsTya3RQzLYct+o3fqHIZQIwrmsvrvhTg/I6hzlJZ1XoVAGoTmgkN1mMilVlYgksZTey9BCNYh94c6yhdjTXQ== - dependencies: - "@babel/runtime" "^7.10.1" - "@rc-component/context" "^1.4.0" - classnames "^2.2.5" - rc-resize-observer "^1.1.0" - rc-util "^5.37.0" - rc-virtual-list "^3.11.1" - -rc-tabs@~15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-15.1.0.tgz#6f6addf3ec4d0815f9f05d1317b47a579838e92f" - integrity sha512-xTNz4Km1025emtkv1q7xKhjPwAtXr/wycuXVTAcFJg+DKhnPDDbnwbA9KRW0SawAVOGvVEj8ZrBlU0u0FGLrbg== - dependencies: - "@babel/runtime" "^7.11.2" - classnames "2.x" - rc-dropdown "~4.2.0" - rc-menu "~9.14.0" - rc-motion "^2.6.2" - rc-resize-observer "^1.0.0" - rc-util "^5.34.1" - -rc-textarea@~1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/rc-textarea/-/rc-textarea-1.7.0.tgz#115c421359dddee58c601008ec2209b41cb8f8df" - integrity sha512-UxizYJkWkmxP3zofXgc487QiGyDmhhheDLLjIWbFtDmiru1ls30KpO8odDaPyqNUIy9ugj5djxTEuezIn6t3Jg== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - rc-input "~1.5.0" - rc-resize-observer "^1.0.0" - rc-util "^5.27.0" - -rc-tooltip@~6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-6.2.0.tgz#4dd7575674137a5b14f118a5c16435d3f5e4a9c9" - integrity sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw== - dependencies: - "@babel/runtime" "^7.11.2" - "@rc-component/trigger" "^2.0.0" - classnames "^2.3.1" - -rc-tree-select@~5.21.0: - version "5.21.0" - resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-5.21.0.tgz#4ff94d5c28cba9810c4970d1f12ab7248c3b6e55" - integrity sha512-w+9qEu6zh0G3wt9N/hzWNSnqYH1i9mH1Nqxo0caxLRRFXF5yZWYmpCDoDTMdQM1Y4z3Q5yj08qyrPH/d4AtumA== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-select "~14.14.0" - rc-tree "~5.8.1" - rc-util "^5.16.1" - -rc-tree@~5.8.1, rc-tree@~5.8.7: - version "5.8.7" - resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-5.8.7.tgz#79fe560eca8a998a5cd866cdf374ffc3643754f1" - integrity sha512-cpsIQZ4nNYwpj6cqPRt52e/69URuNdgQF9wZ10InmEf8W3+i0A41OVmZWwHuX9gegQSqj+DPmaDkZFKQZ+ZV1w== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.0.1" - rc-util "^5.16.1" - rc-virtual-list "^3.5.1" - -rc-upload@~4.5.2: - version "4.5.2" - resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-4.5.2.tgz#ea493fbaaf57d9369ee954b20e1d8bc35c818a1a" - integrity sha512-QO3ne77DwnAPKFn0bA5qJM81QBjQi0e0NHdkvpFyY73Bea2NfITiotqJqVjHgeYPOJu5lLVR32TNGP084aSoXA== - dependencies: - "@babel/runtime" "^7.18.3" - classnames "^2.2.5" - rc-util "^5.2.0" - -rc-util@^5.0.1, rc-util@^5.16.1, rc-util@^5.17.0, rc-util@^5.18.1, rc-util@^5.2.0, rc-util@^5.20.1, rc-util@^5.21.0, rc-util@^5.24.4, rc-util@^5.25.2, rc-util@^5.27.0, rc-util@^5.30.0, rc-util@^5.31.1, rc-util@^5.32.2, rc-util@^5.34.1, rc-util@^5.35.0, rc-util@^5.36.0, rc-util@^5.37.0, rc-util@^5.38.0, rc-util@^5.38.1, rc-util@^5.39.3, rc-util@^5.40.1: - version "5.41.0" - resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.41.0.tgz#b1ba000d4f3a9e72563370a3243b59f89b40e1bd" - integrity sha512-xtlCim9RpmVv0Ar2Nnc3WfJCxjQkTf3xHPWoFdjp1fSs2NirQwqiQrfqdU9HUe0kdfb168M/T8Dq0IaX50xeKg== - dependencies: - "@babel/runtime" "^7.18.3" - react-is "^18.2.0" - -rc-virtual-list@^3.11.1, rc-virtual-list@^3.5.1, rc-virtual-list@^3.5.2: - version "3.14.2" - resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-3.14.2.tgz#8ffee57100eab1eeae8df6a67bf75d0b7fd176cc" - integrity sha512-rA+W5xryhklJAcmswNyuKB3ZGeB855io+yOFQK5u/RXhjdshGblfKpNkQr4/9fBhZns0+uiL/0/s6IP2krtSmg== - dependencies: - "@babel/runtime" "^7.20.0" - classnames "^2.2.6" - rc-resize-observer "^1.0.0" - rc-util "^5.36.0" - -react-canvas-confetti@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/react-canvas-confetti/-/react-canvas-confetti-1.2.1.tgz#22ac64cbc478cf57cb5f61c130322e359b35389d" - integrity sha512-onNjQNkhQjrB2JVCeRpJW7o8VlBNJvo3Eht9zlQlofNLVvvOd1+PzBLU5Ev8n5sFBkTbKJmIUVG0eZnkAl5cpg== - dependencies: - "@types/canvas-confetti" "1.4.0" - canvas-confetti "1.4.0" - -react-dom@^18.3.1: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" - integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.2" - -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-is@^18.0.0, react-is@^18.2.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - -react@^18.3.1: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" - integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== - dependencies: - loose-envify "^1.1.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -reflect.getprototypeof@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" - integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.1" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - globalthis "^1.0.3" - which-builtin-type "^1.1.3" - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== - dependencies: - call-bind "^1.0.6" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resize-observer-polyfill@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" - integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -resolve.exports@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" - integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== - -resolve@^1.20.0, resolve@^1.22.4: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^2.0.0-next.5: - version "2.0.0-next.5" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" - integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-regex "^1.1.4" - -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sass@^1.72.0: - version "1.77.2" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.2.tgz#18d4ed2eefc260cdc8099c5439ec1303fd5863aa" - integrity sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA== - dependencies: - chokidar ">=3.0.0 <4.0.0" - immutable "^4.0.0" - source-map-js ">=0.6.2 <2.0.0" - -saxes@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" - integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== - dependencies: - xmlchars "^2.2.0" - -scheduler@^0.23.2: - version "0.23.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" - integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== - dependencies: - loose-envify "^1.1.0" - -scroll-into-view-if-needed@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz#fa9524518c799b45a2ef6bbffb92bcad0296d01f" - integrity sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ== - dependencies: - compute-scroll-into-view "^3.0.2" - -scrypt-js@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - -semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: - version "7.6.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.1, set-function-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -shallowequal@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.4, side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2, source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== - dependencies: - internal-slot "^1.0.4" - -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - -string-convert@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" - integrity sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A== - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string.prototype.matchall@^4.0.10: - version "4.0.11" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" - integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.7" - regexp.prototype.flags "^1.5.2" - set-function-name "^2.0.2" - side-channel "^1.0.6" - -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-object-atoms "^1.0.0" - -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -styled-components@^6.1.8: - version "6.1.11" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.11.tgz#01948e5195bf1d39e57e0a85b41958c80e40cfb8" - integrity sha512-Ui0jXPzbp1phYij90h12ksljKGqF8ncGx+pjrNPsSPhbUUjWT2tD1FwGo2LF6USCnbrsIhNngDfodhxbegfEOA== - dependencies: - "@emotion/is-prop-valid" "1.2.2" - "@emotion/unitless" "0.8.1" - "@types/stylis" "4.2.5" - css-to-react-native "3.2.0" - csstype "3.1.3" - postcss "8.4.38" - shallowequal "1.1.0" - stylis "4.3.2" - tslib "2.6.2" - -styled-jsx@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" - integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== - dependencies: - client-only "0.0.1" - -stylis@4.3.2, stylis@^4.0.13: - version "4.3.2" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.2.tgz#8f76b70777dd53eb669c6f58c997bf0a9972e444" - integrity sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -synckit@^0.8.6: - version "0.8.8" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" - integrity sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== - dependencies: - "@pkgr/core" "^0.1.0" - tslib "^2.6.2" - -tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -throttle-debounce@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-5.0.0.tgz#a17a4039e82a2ed38a5e7268e4132d6960d41933" - integrity sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg== - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toggle-selection@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" - integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== - -tough-cookie@^4.1.2: - version "4.1.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" - integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" - integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== - dependencies: - punycode "^2.1.1" - -ts-api-utils@^1.0.1, ts-api-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== - -ts-node@^10.9.2: - version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@2.6.2, tslib@^2.4.0, tslib@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-typed-array "^1.1.13" - -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - -typescript@5.5.3: - version "5.5.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.3.tgz#e1b0a3c394190838a0b168e771b0ad56a0af0faa" - integrity sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -update-browserslist-db@^1.0.13: - version "1.0.16" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" - integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== - dependencies: - escalade "^3.1.2" - picocolors "^1.0.1" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -usehooks-ts@^2.14.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/usehooks-ts/-/usehooks-ts-2.16.0.tgz#31deaa2f1147f65666aae925bd890b54e63b0d3f" - integrity sha512-bez95WqYujxp6hFdM/CpRDiVPirZPxlMzOH2QB8yopoKQMXpscyZoxOjpEdaxvV+CAWUDSM62cWnqHE0E/MZ7w== - dependencies: - lodash.debounce "^4.0.8" - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -v8-to-istanbul@^9.0.1: - version "9.2.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" - integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^2.0.0" - -w3c-xmlserializer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" - integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== - dependencies: - xml-name-validator "^4.0.0" - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -webidl-conversions@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" - integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== - -whatwg-encoding@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" - integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== - dependencies: - iconv-lite "0.6.3" - -whatwg-mimetype@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" - integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== - -whatwg-url@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" - integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== - dependencies: - tr46 "^3.0.0" - webidl-conversions "^7.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-builtin-type@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" - integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== - dependencies: - function.prototype.name "^1.1.5" - has-tostringtag "^1.0.0" - is-async-function "^2.0.0" - is-date-object "^1.0.5" - is-finalizationregistry "^1.0.2" - is-generator-function "^1.0.10" - is-regex "^1.1.4" - is-weakref "^1.0.2" - isarray "^2.0.5" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" - -which-collection@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" - integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== - dependencies: - is-map "^2.0.3" - is-set "^2.0.3" - is-weakmap "^2.0.2" - is-weakset "^2.0.3" - -which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -ws@7.4.6: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - -ws@^8.11.0: - version "8.17.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" - integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== - -xml-name-validator@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" - integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.3.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/hardhat.config.js b/hardhat.config.js deleted file mode 100644 index 854bee0ff..000000000 --- a/hardhat.config.js +++ /dev/null @@ -1,16 +0,0 @@ -require('dotenv').config(); - -/**@type import('hardhat/config').HardhatUserConfig */ -const config = { - defaultNetwork: "hardhat", - networks: { - hardhat: { - forking: { - url: process.env.FORK_URL, - }, - chainId: 100, - }, - }, -}; - -module.exports = config \ No newline at end of file

B2 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 z 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 diff --git a/electron/public/twitter.svg b/electron/public/twitter.svg deleted file mode 100644 index f2ddba13f..000000000 --- a/electron/public/twitter.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/electron/scripts/install_brew.sh b/electron/scripts/install_brew.sh deleted file mode 100644 index 46c41f315..000000000 --- a/electron/scripts/install_brew.sh +++ /dev/null @@ -1,1097 +0,0 @@ -# We don't need return codes for "$(command)", only stdout is needed. -# Allow `[[ -n "$(command)" ]]`, `func "$(command)"`, pipes, etc. -# shellcheck disable=SC2312 - -set -u - -abort() { - printf "%s\n" "$@" >&2 - exit 1 -} - -# Fail fast with a concise message when not using bash -# Single brackets are needed here for POSIX compatibility -# shellcheck disable=SC2292 -if [ -z "${BASH_VERSION:-}" ] -then - abort "Bash is required to interpret this script." -fi - -# Check if script is run with force-interactive mode in CI -if [[ -n "${CI-}" && -n "${INTERACTIVE-}" ]] -then - abort "Cannot run force-interactive mode in CI." -fi - -# Check if both `INTERACTIVE` and `NONINTERACTIVE` are set -# Always use single-quoted strings with `exp` expressions -# shellcheck disable=SC2016 -if [[ -n "${INTERACTIVE-}" && -n "${NONINTERACTIVE-}" ]] -then - abort 'Both `$INTERACTIVE` and `$NONINTERACTIVE` are set. Please unset at least one variable and try again.' -fi - -# Check if script is run in POSIX mode -if [[ -n "${POSIXLY_CORRECT+1}" ]] -then - abort 'Bash must not run in POSIX mode. Please unset POSIXLY_CORRECT and try again.' -fi - -usage() { - cat <${tty_bold} %s${tty_reset}\n" "$(shell_join "$@")" -} - -warn() { - printf "${tty_red}Warning${tty_reset}: %s\n" "$(chomp "$1")" >&2 -} - -# Check if script is run non-interactively (e.g. CI) -# If it is run non-interactively we should not prompt for passwords. -# Always use single-quoted strings with `exp` expressions -# shellcheck disable=SC2016 -if [[ -z "${NONINTERACTIVE-}" ]] -then - if [[ -n "${CI-}" ]] - then - warn 'Running in non-interactive mode because `$CI` is set.' - NONINTERACTIVE=1 - elif [[ ! -t 0 ]] - then - if [[ -z "${INTERACTIVE-}" ]] - then - warn 'Running in non-interactive mode because `stdin` is not a TTY.' - NONINTERACTIVE=1 - else - warn 'Running in interactive mode despite `stdin` not being a TTY because `$INTERACTIVE` is set.' - fi - fi -else - ohai 'Running in non-interactive mode because `$NONINTERACTIVE` is set.' -fi - -# USER isn't always set so provide a fall back for the installer and subprocesses. -if [[ -z "${USER-}" ]] -then - USER="$(chomp "$(id -un)")" - export USER -fi - -# First check OS. -OS="$(uname)" -if [[ "${OS}" == "Linux" ]] -then - HOMEBREW_ON_LINUX=1 -elif [[ "${OS}" == "Darwin" ]] -then - HOMEBREW_ON_MACOS=1 -else - abort "Homebrew is only supported on macOS and Linux." -fi - -# Required installation paths. To install elsewhere (which is unsupported) -# you can untar https://github.com/Homebrew/brew/tarball/master -# anywhere you like. -if [[ -n "${HOMEBREW_ON_MACOS-}" ]] -then - UNAME_MACHINE="$(/usr/bin/uname -m)" - - if [[ "${UNAME_MACHINE}" == "arm64" ]] - then - # On ARM macOS, this script installs to /opt/homebrew only - HOMEBREW_PREFIX="/opt/homebrew" - HOMEBREW_REPOSITORY="${HOMEBREW_PREFIX}" - else - # On Intel macOS, this script installs to /usr/local only - HOMEBREW_PREFIX="/usr/local" - HOMEBREW_REPOSITORY="${HOMEBREW_PREFIX}/Homebrew" - fi - HOMEBREW_CACHE="${HOME}/Library/Caches/Homebrew" - - STAT_PRINTF=("/usr/bin/stat" "-f") - PERMISSION_FORMAT="%A" - CHOWN=("/usr/sbin/chown") - CHGRP=("/usr/bin/chgrp") - GROUP="admin" - TOUCH=("/usr/bin/touch") - INSTALL=("/usr/bin/install" -d -o "root" -g "wheel" -m "0755") -else - UNAME_MACHINE="$(uname -m)" - - # On Linux, this script installs to /home/linuxbrew/.linuxbrew only - HOMEBREW_PREFIX="/home/linuxbrew/.linuxbrew" - HOMEBREW_REPOSITORY="${HOMEBREW_PREFIX}/Homebrew" - HOMEBREW_CACHE="${HOME}/.cache/Homebrew" - - STAT_PRINTF=("/usr/bin/stat" "--printf") - PERMISSION_FORMAT="%a" - CHOWN=("/bin/chown") - CHGRP=("/bin/chgrp") - GROUP="$(id -gn)" - TOUCH=("/bin/touch") - INSTALL=("/usr/bin/install" -d -o "${USER}" -g "${GROUP}" -m "0755") -fi -CHMOD=("/bin/chmod") -MKDIR=("/bin/mkdir" "-p") -HOMEBREW_BREW_DEFAULT_GIT_REMOTE="https://github.com/Homebrew/brew" -HOMEBREW_CORE_DEFAULT_GIT_REMOTE="https://github.com/Homebrew/homebrew-core" - -# Use remote URLs of Homebrew repositories from environment if set. -HOMEBREW_BREW_GIT_REMOTE="${HOMEBREW_BREW_GIT_REMOTE:-"${HOMEBREW_BREW_DEFAULT_GIT_REMOTE}"}" -HOMEBREW_CORE_GIT_REMOTE="${HOMEBREW_CORE_GIT_REMOTE:-"${HOMEBREW_CORE_DEFAULT_GIT_REMOTE}"}" -# The URLs with and without the '.git' suffix are the same Git remote. Do not prompt. -if [[ "${HOMEBREW_BREW_GIT_REMOTE}" == "${HOMEBREW_BREW_DEFAULT_GIT_REMOTE}.git" ]] -then - HOMEBREW_BREW_GIT_REMOTE="${HOMEBREW_BREW_DEFAULT_GIT_REMOTE}" -fi -if [[ "${HOMEBREW_CORE_GIT_REMOTE}" == "${HOMEBREW_CORE_DEFAULT_GIT_REMOTE}.git" ]] -then - HOMEBREW_CORE_GIT_REMOTE="${HOMEBREW_CORE_DEFAULT_GIT_REMOTE}" -fi -export HOMEBREW_{BREW,CORE}_GIT_REMOTE - -# TODO: bump version when new macOS is released or announced -MACOS_NEWEST_UNSUPPORTED="15.0" -# TODO: bump version when new macOS is released -MACOS_OLDEST_SUPPORTED="12.0" - -# For Homebrew on Linux -REQUIRED_RUBY_VERSION=2.6 # https://github.com/Homebrew/brew/pull/6556 -REQUIRED_GLIBC_VERSION=2.13 # https://docs.brew.sh/Homebrew-on-Linux#requirements -REQUIRED_CURL_VERSION=7.41.0 # HOMEBREW_MINIMUM_CURL_VERSION in brew.sh in Homebrew/brew -REQUIRED_GIT_VERSION=2.7.0 # HOMEBREW_MINIMUM_GIT_VERSION in brew.sh in Homebrew/brew - -# no analytics during installation -export HOMEBREW_NO_ANALYTICS_THIS_RUN=1 -export HOMEBREW_NO_ANALYTICS_MESSAGE_OUTPUT=1 - -unset HAVE_SUDO_ACCESS # unset this from the environment - -have_sudo_access() { - if [[ ! -x "/usr/bin/sudo" ]] - then - return 1 - fi - - local -a SUDO=("/usr/bin/sudo") - if [[ -n "${SUDO_ASKPASS-}" ]] - then - SUDO+=("-A") - elif [[ -n "${NONINTERACTIVE-}" ]] - then - SUDO+=("-n") - fi - - if [[ -z "${HAVE_SUDO_ACCESS-}" ]] - then - if [[ -n "${NONINTERACTIVE-}" ]] - then - "${SUDO[@]}" -l mkdir &>/dev/null - else - "${SUDO[@]}" -v && "${SUDO[@]}" -l mkdir &>/dev/null - fi - HAVE_SUDO_ACCESS="$?" - fi - - if [[ -n "${HOMEBREW_ON_MACOS-}" ]] && [[ "${HAVE_SUDO_ACCESS}" -ne 0 ]] - then - abort "Need sudo access on macOS (e.g. the user ${USER} needs to be an Administrator)!" - fi - - return "${HAVE_SUDO_ACCESS}" -} - -execute() { - if ! "$@" - then - abort "$(printf "Failed during: %s" "$(shell_join "$@")")" - fi -} - -execute_sudo() { - local -a args=("$@") - if [[ "${EUID:-${UID}}" != "0" ]] && have_sudo_access - then - if [[ -n "${SUDO_ASKPASS-}" ]] - then - args=("-A" "${args[@]}") - fi - ohai "/usr/bin/sudo" "${args[@]}" - execute "/usr/bin/sudo" "${args[@]}" - else - ohai "${args[@]}" - execute "${args[@]}" - fi -} - -getc() { - local save_state - save_state="$(/bin/stty -g)" - /bin/stty raw -echo - IFS='' read -r -n 1 -d '' "$@" - /bin/stty "${save_state}" -} - -ring_bell() { - # Use the shell's audible bell. - if [[ -t 1 ]] - then - printf "\a" - fi -} - -wait_for_user() { - local c - echo - echo "Press ${tty_bold}RETURN${tty_reset}/${tty_bold}ENTER${tty_reset} to continue or any other key to abort:" - getc c - if ! [[ "${c}" == $'\r' || "${c}" == $'\n' ]] - then - exit 1 - fi -} - -major_minor() { - echo "${1%%.*}.$( - x="${1#*.}" - echo "${x%%.*}" - )" -} - -version_gt() { - [[ "${1%.*}" -gt "${2%.*}" ]] || [[ "${1%.*}" -eq "${2%.*}" && "${1#*.}" -gt "${2#*.}" ]] -} -version_ge() { - [[ "${1%.*}" -gt "${2%.*}" ]] || [[ "${1%.*}" -eq "${2%.*}" && "${1#*.}" -ge "${2#*.}" ]] -} -version_lt() { - [[ "${1%.*}" -lt "${2%.*}" ]] || [[ "${1%.*}" -eq "${2%.*}" && "${1#*.}" -lt "${2#*.}" ]] -} - -check_run_command_as_root() { - [[ "${EUID:-${UID}}" == "0" ]] || return - - # Allow Azure Pipelines/GitHub Actions/Docker/Concourse/Kubernetes to do everything as root (as it's normal there) - [[ -f /.dockerenv ]] && return - [[ -f /run/.containerenv ]] && return - [[ -f /proc/1/cgroup ]] && grep -E "azpl_job|actions_job|docker|garden|kubepods" -q /proc/1/cgroup && return - - abort "Don't run this as root!" -} - -should_install_command_line_tools() { - if [[ -n "${HOMEBREW_ON_LINUX-}" ]] - then - return 1 - fi - - if version_gt "${macos_version}" "10.13" - then - ! [[ -e "/Library/Developer/CommandLineTools/usr/bin/git" ]] - else - ! [[ -e "/Library/Developer/CommandLineTools/usr/bin/git" ]] || - ! [[ -e "/usr/include/iconv.h" ]] - fi -} - -get_permission() { - "${STAT_PRINTF[@]}" "${PERMISSION_FORMAT}" "$1" -} - -user_only_chmod() { - [[ -d "$1" ]] && [[ "$(get_permission "$1")" != 75[0145] ]] -} - -exists_but_not_writable() { - [[ -e "$1" ]] && ! [[ -r "$1" && -w "$1" && -x "$1" ]] -} - -get_owner() { - "${STAT_PRINTF[@]}" "%u" "$1" -} - -file_not_owned() { - [[ "$(get_owner "$1")" != "$(id -u)" ]] -} - -get_group() { - "${STAT_PRINTF[@]}" "%g" "$1" -} - -file_not_grpowned() { - [[ " $(id -G "${USER}") " != *" $(get_group "$1") "* ]] -} - -# Please sync with 'test_ruby()' in 'Library/Homebrew/utils/ruby.sh' from the Homebrew/brew repository. -test_ruby() { - if [[ ! -x "$1" ]] - then - return 1 - fi - - "$1" --enable-frozen-string-literal --disable=gems,did_you_mean,rubyopt -rrubygems -e \ - "abort if Gem::Version.new(RUBY_VERSION.to_s.dup).to_s.split('.').first(2) != \ - Gem::Version.new('${REQUIRED_RUBY_VERSION}').to_s.split('.').first(2)" 2>/dev/null -} - -test_curl() { - if [[ ! -x "$1" ]] - then - return 1 - fi - - local curl_version_output curl_name_and_version - curl_version_output="$("$1" --version 2>/dev/null)" - curl_name_and_version="${curl_version_output%% (*}" - version_ge "$(major_minor "${curl_name_and_version##* }")" "$(major_minor "${REQUIRED_CURL_VERSION}")" -} - -test_git() { - if [[ ! -x "$1" ]] - then - return 1 - fi - - local git_version_output - git_version_output="$("$1" --version 2>/dev/null)" - if [[ "${git_version_output}" =~ "git version "([^ ]*).* ]] - then - version_ge "$(major_minor "${BASH_REMATCH[1]}")" "$(major_minor "${REQUIRED_GIT_VERSION}")" - else - abort "Unexpected Git version: '${git_version_output}'!" - fi -} - -# Search for the given executable in PATH (avoids a dependency on the `which` command) -which() { - # Alias to Bash built-in command `type -P` - type -P "$@" -} - -# Search PATH for the specified program that satisfies Homebrew requirements -# function which is set above -# shellcheck disable=SC2230 -find_tool() { - if [[ $# -ne 1 ]] - then - return 1 - fi - - local executable - while read -r executable - do - if [[ "${executable}" != /* ]] - then - warn "Ignoring ${executable} (relative paths don't work)" - elif "test_$1" "${executable}" - then - echo "${executable}" - break - fi - done < <(which -a "$1") -} - -no_usable_ruby() { - [[ -z "$(find_tool ruby)" ]] -} - -outdated_glibc() { - local glibc_version - glibc_version="$(ldd --version | head -n1 | grep -o '[0-9.]*$' | grep -o '^[0-9]\+\.[0-9]\+')" - version_lt "${glibc_version}" "${REQUIRED_GLIBC_VERSION}" -} - -if [[ -n "${HOMEBREW_ON_LINUX-}" ]] && no_usable_ruby && outdated_glibc -then - abort "$( - cat </dev/null -then - trap '/usr/bin/sudo -k' EXIT -fi - -# Things can fail later if `pwd` doesn't exist. -# Also sudo prints a warning message for no good reason -cd "/usr" || exit 1 - -####################################################################### script - -# shellcheck disable=SC2016 -ohai 'Checking for `sudo` access (which may request your password)...' - -if [[ -n "${HOMEBREW_ON_MACOS-}" ]] -then - [[ "${EUID:-${UID}}" == "0" ]] || have_sudo_access -elif ! [[ -w "${HOMEBREW_PREFIX}" ]] && - ! [[ -w "/home/linuxbrew" ]] && - ! [[ -w "/home" ]] && - ! have_sudo_access -then - abort "$( - cat </dev/null -then - abort "$( - cat </dev/null || return - - # we do it in four steps to avoid merge errors when reinstalling - execute "${USABLE_GIT}" "-c" "init.defaultBranch=master" "init" "--quiet" - - # "git remote add" will fail if the remote is defined in the global config - execute "${USABLE_GIT}" "config" "remote.origin.url" "${HOMEBREW_BREW_GIT_REMOTE}" - execute "${USABLE_GIT}" "config" "remote.origin.fetch" "+refs/heads/*:refs/remotes/origin/*" - - # ensure we don't munge line endings on checkout - execute "${USABLE_GIT}" "config" "--bool" "core.autocrlf" "false" - - # make sure symlinks are saved as-is - execute "${USABLE_GIT}" "config" "--bool" "core.symlinks" "true" - - execute "${USABLE_GIT}" "fetch" "--force" "origin" - execute "${USABLE_GIT}" "fetch" "--force" "--tags" "origin" - execute "${USABLE_GIT}" "remote" "set-head" "origin" "--auto" >/dev/null - - LATEST_GIT_TAG="$("${USABLE_GIT}" tag --list --sort="-version:refname" | head -n1)" - if [[ -z "${LATEST_GIT_TAG}" ]] - then - abort "Failed to query latest Homebrew/brew Git tag." - fi - execute "${USABLE_GIT}" "checkout" "--force" "-B" "stable" "${LATEST_GIT_TAG}" - - if [[ "${HOMEBREW_REPOSITORY}" != "${HOMEBREW_PREFIX}" ]] - then - if [[ "${HOMEBREW_REPOSITORY}" == "${HOMEBREW_PREFIX}/Homebrew" ]] - then - execute "ln" "-sf" "../Homebrew/bin/brew" "${HOMEBREW_PREFIX}/bin/brew" - else - abort "The Homebrew/brew repository should be placed in the Homebrew prefix directory." - fi - fi - - if [[ -n "${HOMEBREW_NO_INSTALL_FROM_API-}" && ! -d "${HOMEBREW_CORE}" ]] - then - # Always use single-quoted strings with `exp` expressions - # shellcheck disable=SC2016 - ohai 'Tapping homebrew/core because `$HOMEBREW_NO_INSTALL_FROM_API` is set.' - ( - execute "${MKDIR[@]}" "${HOMEBREW_CORE}" - cd "${HOMEBREW_CORE}" >/dev/null || return - - execute "${USABLE_GIT}" "-c" "init.defaultBranch=master" "init" "--quiet" - execute "${USABLE_GIT}" "config" "remote.origin.url" "${HOMEBREW_CORE_GIT_REMOTE}" - execute "${USABLE_GIT}" "config" "remote.origin.fetch" "+refs/heads/*:refs/remotes/origin/*" - execute "${USABLE_GIT}" "config" "--bool" "core.autocrlf" "false" - execute "${USABLE_GIT}" "config" "--bool" "core.symlinks" "true" - execute "${USABLE_GIT}" "fetch" "--force" "origin" "refs/heads/master:refs/remotes/origin/master" - execute "${USABLE_GIT}" "remote" "set-head" "origin" "--auto" >/dev/null - execute "${USABLE_GIT}" "reset" "--hard" "origin/master" - - cd "${HOMEBREW_REPOSITORY}" >/dev/null || return - ) || exit 1 - fi - - execute "${HOMEBREW_PREFIX}/bin/brew" "update" "--force" "--quiet" -) || exit 1 - -if [[ ":${PATH}:" != *":${HOMEBREW_PREFIX}/bin:"* ]] -then - warn "${HOMEBREW_PREFIX}/bin is not in your PATH. - Instructions on how to configure your shell for Homebrew - can be found in the 'Next steps' section below." -fi - -ohai "Installation successful!" -echo - -ring_bell - -# Use an extra newline and bold to avoid this being missed. -ohai "Homebrew has enabled anonymous aggregate formulae and cask analytics." -echo "$( - cat </dev/null || return - execute "${USABLE_GIT}" "config" "--replace-all" "homebrew.analyticsmessage" "true" - execute "${USABLE_GIT}" "config" "--replace-all" "homebrew.caskanalyticsmessage" "true" -) || exit 1 - -ohai "Next steps:" -case "${SHELL}" in - */bash*) - if [[ -n "${HOMEBREW_ON_LINUX-}" ]] - then - shell_rcfile="${HOME}/.bashrc" - else - shell_rcfile="${HOME}/.bash_profile" - fi - ;; - */zsh*) - if [[ -n "${HOMEBREW_ON_LINUX-}" ]] - then - shell_rcfile="${ZDOTDIR:-"${HOME}"}/.zshrc" - else - shell_rcfile="${ZDOTDIR:-"${HOME}"}/.zprofile" - fi - ;; - */fish*) - shell_rcfile="${HOME}/.config/fish/config.fish" - ;; - *) - shell_rcfile="${ENV:-"${HOME}/.profile"}" - ;; -esac - -if grep -qs "eval \"\$(${HOMEBREW_PREFIX}/bin/brew shellenv)\"" "${shell_rcfile}" -then - if ! [[ -x "$(command -v brew)" ]] - then - cat <> ${shell_rcfile} - eval "\$(${HOMEBREW_PREFIX}/bin/brew shellenv)" -EOS -fi - -if [[ -n "${non_default_repos}" ]] -then - plural="" - if [[ "${#additional_shellenv_commands[@]}" -gt 1 ]] - then - plural="s" - fi - printf -- "- Run these commands in your terminal to add the non-default Git remote%s for %s:\n" "${plural}" "${non_default_repos}" - printf " echo '# Set PATH, MANPATH, etc., for Homebrew.' >> %s\n" "${shell_rcfile}" - printf " echo '%s' >> ${shell_rcfile}\n" "${additional_shellenv_commands[@]}" - printf " %s\n" "${additional_shellenv_commands[@]}" -fi - -if [[ -n "${HOMEBREW_ON_LINUX-}" ]] -then - echo "- Install Homebrew's dependencies if you have sudo access:" - - if [[ -x "$(command -v apt-get)" ]] - then - echo " sudo apt-get install build-essential" - elif [[ -x "$(command -v yum)" ]] - then - echo " sudo yum groupinstall 'Development Tools'" - elif [[ -x "$(command -v pacman)" ]] - then - echo " sudo pacman -S base-devel" - elif [[ -x "$(command -v apk)" ]] - then - echo " sudo apk add build-base" - fi - - cat < /dev/null -apt-get update -apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin \ No newline at end of file diff --git a/electron/store.js b/electron/store.js deleted file mode 100644 index eafd9428a..000000000 --- a/electron/store.js +++ /dev/null @@ -1,35 +0,0 @@ -const Store = require('electron-store'); -// set schema to validate store data -const schema = { - isInitialFunded: { type: 'boolean', default: false }, // TODO: reconsider this default, can be problematic if user has already funded prior to implementation - firstStakingRewardAchieved: { type: 'boolean', default: false }, - firstRewardNotificationShown: { type: 'boolean', default: false }, - agentEvictionAlertShown: { type: 'boolean', default: false }, - - environmentName: { type: 'string', default: '' }, - currentStakingProgram: { type: 'string', default: '' }, -}; - -/** - * Sets up the IPC communication and initializes the Electron store with default values and schema. - * @param {Electron.IpcMain} ipcMain - The IPC channel for communication. - * @param {Electron.BrowserWindow} mainWindow - The main Electron browser window. - * @returns {Promise} - A promise that resolves once the store is set up. - */ -const setupStoreIpc = async (ipcMain, mainWindow) => { - const store = new Store({ schema }); - - store.onDidAnyChange((data) => { - if (mainWindow?.webContents) - mainWindow.webContents.send('store-changed', data); - }); - - // exposed to electron browser window - ipcMain.handle('store', () => store.store); - ipcMain.handle('store-get', (_, key) => store.get(key)); - ipcMain.handle('store-set', (_, key, value) => store.set(key, value)); - ipcMain.handle('store-delete', (_, key) => store.delete(key)); - ipcMain.handle('store-clear', (_) => store.clear()); -}; - -module.exports = { setupStoreIpc }; diff --git a/electron/update.js b/electron/update.js deleted file mode 100644 index 3946655a3..000000000 --- a/electron/update.js +++ /dev/null @@ -1,16 +0,0 @@ -const { publishOptions } = require('./constants'); -const electronUpdater = require('electron-updater'); -const logger = require('./logger'); - -const macUpdater = new electronUpdater.MacUpdater({ - ...publishOptions, - channels: ['latest', 'beta', 'alpha'], // automatically update to all channels -}); - -macUpdater.setFeedURL({ ...publishOptions }); - -macUpdater.autoDownload = true; -macUpdater.autoInstallOnAppQuit = true; -macUpdater.logger = logger; - -module.exports = { macUpdater }; diff --git a/frontend/.eslintrc.json b/frontend/.eslintrc.json deleted file mode 100644 index 46cd97cea..000000000 --- a/frontend/.eslintrc.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:jest/recommended", - "next/core-web-vitals", - "plugin:prettier/recommended" - ], - "globals": { - "JSX": true, - "React": true - }, - "plugins": [ - "jest", - "prettier", - "unused-imports", - "simple-import-sort", - "import" - ], - "rules": { - "import/first": "error", - "import/newline-after-import": "error", - "import/no-duplicates": "error", - "simple-import-sort/imports": "error", - "simple-import-sort/exports": "error", - "unused-imports/no-unused-imports": "error", - "no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }], - "no-console": ["error", { "allow": ["error"] }], - "prettier/prettier": ["error", { - "endOfLine": "auto", - "semi": true, - "singleQuote": true - }], - "react/jsx-props-no-spreading": "off", - "react/no-array-index-key": "off", - "react/react-in-jsx-scope": "off", - "react-hooks/rules-of-hooks": "error", - "react-hooks/exhaustive-deps": "warn" - } -} \ No newline at end of file diff --git a/frontend/abis/agentMech.ts b/frontend/abis/agentMech.ts deleted file mode 100644 index 9f4e71e2f..000000000 --- a/frontend/abis/agentMech.ts +++ /dev/null @@ -1,339 +0,0 @@ -export const AGENT_MECH_ABI = [ - { - inputs: [ - { internalType: 'address', name: '_token', type: 'address' }, - { internalType: 'uint256', name: '_tokenId', type: 'uint256' }, - { internalType: 'uint256', name: '_price', type: 'uint256' }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - inputs: [{ internalType: 'uint256', name: 'agentId', type: 'uint256' }], - name: 'AgentNotFound', - type: 'error', - }, - { - inputs: [ - { internalType: 'uint256', name: 'provided', type: 'uint256' }, - { internalType: 'uint256', name: 'expected', type: 'uint256' }, - ], - name: 'NotEnoughPaid', - type: 'error', - }, - { - inputs: [ - { internalType: 'uint256', name: 'provided', type: 'uint256' }, - { internalType: 'uint256', name: 'max', type: 'uint256' }, - ], - name: 'Overflow', - type: 'error', - }, - { - inputs: [{ internalType: 'uint256', name: 'requestId', type: 'uint256' }], - name: 'RequestIdNotFound', - type: 'error', - }, - { inputs: [], name: 'ZeroAddress', type: 'error' }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'requestId', - type: 'uint256', - }, - { indexed: false, internalType: 'bytes', name: 'data', type: 'bytes' }, - ], - name: 'Deliver', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'price', - type: 'uint256', - }, - ], - name: 'PriceUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'requestId', - type: 'uint256', - }, - { indexed: false, internalType: 'bytes', name: 'data', type: 'bytes' }, - ], - name: 'Request', - type: 'event', - }, - { - inputs: [ - { internalType: 'uint256', name: 'requestId', type: 'uint256' }, - { internalType: 'bytes', name: 'data', type: 'bytes' }, - ], - name: 'deliver', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'entryPoint', - outputs: [ - { internalType: 'contract IEntryPoint', name: '', type: 'address' }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'to', type: 'address' }, - { internalType: 'uint256', name: 'value', type: 'uint256' }, - { internalType: 'bytes', name: 'data', type: 'bytes' }, - { internalType: 'enum Enum.Operation', name: 'operation', type: 'uint8' }, - { internalType: 'uint256', name: 'txGas', type: 'uint256' }, - ], - name: 'exec', - outputs: [{ internalType: 'bytes', name: 'returnData', type: 'bytes' }], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'account', type: 'address' }, - { internalType: 'bytes', name: 'data', type: 'bytes' }, - ], - name: 'getRequestId', - outputs: [{ internalType: 'uint256', name: 'requestId', type: 'uint256' }], - stateMutability: 'pure', - type: 'function', - }, - { - inputs: [{ internalType: 'address', name: 'account', type: 'address' }], - name: 'getRequestsCount', - outputs: [ - { internalType: 'uint256', name: 'requestsCount', type: 'uint256' }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'uint256', name: 'size', type: 'uint256' }, - { internalType: 'uint256', name: 'offset', type: 'uint256' }, - ], - name: 'getUndeliveredRequestIds', - outputs: [ - { internalType: 'uint256[]', name: 'requestIds', type: 'uint256[]' }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'address', name: 'signer', type: 'address' }], - name: 'isOperator', - outputs: [{ internalType: 'bool', name: '', type: 'bool' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'bytes32', name: 'hash', type: 'bytes32' }, - { internalType: 'bytes', name: 'signature', type: 'bytes' }, - ], - name: 'isValidSignature', - outputs: [{ internalType: 'bytes4', name: 'magicValue', type: 'bytes4' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'uint256', name: '', type: 'uint256' }, - { internalType: 'uint256', name: '', type: 'uint256' }, - ], - name: 'mapRequestIds', - outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'address', name: '', type: 'address' }], - name: 'mapRequestsCounts', - outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'nonce', - outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'numUndeliveredRequests', - outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: '', type: 'address' }, - { internalType: 'address', name: '', type: 'address' }, - { internalType: 'uint256[]', name: '', type: 'uint256[]' }, - { internalType: 'uint256[]', name: '', type: 'uint256[]' }, - { internalType: 'bytes', name: '', type: 'bytes' }, - ], - name: 'onERC1155BatchReceived', - outputs: [{ internalType: 'bytes4', name: '', type: 'bytes4' }], - stateMutability: 'pure', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: '', type: 'address' }, - { internalType: 'address', name: '', type: 'address' }, - { internalType: 'uint256', name: '', type: 'uint256' }, - { internalType: 'uint256', name: '', type: 'uint256' }, - { internalType: 'bytes', name: '', type: 'bytes' }, - ], - name: 'onERC1155Received', - outputs: [{ internalType: 'bytes4', name: '', type: 'bytes4' }], - stateMutability: 'pure', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: '', type: 'address' }, - { internalType: 'address', name: '', type: 'address' }, - { internalType: 'uint256', name: '', type: 'uint256' }, - { internalType: 'bytes', name: '', type: 'bytes' }, - ], - name: 'onERC721Received', - outputs: [{ internalType: 'bytes4', name: '', type: 'bytes4' }], - stateMutability: 'pure', - type: 'function', - }, - { - inputs: [], - name: 'price', - outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'bytes', name: 'data', type: 'bytes' }], - name: 'request', - outputs: [{ internalType: 'uint256', name: 'requestId', type: 'uint256' }], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [{ internalType: 'uint256', name: 'newPrice', type: 'uint256' }], - name: 'setPrice', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [{ internalType: 'bytes', name: 'initParams', type: 'bytes' }], - name: 'setUp', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'token', - outputs: [{ internalType: 'contract IERC721', name: '', type: 'address' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'tokenId', - outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: '', type: 'address' }, - { internalType: 'address', name: '', type: 'address' }, - { internalType: 'address', name: '', type: 'address' }, - { internalType: 'uint256', name: '', type: 'uint256' }, - { internalType: 'bytes', name: '', type: 'bytes' }, - { internalType: 'bytes', name: '', type: 'bytes' }, - ], - name: 'tokensReceived', - outputs: [], - stateMutability: 'pure', - type: 'function', - }, - { - inputs: [ - { - components: [ - { internalType: 'address', name: 'sender', type: 'address' }, - { internalType: 'uint256', name: 'nonce', type: 'uint256' }, - { internalType: 'bytes', name: 'initCode', type: 'bytes' }, - { internalType: 'bytes', name: 'callData', type: 'bytes' }, - { internalType: 'uint256', name: 'callGasLimit', type: 'uint256' }, - { - internalType: 'uint256', - name: 'verificationGasLimit', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'preVerificationGas', - type: 'uint256', - }, - { internalType: 'uint256', name: 'maxFeePerGas', type: 'uint256' }, - { - internalType: 'uint256', - name: 'maxPriorityFeePerGas', - type: 'uint256', - }, - { internalType: 'bytes', name: 'paymasterAndData', type: 'bytes' }, - { internalType: 'bytes', name: 'signature', type: 'bytes' }, - ], - internalType: 'struct UserOperation', - name: 'userOp', - type: 'tuple', - }, - { internalType: 'bytes32', name: 'userOpHash', type: 'bytes32' }, - { internalType: 'uint256', name: 'missingAccountFunds', type: 'uint256' }, - ], - name: 'validateUserOp', - outputs: [ - { internalType: 'uint256', name: 'validationData', type: 'uint256' }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { stateMutability: 'payable', type: 'receive' }, -]; diff --git a/frontend/abis/erc20.ts b/frontend/abis/erc20.ts deleted file mode 100644 index e581ffc4f..000000000 --- a/frontend/abis/erc20.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const ERC20_BALANCEOF_FRAGMENT = [ - 'function balanceOf(address owner) view returns (uint256)', -]; diff --git a/frontend/abis/gnosisSafe.ts b/frontend/abis/gnosisSafe.ts deleted file mode 100644 index cd4d7a454..000000000 --- a/frontend/abis/gnosisSafe.ts +++ /dev/null @@ -1,573 +0,0 @@ -export const GNOSIS_SAFE_ABI = [ - { inputs: [], stateMutability: 'nonpayable', type: 'constructor' }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'AddedOwner', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'approvedHash', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'ApproveHash', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'handler', - type: 'address', - }, - ], - name: 'ChangedFallbackHandler', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'guard', - type: 'address', - }, - ], - name: 'ChangedGuard', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'threshold', - type: 'uint256', - }, - ], - name: 'ChangedThreshold', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'module', - type: 'address', - }, - ], - name: 'DisabledModule', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'module', - type: 'address', - }, - ], - name: 'EnabledModule', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'bytes32', - name: 'txHash', - type: 'bytes32', - }, - { - indexed: false, - internalType: 'uint256', - name: 'payment', - type: 'uint256', - }, - ], - name: 'ExecutionFailure', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'module', - type: 'address', - }, - ], - name: 'ExecutionFromModuleFailure', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'module', - type: 'address', - }, - ], - name: 'ExecutionFromModuleSuccess', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'bytes32', - name: 'txHash', - type: 'bytes32', - }, - { - indexed: false, - internalType: 'uint256', - name: 'payment', - type: 'uint256', - }, - ], - name: 'ExecutionSuccess', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'RemovedOwner', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'SafeReceived', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'initiator', - type: 'address', - }, - { - indexed: false, - internalType: 'address[]', - name: 'owners', - type: 'address[]', - }, - { - indexed: false, - internalType: 'uint256', - name: 'threshold', - type: 'uint256', - }, - { - indexed: false, - internalType: 'address', - name: 'initializer', - type: 'address', - }, - { - indexed: false, - internalType: 'address', - name: 'fallbackHandler', - type: 'address', - }, - ], - name: 'SafeSetup', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'msgHash', - type: 'bytes32', - }, - ], - name: 'SignMsg', - type: 'event', - }, - { stateMutability: 'nonpayable', type: 'fallback' }, - { - inputs: [], - name: 'VERSION', - outputs: [{ internalType: 'string', name: '', type: 'string' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'owner', type: 'address' }, - { internalType: 'uint256', name: '_threshold', type: 'uint256' }, - ], - name: 'addOwnerWithThreshold', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { internalType: 'bytes32', name: 'hashToApprove', type: 'bytes32' }, - ], - name: 'approveHash', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: '', type: 'address' }, - { internalType: 'bytes32', name: '', type: 'bytes32' }, - ], - name: 'approvedHashes', - outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'uint256', name: '_threshold', type: 'uint256' }], - name: 'changeThreshold', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { internalType: 'bytes32', name: 'dataHash', type: 'bytes32' }, - { internalType: 'bytes', name: 'data', type: 'bytes' }, - { internalType: 'bytes', name: 'signatures', type: 'bytes' }, - { internalType: 'uint256', name: 'requiredSignatures', type: 'uint256' }, - ], - name: 'checkNSignatures', - outputs: [], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'bytes32', name: 'dataHash', type: 'bytes32' }, - { internalType: 'bytes', name: 'data', type: 'bytes' }, - { internalType: 'bytes', name: 'signatures', type: 'bytes' }, - ], - name: 'checkSignatures', - outputs: [], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'prevModule', type: 'address' }, - { internalType: 'address', name: 'module', type: 'address' }, - ], - name: 'disableModule', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'domainSeparator', - outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'address', name: 'module', type: 'address' }], - name: 'enableModule', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'to', type: 'address' }, - { internalType: 'uint256', name: 'value', type: 'uint256' }, - { internalType: 'bytes', name: 'data', type: 'bytes' }, - { internalType: 'enum Enum.Operation', name: 'operation', type: 'uint8' }, - { internalType: 'uint256', name: 'safeTxGas', type: 'uint256' }, - { internalType: 'uint256', name: 'baseGas', type: 'uint256' }, - { internalType: 'uint256', name: 'gasPrice', type: 'uint256' }, - { internalType: 'address', name: 'gasToken', type: 'address' }, - { internalType: 'address', name: 'refundReceiver', type: 'address' }, - { internalType: 'uint256', name: '_nonce', type: 'uint256' }, - ], - name: 'encodeTransactionData', - outputs: [{ internalType: 'bytes', name: '', type: 'bytes' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'to', type: 'address' }, - { internalType: 'uint256', name: 'value', type: 'uint256' }, - { internalType: 'bytes', name: 'data', type: 'bytes' }, - { internalType: 'enum Enum.Operation', name: 'operation', type: 'uint8' }, - { internalType: 'uint256', name: 'safeTxGas', type: 'uint256' }, - { internalType: 'uint256', name: 'baseGas', type: 'uint256' }, - { internalType: 'uint256', name: 'gasPrice', type: 'uint256' }, - { internalType: 'address', name: 'gasToken', type: 'address' }, - { - internalType: 'address payable', - name: 'refundReceiver', - type: 'address', - }, - { internalType: 'bytes', name: 'signatures', type: 'bytes' }, - ], - name: 'execTransaction', - outputs: [{ internalType: 'bool', name: 'success', type: 'bool' }], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'to', type: 'address' }, - { internalType: 'uint256', name: 'value', type: 'uint256' }, - { internalType: 'bytes', name: 'data', type: 'bytes' }, - { internalType: 'enum Enum.Operation', name: 'operation', type: 'uint8' }, - ], - name: 'execTransactionFromModule', - outputs: [{ internalType: 'bool', name: 'success', type: 'bool' }], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'to', type: 'address' }, - { internalType: 'uint256', name: 'value', type: 'uint256' }, - { internalType: 'bytes', name: 'data', type: 'bytes' }, - { internalType: 'enum Enum.Operation', name: 'operation', type: 'uint8' }, - ], - name: 'execTransactionFromModuleReturnData', - outputs: [ - { internalType: 'bool', name: 'success', type: 'bool' }, - { internalType: 'bytes', name: 'returnData', type: 'bytes' }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'getChainId', - outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'start', type: 'address' }, - { internalType: 'uint256', name: 'pageSize', type: 'uint256' }, - ], - name: 'getModulesPaginated', - outputs: [ - { internalType: 'address[]', name: 'array', type: 'address[]' }, - { internalType: 'address', name: 'next', type: 'address' }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getOwners', - outputs: [{ internalType: 'address[]', name: '', type: 'address[]' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'uint256', name: 'offset', type: 'uint256' }, - { internalType: 'uint256', name: 'length', type: 'uint256' }, - ], - name: 'getStorageAt', - outputs: [{ internalType: 'bytes', name: '', type: 'bytes' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getThreshold', - outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'to', type: 'address' }, - { internalType: 'uint256', name: 'value', type: 'uint256' }, - { internalType: 'bytes', name: 'data', type: 'bytes' }, - { internalType: 'enum Enum.Operation', name: 'operation', type: 'uint8' }, - { internalType: 'uint256', name: 'safeTxGas', type: 'uint256' }, - { internalType: 'uint256', name: 'baseGas', type: 'uint256' }, - { internalType: 'uint256', name: 'gasPrice', type: 'uint256' }, - { internalType: 'address', name: 'gasToken', type: 'address' }, - { internalType: 'address', name: 'refundReceiver', type: 'address' }, - { internalType: 'uint256', name: '_nonce', type: 'uint256' }, - ], - name: 'getTransactionHash', - outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'address', name: 'module', type: 'address' }], - name: 'isModuleEnabled', - outputs: [{ internalType: 'bool', name: '', type: 'bool' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'address', name: 'owner', type: 'address' }], - name: 'isOwner', - outputs: [{ internalType: 'bool', name: '', type: 'bool' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'nonce', - outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'prevOwner', type: 'address' }, - { internalType: 'address', name: 'owner', type: 'address' }, - { internalType: 'uint256', name: '_threshold', type: 'uint256' }, - ], - name: 'removeOwner', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'to', type: 'address' }, - { internalType: 'uint256', name: 'value', type: 'uint256' }, - { internalType: 'bytes', name: 'data', type: 'bytes' }, - { internalType: 'enum Enum.Operation', name: 'operation', type: 'uint8' }, - ], - name: 'requiredTxGas', - outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [{ internalType: 'address', name: 'handler', type: 'address' }], - name: 'setFallbackHandler', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [{ internalType: 'address', name: 'guard', type: 'address' }], - name: 'setGuard', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { internalType: 'address[]', name: '_owners', type: 'address[]' }, - { internalType: 'uint256', name: '_threshold', type: 'uint256' }, - { internalType: 'address', name: 'to', type: 'address' }, - { internalType: 'bytes', name: 'data', type: 'bytes' }, - { internalType: 'address', name: 'fallbackHandler', type: 'address' }, - { internalType: 'address', name: 'paymentToken', type: 'address' }, - { internalType: 'uint256', name: 'payment', type: 'uint256' }, - { - internalType: 'address payable', - name: 'paymentReceiver', - type: 'address', - }, - ], - name: 'setup', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }], - name: 'signedMessages', - outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'targetContract', type: 'address' }, - { internalType: 'bytes', name: 'calldataPayload', type: 'bytes' }, - ], - name: 'simulateAndRevert', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'prevOwner', type: 'address' }, - { internalType: 'address', name: 'oldOwner', type: 'address' }, - { internalType: 'address', name: 'newOwner', type: 'address' }, - ], - name: 'swapOwner', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { stateMutability: 'payable', type: 'receive' }, -]; diff --git a/frontend/abis/mechActivityChecker.ts b/frontend/abis/mechActivityChecker.ts deleted file mode 100644 index 125ee5ed6..000000000 --- a/frontend/abis/mechActivityChecker.ts +++ /dev/null @@ -1,44 +0,0 @@ -export const MECH_ACTIVITY_CHECKER_ABI = [ - { - inputs: [ - { internalType: 'address', name: '_agentMech', type: 'address' }, - { internalType: 'uint256', name: '_livenessRatio', type: 'uint256' }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { inputs: [], name: 'ZeroMechAgentAddress', type: 'error' }, - { inputs: [], name: 'ZeroValue', type: 'error' }, - { - inputs: [], - name: 'agentMech', - outputs: [{ internalType: 'address', name: '', type: 'address' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'address', name: 'multisig', type: 'address' }], - name: 'getMultisigNonces', - outputs: [{ internalType: 'uint256[]', name: 'nonces', type: 'uint256[]' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'uint256[]', name: 'curNonces', type: 'uint256[]' }, - { internalType: 'uint256[]', name: 'lastNonces', type: 'uint256[]' }, - { internalType: 'uint256', name: 'ts', type: 'uint256' }, - ], - name: 'isRatioPass', - outputs: [{ internalType: 'bool', name: 'ratioPass', type: 'bool' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'livenessRatio', - outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - stateMutability: 'view', - type: 'function', - }, -]; diff --git a/frontend/abis/multicall3.ts b/frontend/abis/multicall3.ts deleted file mode 100644 index 36a756aae..000000000 --- a/frontend/abis/multicall3.ts +++ /dev/null @@ -1,440 +0,0 @@ -export const MULTICALL3_ABI = [ - { - inputs: [ - { - components: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - { - internalType: 'bytes', - name: 'callData', - type: 'bytes', - }, - ], - internalType: 'struct Multicall3.Call[]', - name: 'calls', - type: 'tuple[]', - }, - ], - name: 'aggregate', - outputs: [ - { - internalType: 'uint256', - name: 'blockNumber', - type: 'uint256', - }, - { - internalType: 'bytes[]', - name: 'returnData', - type: 'bytes[]', - }, - ], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [ - { - components: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - { - internalType: 'bool', - name: 'allowFailure', - type: 'bool', - }, - { - internalType: 'bytes', - name: 'callData', - type: 'bytes', - }, - ], - internalType: 'struct Multicall3.Call3[]', - name: 'calls', - type: 'tuple[]', - }, - ], - name: 'aggregate3', - outputs: [ - { - components: [ - { - internalType: 'bool', - name: 'success', - type: 'bool', - }, - { - internalType: 'bytes', - name: 'returnData', - type: 'bytes', - }, - ], - internalType: 'struct Multicall3.Result[]', - name: 'returnData', - type: 'tuple[]', - }, - ], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [ - { - components: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - { - internalType: 'bool', - name: 'allowFailure', - type: 'bool', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - internalType: 'bytes', - name: 'callData', - type: 'bytes', - }, - ], - internalType: 'struct Multicall3.Call3Value[]', - name: 'calls', - type: 'tuple[]', - }, - ], - name: 'aggregate3Value', - outputs: [ - { - components: [ - { - internalType: 'bool', - name: 'success', - type: 'bool', - }, - { - internalType: 'bytes', - name: 'returnData', - type: 'bytes', - }, - ], - internalType: 'struct Multicall3.Result[]', - name: 'returnData', - type: 'tuple[]', - }, - ], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [ - { - components: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - { - internalType: 'bytes', - name: 'callData', - type: 'bytes', - }, - ], - internalType: 'struct Multicall3.Call[]', - name: 'calls', - type: 'tuple[]', - }, - ], - name: 'blockAndAggregate', - outputs: [ - { - internalType: 'uint256', - name: 'blockNumber', - type: 'uint256', - }, - { - internalType: 'bytes32', - name: 'blockHash', - type: 'bytes32', - }, - { - components: [ - { - internalType: 'bool', - name: 'success', - type: 'bool', - }, - { - internalType: 'bytes', - name: 'returnData', - type: 'bytes', - }, - ], - internalType: 'struct Multicall3.Result[]', - name: 'returnData', - type: 'tuple[]', - }, - ], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [], - name: 'getBasefee', - outputs: [ - { - internalType: 'uint256', - name: 'basefee', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'blockNumber', - type: 'uint256', - }, - ], - name: 'getBlockHash', - outputs: [ - { - internalType: 'bytes32', - name: 'blockHash', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getBlockNumber', - outputs: [ - { - internalType: 'uint256', - name: 'blockNumber', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getChainId', - outputs: [ - { - internalType: 'uint256', - name: 'chainid', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getCurrentBlockCoinbase', - outputs: [ - { - internalType: 'address', - name: 'coinbase', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getCurrentBlockDifficulty', - outputs: [ - { - internalType: 'uint256', - name: 'difficulty', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getCurrentBlockGasLimit', - outputs: [ - { - internalType: 'uint256', - name: 'gaslimit', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getCurrentBlockTimestamp', - outputs: [ - { - internalType: 'uint256', - name: 'timestamp', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'addr', - type: 'address', - }, - ], - name: 'getEthBalance', - outputs: [ - { - internalType: 'uint256', - name: 'balance', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getLastBlockHash', - outputs: [ - { - internalType: 'bytes32', - name: 'blockHash', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bool', - name: 'requireSuccess', - type: 'bool', - }, - { - components: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - { - internalType: 'bytes', - name: 'callData', - type: 'bytes', - }, - ], - internalType: 'struct Multicall3.Call[]', - name: 'calls', - type: 'tuple[]', - }, - ], - name: 'tryAggregate', - outputs: [ - { - components: [ - { - internalType: 'bool', - name: 'success', - type: 'bool', - }, - { - internalType: 'bytes', - name: 'returnData', - type: 'bytes', - }, - ], - internalType: 'struct Multicall3.Result[]', - name: 'returnData', - type: 'tuple[]', - }, - ], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bool', - name: 'requireSuccess', - type: 'bool', - }, - { - components: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - { - internalType: 'bytes', - name: 'callData', - type: 'bytes', - }, - ], - internalType: 'struct Multicall3.Call[]', - name: 'calls', - type: 'tuple[]', - }, - ], - name: 'tryBlockAndAggregate', - outputs: [ - { - internalType: 'uint256', - name: 'blockNumber', - type: 'uint256', - }, - { - internalType: 'bytes32', - name: 'blockHash', - type: 'bytes32', - }, - { - components: [ - { - internalType: 'bool', - name: 'success', - type: 'bool', - }, - { - internalType: 'bytes', - name: 'returnData', - type: 'bytes', - }, - ], - internalType: 'struct Multicall3.Result[]', - name: 'returnData', - type: 'tuple[]', - }, - ], - stateMutability: 'payable', - type: 'function', - }, -]; diff --git a/frontend/abis/serviceRegistryL2.ts b/frontend/abis/serviceRegistryL2.ts deleted file mode 100644 index b9465e7fe..000000000 --- a/frontend/abis/serviceRegistryL2.ts +++ /dev/null @@ -1,1009 +0,0 @@ -export const SERVICE_REGISTRY_L2_ABI = [ - { - inputs: [ - { internalType: 'string', name: '_name', type: 'string' }, - { internalType: 'string', name: '_symbol', type: 'string' }, - { internalType: 'string', name: '_baseURI', type: 'string' }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - inputs: [{ internalType: 'address', name: 'operator', type: 'address' }], - name: 'AgentInstanceRegistered', - type: 'error', - }, - { - inputs: [{ internalType: 'uint256', name: 'serviceId', type: 'uint256' }], - name: 'AgentInstancesSlotsFilled', - type: 'error', - }, - { - inputs: [{ internalType: 'uint256', name: 'agentId', type: 'uint256' }], - name: 'AgentNotFound', - type: 'error', - }, - { - inputs: [ - { internalType: 'uint256', name: 'agentId', type: 'uint256' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'AgentNotInService', - type: 'error', - }, - { - inputs: [{ internalType: 'uint256', name: 'componentId', type: 'uint256' }], - name: 'ComponentNotFound', - type: 'error', - }, - { inputs: [], name: 'HashExists', type: 'error' }, - { - inputs: [ - { internalType: 'uint256', name: 'sent', type: 'uint256' }, - { internalType: 'uint256', name: 'expected', type: 'uint256' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'IncorrectAgentBondingValue', - type: 'error', - }, - { - inputs: [ - { internalType: 'uint256', name: 'sent', type: 'uint256' }, - { internalType: 'uint256', name: 'expected', type: 'uint256' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'IncorrectRegistrationDepositValue', - type: 'error', - }, - { - inputs: [ - { internalType: 'address', name: 'sender', type: 'address' }, - { internalType: 'address', name: 'manager', type: 'address' }, - ], - name: 'ManagerOnly', - type: 'error', - }, - { - inputs: [ - { internalType: 'address', name: 'provided', type: 'address' }, - { internalType: 'address', name: 'expected', type: 'address' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'OnlyOwnServiceMultisig', - type: 'error', - }, - { - inputs: [ - { internalType: 'address', name: 'operator', type: 'address' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'OperatorHasNoInstances', - type: 'error', - }, - { - inputs: [ - { internalType: 'uint256', name: 'provided', type: 'uint256' }, - { internalType: 'uint256', name: 'max', type: 'uint256' }, - ], - name: 'Overflow', - type: 'error', - }, - { - inputs: [ - { internalType: 'address', name: 'sender', type: 'address' }, - { internalType: 'address', name: 'owner', type: 'address' }, - ], - name: 'OwnerOnly', - type: 'error', - }, - { inputs: [], name: 'Paused', type: 'error' }, - { inputs: [], name: 'ReentrancyGuard', type: 'error' }, - { - inputs: [{ internalType: 'uint256', name: 'serviceId', type: 'uint256' }], - name: 'ServiceMustBeInactive', - type: 'error', - }, - { - inputs: [ - { internalType: 'address', name: 'token', type: 'address' }, - { internalType: 'address', name: 'from', type: 'address' }, - { internalType: 'address', name: 'to', type: 'address' }, - { internalType: 'uint256', name: 'value', type: 'uint256' }, - ], - name: 'TransferFailed', - type: 'error', - }, - { - inputs: [{ internalType: 'address', name: 'multisig', type: 'address' }], - name: 'UnauthorizedMultisig', - type: 'error', - }, - { - inputs: [{ internalType: 'uint256', name: 'agentId', type: 'uint256' }], - name: 'WrongAgentId', - type: 'error', - }, - { - inputs: [ - { internalType: 'uint256', name: 'numValues1', type: 'uint256' }, - { internalType: 'uint256', name: 'numValues2', type: 'uint256' }, - ], - name: 'WrongArrayLength', - type: 'error', - }, - { - inputs: [{ internalType: 'uint256', name: 'serviceId', type: 'uint256' }], - name: 'WrongOperator', - type: 'error', - }, - { - inputs: [ - { internalType: 'uint256', name: 'state', type: 'uint256' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'WrongServiceState', - type: 'error', - }, - { - inputs: [ - { internalType: 'uint256', name: 'currentThreshold', type: 'uint256' }, - { internalType: 'uint256', name: 'minThreshold', type: 'uint256' }, - { internalType: 'uint256', name: 'maxThreshold', type: 'uint256' }, - ], - name: 'WrongThreshold', - type: 'error', - }, - { inputs: [], name: 'ZeroAddress', type: 'error' }, - { inputs: [], name: 'ZeroValue', type: 'error' }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - ], - name: 'ActivateRegistration', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { indexed: true, internalType: 'uint256', name: 'id', 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: false, - internalType: 'string', - name: 'baseURI', - type: 'string', - }, - ], - name: 'BaseURIChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'multisig', - type: 'address', - }, - ], - name: 'CreateMultisigWithAgents', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - { - indexed: false, - internalType: 'bytes32', - name: 'configHash', - type: 'bytes32', - }, - ], - name: 'CreateService', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - ], - name: 'DeployService', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Deposit', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'drainer', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Drain', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'drainer', - type: 'address', - }, - ], - name: 'DrainerUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'manager', - type: 'address', - }, - ], - name: 'ManagerUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'operator', - type: 'address', - }, - { - indexed: true, - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - ], - name: 'OperatorSlashed', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'operator', - type: 'address', - }, - { - indexed: true, - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - ], - name: 'OperatorUnbond', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'OwnerUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'receiver', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Refund', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'operator', - type: 'address', - }, - { - indexed: true, - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'agentInstance', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'agentId', - type: 'uint256', - }, - ], - name: 'RegisterInstance', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - ], - name: 'TerminateService', - 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: 'id', type: 'uint256' }, - ], - name: 'Transfer', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - { - indexed: false, - internalType: 'bytes32', - name: 'configHash', - type: 'bytes32', - }, - ], - name: 'UpdateService', - type: 'event', - }, - { - inputs: [], - name: 'CID_PREFIX', - outputs: [{ internalType: 'string', name: '', type: 'string' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'VERSION', - outputs: [{ internalType: 'string', name: '', type: 'string' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'serviceOwner', type: 'address' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'activateRegistration', - outputs: [{ internalType: 'bool', name: 'success', type: 'bool' }], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'spender', type: 'address' }, - { internalType: 'uint256', name: 'id', 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: [], - name: 'baseURI', - outputs: [{ internalType: 'string', name: '', type: 'string' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'address', name: 'newDrainer', type: 'address' }], - name: 'changeDrainer', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [{ internalType: 'address', name: 'newManager', type: 'address' }], - name: 'changeManager', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'multisig', type: 'address' }, - { internalType: 'bool', name: 'permission', type: 'bool' }, - ], - name: 'changeMultisigPermission', - outputs: [{ internalType: 'bool', name: 'success', type: 'bool' }], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [{ internalType: 'address', name: 'newOwner', type: 'address' }], - name: 'changeOwner', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'serviceOwner', type: 'address' }, - { internalType: 'bytes32', name: 'configHash', type: 'bytes32' }, - { internalType: 'uint32[]', name: 'agentIds', type: 'uint32[]' }, - { - components: [ - { internalType: 'uint32', name: 'slots', type: 'uint32' }, - { internalType: 'uint96', name: 'bond', type: 'uint96' }, - ], - internalType: 'struct AgentParams[]', - name: 'agentParams', - type: 'tuple[]', - }, - { internalType: 'uint32', name: 'threshold', type: 'uint32' }, - ], - name: 'create', - outputs: [{ internalType: 'uint256', name: 'serviceId', type: 'uint256' }], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'serviceOwner', type: 'address' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - { - internalType: 'address', - name: 'multisigImplementation', - type: 'address', - }, - { internalType: 'bytes', name: 'data', type: 'bytes' }, - ], - name: 'deploy', - outputs: [{ internalType: 'address', name: 'multisig', type: 'address' }], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'drain', - outputs: [{ internalType: 'uint256', name: 'amount', type: 'uint256' }], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'drainer', - outputs: [{ internalType: 'address', name: '', type: 'address' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'uint256', name: 'unitId', type: 'uint256' }], - name: 'exists', - outputs: [{ internalType: 'bool', name: '', type: 'bool' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'uint256', name: 'serviceId', type: 'uint256' }], - name: 'getAgentInstances', - outputs: [ - { internalType: 'uint256', name: 'numAgentInstances', type: 'uint256' }, - { internalType: 'address[]', name: 'agentInstances', type: 'address[]' }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'uint256', name: 'serviceId', type: 'uint256' }], - name: 'getAgentParams', - outputs: [ - { internalType: 'uint256', name: 'numAgentIds', type: 'uint256' }, - { - components: [ - { internalType: 'uint32', name: 'slots', type: 'uint32' }, - { internalType: 'uint96', name: 'bond', type: 'uint96' }, - ], - internalType: 'struct AgentParams[]', - name: 'agentParams', - type: 'tuple[]', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - name: 'getApproved', - outputs: [{ internalType: 'address', name: '', type: 'address' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - { internalType: 'uint256', name: 'agentId', type: 'uint256' }, - ], - name: 'getInstancesForAgentId', - outputs: [ - { internalType: 'uint256', name: 'numAgentInstances', type: 'uint256' }, - { internalType: 'address[]', name: 'agentInstances', type: 'address[]' }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'operator', type: 'address' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'getOperatorBalance', - outputs: [{ internalType: 'uint256', name: 'balance', type: 'uint256' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'uint256', name: 'serviceId', type: 'uint256' }], - name: 'getPreviousHashes', - outputs: [ - { internalType: 'uint256', name: 'numHashes', type: 'uint256' }, - { internalType: 'bytes32[]', name: 'configHashes', type: 'bytes32[]' }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'uint256', name: 'serviceId', type: 'uint256' }], - name: 'getService', - outputs: [ - { - components: [ - { internalType: 'uint96', name: 'securityDeposit', type: 'uint96' }, - { internalType: 'address', name: 'multisig', type: 'address' }, - { internalType: 'bytes32', name: 'configHash', type: 'bytes32' }, - { internalType: 'uint32', name: 'threshold', type: 'uint32' }, - { - internalType: 'uint32', - name: 'maxNumAgentInstances', - type: 'uint32', - }, - { internalType: 'uint32', name: 'numAgentInstances', type: 'uint32' }, - { - internalType: 'enum ServiceRegistryL2.ServiceState', - name: 'state', - type: 'uint8', - }, - { internalType: 'uint32[]', name: 'agentIds', type: 'uint32[]' }, - ], - internalType: 'struct ServiceRegistryL2.Service', - name: 'service', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: '', type: 'address' }, - { internalType: 'address', name: '', type: 'address' }, - ], - name: 'isApprovedForAll', - outputs: [{ internalType: 'bool', name: '', type: 'bool' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'manager', - outputs: [{ internalType: 'address', name: '', type: 'address' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'address', name: '', type: 'address' }], - name: 'mapAgentInstanceOperators', - outputs: [{ internalType: 'address', name: '', type: 'address' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'uint256', name: '', type: 'uint256' }, - { internalType: 'uint256', name: '', type: 'uint256' }, - ], - name: 'mapConfigHashes', - outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'address', name: '', type: 'address' }], - name: 'mapMultisigs', - outputs: [{ internalType: 'bool', name: '', type: 'bool' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'uint256', name: '', type: 'uint256' }, - { internalType: 'uint256', name: '', type: 'uint256' }, - ], - name: 'mapOperatorAndServiceIdAgentInstances', - outputs: [ - { internalType: 'address', name: 'instance', type: 'address' }, - { internalType: 'uint32', name: 'agentId', type: 'uint32' }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - name: 'mapOperatorAndServiceIdOperatorBalances', - outputs: [{ internalType: 'uint96', name: '', type: 'uint96' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'uint256', name: '', type: 'uint256' }, - { internalType: 'uint256', name: '', type: 'uint256' }, - ], - name: 'mapServiceAndAgentIdAgentInstances', - outputs: [{ internalType: 'address', name: '', type: 'address' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - name: 'mapServiceAndAgentIdAgentParams', - outputs: [ - { internalType: 'uint32', name: 'slots', type: 'uint32' }, - { internalType: 'uint96', name: 'bond', type: 'uint96' }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - name: 'mapServices', - outputs: [ - { internalType: 'uint96', name: 'securityDeposit', type: 'uint96' }, - { internalType: 'address', name: 'multisig', type: 'address' }, - { internalType: 'bytes32', name: 'configHash', type: 'bytes32' }, - { internalType: 'uint32', name: 'threshold', type: 'uint32' }, - { internalType: 'uint32', name: 'maxNumAgentInstances', type: 'uint32' }, - { internalType: 'uint32', name: 'numAgentInstances', type: 'uint32' }, - { - internalType: 'enum ServiceRegistryL2.ServiceState', - name: 'state', - type: 'uint8', - }, - ], - 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: 'id', type: 'uint256' }], - name: 'ownerOf', - outputs: [{ internalType: 'address', name: 'owner', type: 'address' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'operator', type: 'address' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - { internalType: 'address[]', name: 'agentInstances', type: 'address[]' }, - { internalType: 'uint32[]', name: 'agentIds', type: 'uint32[]' }, - ], - name: 'registerAgents', - outputs: [{ internalType: 'bool', name: 'success', type: 'bool' }], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'from', type: 'address' }, - { internalType: 'address', name: 'to', type: 'address' }, - { internalType: 'uint256', name: 'id', 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: 'id', 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: 'bURI', type: 'string' }], - name: 'setBaseURI', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { internalType: 'address[]', name: 'agentInstances', type: 'address[]' }, - { internalType: 'uint96[]', name: 'amounts', type: 'uint96[]' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'slash', - outputs: [{ internalType: 'bool', name: 'success', type: 'bool' }], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'slashedFunds', - outputs: [{ internalType: 'uint96', name: '', type: 'uint96' }], - stateMutability: 'view', - 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: 'address', name: 'serviceOwner', type: 'address' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'terminate', - outputs: [ - { internalType: 'bool', name: 'success', type: 'bool' }, - { internalType: 'uint256', name: 'refund', type: 'uint256' }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [{ internalType: 'uint256', name: 'id', type: 'uint256' }], - name: 'tokenByIndex', - outputs: [{ internalType: 'uint256', name: 'unitId', type: 'uint256' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'uint256', name: 'unitId', 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: 'id', type: 'uint256' }, - ], - name: 'transferFrom', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'operator', type: 'address' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'unbond', - outputs: [ - { internalType: 'bool', name: 'success', type: 'bool' }, - { internalType: 'uint256', name: 'refund', type: 'uint256' }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'serviceOwner', type: 'address' }, - { internalType: 'bytes32', name: 'configHash', type: 'bytes32' }, - { internalType: 'uint32[]', name: 'agentIds', type: 'uint32[]' }, - { - components: [ - { internalType: 'uint32', name: 'slots', type: 'uint32' }, - { internalType: 'uint96', name: 'bond', type: 'uint96' }, - ], - internalType: 'struct AgentParams[]', - name: 'agentParams', - type: 'tuple[]', - }, - { internalType: 'uint32', name: 'threshold', type: 'uint32' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'update', - outputs: [{ internalType: 'bool', name: 'success', type: 'bool' }], - stateMutability: 'nonpayable', - type: 'function', - }, -]; diff --git a/frontend/abis/serviceRegistryTokenUtility.ts b/frontend/abis/serviceRegistryTokenUtility.ts deleted file mode 100644 index be730e53c..000000000 --- a/frontend/abis/serviceRegistryTokenUtility.ts +++ /dev/null @@ -1,481 +0,0 @@ -export const SERVICE_REGISTRY_TOKEN_UTILITY_ABI = [ - { - inputs: [ - { internalType: 'address', name: '_serviceRegistry', type: 'address' }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - inputs: [{ internalType: 'address', name: 'operator', type: 'address' }], - name: 'AgentInstanceRegistered', - type: 'error', - }, - { - inputs: [{ internalType: 'uint256', name: 'serviceId', type: 'uint256' }], - name: 'AgentInstancesSlotsFilled', - type: 'error', - }, - { - inputs: [{ internalType: 'uint256', name: 'agentId', type: 'uint256' }], - name: 'AgentNotFound', - type: 'error', - }, - { - inputs: [ - { internalType: 'uint256', name: 'agentId', type: 'uint256' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'AgentNotInService', - type: 'error', - }, - { - inputs: [{ internalType: 'uint256', name: 'componentId', type: 'uint256' }], - name: 'ComponentNotFound', - type: 'error', - }, - { inputs: [], name: 'HashExists', type: 'error' }, - { - inputs: [ - { internalType: 'uint256', name: 'sent', type: 'uint256' }, - { internalType: 'uint256', name: 'expected', type: 'uint256' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'IncorrectAgentBondingValue', - type: 'error', - }, - { - inputs: [ - { internalType: 'uint256', name: 'sent', type: 'uint256' }, - { internalType: 'uint256', name: 'expected', type: 'uint256' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'IncorrectRegistrationDepositValue', - type: 'error', - }, - { - inputs: [ - { internalType: 'address', name: 'sender', type: 'address' }, - { internalType: 'address', name: 'manager', type: 'address' }, - ], - name: 'ManagerOnly', - type: 'error', - }, - { - inputs: [ - { internalType: 'address', name: 'provided', type: 'address' }, - { internalType: 'address', name: 'expected', type: 'address' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'OnlyOwnServiceMultisig', - type: 'error', - }, - { - inputs: [ - { internalType: 'address', name: 'operator', type: 'address' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'OperatorHasNoInstances', - type: 'error', - }, - { - inputs: [ - { internalType: 'uint256', name: 'provided', type: 'uint256' }, - { internalType: 'uint256', name: 'max', type: 'uint256' }, - ], - name: 'Overflow', - type: 'error', - }, - { - inputs: [ - { internalType: 'address', name: 'sender', type: 'address' }, - { internalType: 'address', name: 'owner', type: 'address' }, - ], - name: 'OwnerOnly', - type: 'error', - }, - { inputs: [], name: 'Paused', type: 'error' }, - { inputs: [], name: 'ReentrancyGuard', type: 'error' }, - { - inputs: [{ internalType: 'uint256', name: 'serviceId', type: 'uint256' }], - name: 'ServiceMustBeInactive', - type: 'error', - }, - { - inputs: [{ internalType: 'address', name: 'token', type: 'address' }], - name: 'TokenRejected', - type: 'error', - }, - { - inputs: [ - { internalType: 'address', name: 'token', type: 'address' }, - { internalType: 'address', name: 'from', type: 'address' }, - { internalType: 'address', name: 'to', type: 'address' }, - { internalType: 'uint256', name: 'value', type: 'uint256' }, - ], - name: 'TransferFailed', - type: 'error', - }, - { - inputs: [{ internalType: 'address', name: 'multisig', type: 'address' }], - name: 'UnauthorizedMultisig', - type: 'error', - }, - { - inputs: [{ internalType: 'uint256', name: 'agentId', type: 'uint256' }], - name: 'WrongAgentId', - type: 'error', - }, - { - inputs: [ - { internalType: 'uint256', name: 'numValues1', type: 'uint256' }, - { internalType: 'uint256', name: 'numValues2', type: 'uint256' }, - ], - name: 'WrongArrayLength', - type: 'error', - }, - { - inputs: [{ internalType: 'uint256', name: 'serviceId', type: 'uint256' }], - name: 'WrongOperator', - type: 'error', - }, - { - inputs: [ - { internalType: 'uint256', name: 'state', type: 'uint256' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'WrongServiceState', - type: 'error', - }, - { - inputs: [ - { internalType: 'uint256', name: 'currentThreshold', type: 'uint256' }, - { internalType: 'uint256', name: 'minThreshold', type: 'uint256' }, - { internalType: 'uint256', name: 'maxThreshold', type: 'uint256' }, - ], - name: 'WrongThreshold', - type: 'error', - }, - { inputs: [], name: 'ZeroAddress', type: 'error' }, - { inputs: [], name: 'ZeroValue', type: 'error' }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'drainer', - type: 'address', - }, - ], - name: 'DrainerUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'manager', - type: 'address', - }, - ], - name: 'ManagerUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'operator', - type: 'address', - }, - { - indexed: true, - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - ], - name: 'OperatorTokenSlashed', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'OwnerUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'account', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'token', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'TokenDeposit', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'drainer', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'token', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'TokenDrain', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'account', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'token', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'TokenRefund', - type: 'event', - }, - { - inputs: [{ internalType: 'uint256', name: 'serviceId', type: 'uint256' }], - name: 'activateRegistrationTokenDeposit', - outputs: [{ internalType: 'bool', name: 'isTokenSecured', type: 'bool' }], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [{ internalType: 'address', name: 'newDrainer', type: 'address' }], - name: 'changeDrainer', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [{ internalType: 'address', name: 'newManager', type: 'address' }], - name: 'changeManager', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [{ internalType: 'address', name: 'newOwner', type: 'address' }], - name: 'changeOwner', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - { internalType: 'address', name: 'token', type: 'address' }, - { internalType: 'uint32[]', name: 'agentIds', type: 'uint32[]' }, - { internalType: 'uint256[]', name: 'bonds', type: 'uint256[]' }, - ], - name: 'createWithToken', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [{ internalType: 'address', name: 'token', type: 'address' }], - name: 'drain', - outputs: [{ internalType: 'uint256', name: 'amount', type: 'uint256' }], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'drainer', - outputs: [{ internalType: 'address', name: '', type: 'address' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - { internalType: 'uint256', name: 'agentId', type: 'uint256' }, - ], - name: 'getAgentBond', - outputs: [{ internalType: 'uint256', name: 'bond', type: 'uint256' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'operator', type: 'address' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'getOperatorBalance', - outputs: [{ internalType: 'uint256', name: 'balance', type: 'uint256' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'uint256', name: 'serviceId', type: 'uint256' }], - name: 'isTokenSecuredService', - outputs: [{ internalType: 'bool', name: '', type: 'bool' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'manager', - outputs: [{ internalType: 'address', name: '', type: 'address' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - name: 'mapOperatorAndServiceIdOperatorBalances', - outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - name: 'mapServiceAndAgentIdAgentBond', - outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - name: 'mapServiceIdTokenDeposit', - outputs: [ - { internalType: 'address', name: 'token', type: 'address' }, - { internalType: 'uint96', name: 'securityDeposit', type: 'uint96' }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [{ internalType: 'address', name: '', type: 'address' }], - name: 'mapSlashedFunds', - outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'owner', - outputs: [{ internalType: 'address', name: '', type: 'address' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'operator', type: 'address' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - { internalType: 'uint32[]', name: 'agentIds', type: 'uint32[]' }, - ], - name: 'registerAgentsTokenDeposit', - outputs: [{ internalType: 'bool', name: 'isTokenSecured', type: 'bool' }], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [{ internalType: 'uint256', name: 'serviceId', type: 'uint256' }], - name: 'resetServiceToken', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'serviceRegistry', - outputs: [{ internalType: 'address', name: '', type: 'address' }], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { internalType: 'address[]', name: 'agentInstances', type: 'address[]' }, - { internalType: 'uint256[]', name: 'amounts', type: 'uint256[]' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'slash', - outputs: [{ internalType: 'bool', name: 'success', type: 'bool' }], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [{ internalType: 'uint256', name: 'serviceId', type: 'uint256' }], - name: 'terminateTokenRefund', - outputs: [ - { internalType: 'uint256', name: 'securityRefund', type: 'uint256' }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { internalType: 'address', name: 'operator', type: 'address' }, - { internalType: 'uint256', name: 'serviceId', type: 'uint256' }, - ], - name: 'unbondTokenRefund', - outputs: [{ internalType: 'uint256', name: 'refund', type: 'uint256' }], - stateMutability: 'nonpayable', - type: 'function', - }, -]; diff --git a/frontend/abis/serviceStakingTokenMechUsage.ts b/frontend/abis/serviceStakingTokenMechUsage.ts deleted file mode 100644 index 0f1a270da..000000000 --- a/frontend/abis/serviceStakingTokenMechUsage.ts +++ /dev/null @@ -1,1265 +0,0 @@ -export const SERVICE_STAKING_TOKEN_MECH_USAGE_ABI = [ - { - inputs: [], - name: 'AlreadyInitialized', - type: 'error', - }, - { - inputs: [ - { - internalType: 'address', - name: 'activityChecker', - type: 'address', - }, - ], - name: 'ContractOnly', - type: 'error', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'provided', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'expected', - type: 'uint256', - }, - ], - name: 'LowerThan', - type: 'error', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'maxNumServices', - type: 'uint256', - }, - ], - name: 'MaxNumServicesReached', - type: 'error', - }, - { - inputs: [], - name: 'NoRewardsAvailable', - type: 'error', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'tsProvided', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'tsExpected', - type: 'uint256', - }, - ], - name: 'NotEnoughTimeStaked', - type: 'error', - }, - { - inputs: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'OwnerOnly', - type: 'error', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - ], - name: 'ServiceNotUnstaked', - type: 'error', - }, - { - inputs: [ - { - internalType: 'address', - name: 'token', - type: 'address', - }, - { - internalType: 'address', - name: 'from', - type: 'address', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'TokenTransferFailed', - type: 'error', - }, - { - inputs: [ - { - internalType: 'address', - name: 'multisig', - type: 'address', - }, - ], - name: 'UnauthorizedMultisig', - type: 'error', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'provided', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'expected', - type: 'uint256', - }, - ], - name: 'ValueLowerThan', - type: 'error', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'agentId', - type: 'uint256', - }, - ], - name: 'WrongAgentId', - type: 'error', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - ], - name: 'WrongServiceConfiguration', - type: 'error', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'state', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - ], - name: 'WrongServiceState', - type: 'error', - }, - { - inputs: [ - { - internalType: 'address', - name: 'expected', - type: 'address', - }, - { - internalType: 'address', - name: 'provided', - type: 'address', - }, - ], - name: 'WrongStakingToken', - type: 'error', - }, - { - inputs: [], - name: 'ZeroAddress', - type: 'error', - }, - { - inputs: [], - name: 'ZeroTokenAddress', - type: 'error', - }, - { - inputs: [], - name: 'ZeroValue', - type: 'error', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'availableRewards', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256[]', - name: 'serviceIds', - type: 'uint256[]', - }, - { - indexed: false, - internalType: 'uint256[]', - name: 'rewards', - type: 'uint256[]', - }, - { - indexed: false, - internalType: 'uint256', - name: 'epochLength', - type: 'uint256', - }, - ], - name: 'Checkpoint', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'balance', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'availableRewards', - type: 'uint256', - }, - ], - name: 'Deposit', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - indexed: true, - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'multisig', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256[]', - name: 'nonces', - type: 'uint256[]', - }, - { - indexed: false, - internalType: 'uint256', - name: 'reward', - type: 'uint256', - }, - ], - name: 'RewardClaimed', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - indexed: true, - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'serviceInactivity', - type: 'uint256', - }, - ], - name: 'ServiceInactivityWarning', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - indexed: true, - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'multisig', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256[]', - name: 'nonces', - type: 'uint256[]', - }, - ], - name: 'ServiceStaked', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - indexed: true, - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'multisig', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256[]', - name: 'nonces', - type: 'uint256[]', - }, - { - indexed: false, - internalType: 'uint256', - name: 'reward', - type: 'uint256', - }, - ], - name: 'ServiceUnstaked', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256[]', - name: 'serviceIds', - type: 'uint256[]', - }, - { - indexed: false, - internalType: 'address[]', - name: 'owners', - type: 'address[]', - }, - { - indexed: false, - internalType: 'address[]', - name: 'multisigs', - type: 'address[]', - }, - { - indexed: false, - internalType: 'uint256[]', - name: 'serviceInactivity', - type: 'uint256[]', - }, - ], - name: 'ServicesEvicted', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Withdraw', - type: 'event', - }, - { - inputs: [], - name: 'VERSION', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'activityChecker', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'agentIds', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'availableRewards', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'balance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - ], - name: 'calculateStakingLastReward', - outputs: [ - { - internalType: 'uint256', - name: 'reward', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - ], - name: 'calculateStakingReward', - outputs: [ - { - internalType: 'uint256', - name: 'reward', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'checkpoint', - outputs: [ - { - internalType: 'uint256[]', - name: '', - type: 'uint256[]', - }, - { - internalType: 'uint256[][]', - name: '', - type: 'uint256[][]', - }, - { - internalType: 'uint256[]', - name: '', - type: 'uint256[]', - }, - { - internalType: 'uint256[]', - name: '', - type: 'uint256[]', - }, - { - internalType: 'uint256[]', - name: 'evictServiceIds', - type: 'uint256[]', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - ], - name: 'checkpointAndClaim', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - ], - name: 'claim', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'configHash', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'deposit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'emissionsAmount', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'epochCounter', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getAgentIds', - outputs: [ - { - internalType: 'uint256[]', - name: '', - type: 'uint256[]', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getNextRewardCheckpointTimestamp', - outputs: [ - { - internalType: 'uint256', - name: 'tsNext', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getServiceIds', - outputs: [ - { - internalType: 'uint256[]', - name: '', - type: 'uint256[]', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - ], - name: 'getServiceInfo', - outputs: [ - { - components: [ - { - internalType: 'address', - name: 'multisig', - type: 'address', - }, - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'uint256[]', - name: 'nonces', - type: 'uint256[]', - }, - { - internalType: 'uint256', - name: 'tsStart', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'reward', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'inactivity', - type: 'uint256', - }, - ], - internalType: 'struct ServiceInfo', - name: 'sInfo', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - ], - name: 'getStakingState', - outputs: [ - { - internalType: 'enum StakingBase.StakingState', - name: 'stakingState', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - components: [ - { - internalType: 'bytes32', - name: 'metadataHash', - type: 'bytes32', - }, - { - internalType: 'uint256', - name: 'maxNumServices', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'rewardsPerSecond', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'minStakingDeposit', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'minNumStakingPeriods', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'maxNumInactivityPeriods', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'livenessPeriod', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'timeForEmissions', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'numAgentInstances', - type: 'uint256', - }, - { - internalType: 'uint256[]', - name: 'agentIds', - type: 'uint256[]', - }, - { - internalType: 'uint256', - name: 'threshold', - type: 'uint256', - }, - { - internalType: 'bytes32', - name: 'configHash', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 'proxyHash', - type: 'bytes32', - }, - { - internalType: 'address', - name: 'serviceRegistry', - type: 'address', - }, - { - internalType: 'address', - name: 'activityChecker', - type: 'address', - }, - ], - internalType: 'struct StakingBase.StakingParams', - name: '_stakingParams', - type: 'tuple', - }, - { - internalType: 'address', - name: '_serviceRegistryTokenUtility', - type: 'address', - }, - { - internalType: 'address', - name: '_stakingToken', - type: 'address', - }, - ], - name: 'initialize', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'livenessPeriod', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'mapServiceInfo', - outputs: [ - { - internalType: 'address', - name: 'multisig', - type: 'address', - }, - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'uint256', - name: 'tsStart', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'reward', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'inactivity', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'maxInactivityDuration', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'maxNumInactivityPeriods', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'maxNumServices', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'metadataHash', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'minStakingDeposit', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'minStakingDuration', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'numAgentInstances', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - { - internalType: 'address', - name: '', - type: 'address', - }, - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - { - internalType: 'bytes', - name: '', - type: 'bytes', - }, - ], - name: 'onERC721Received', - outputs: [ - { - internalType: 'bytes4', - name: '', - type: 'bytes4', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'proxyHash', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'rewardsPerSecond', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'serviceRegistry', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'serviceRegistryTokenUtility', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'setServiceIds', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - ], - name: 'stake', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'stakingToken', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'threshold', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'timeForEmissions', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'tsCheckpoint', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'serviceId', - type: 'uint256', - }, - ], - name: 'unstake', - outputs: [ - { - internalType: 'uint256', - name: 'reward', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, -]; diff --git a/frontend/client/enums.ts b/frontend/client/enums.ts deleted file mode 100644 index 1a9b492f0..000000000 --- a/frontend/client/enums.ts +++ /dev/null @@ -1,35 +0,0 @@ -export enum Action { - STATUS = 0, - BUILD = 1, - DEPLOY = 2, - STOP = 3, -} - -export enum Chain { - ETHEREUM = 0, - GOERLI = 1, - GNOSIS = 2, - SOLANA = 3, -} - -export enum Ledger { - ETHEREUM = 0, - SOLANA = 1, -} - -export enum DeploymentStatus { - CREATED = 0, - BUILT = 1, - DEPLOYING = 2, - DEPLOYED = 3, - STOPPING = 4, - STOPPED = 5, - DELETED = 6, -} - -export enum AccountIsSetup { - True, - False, - Loading, - Error, -} diff --git a/frontend/client/index.ts b/frontend/client/index.ts deleted file mode 100644 index 968a28671..000000000 --- a/frontend/client/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './enums'; -export * from './types'; diff --git a/frontend/client/types.ts b/frontend/client/types.ts deleted file mode 100644 index fc5d7fe72..000000000 --- a/frontend/client/types.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { StakingProgram } from '@/enums/StakingProgram'; -import { Address } from '@/types/Address'; - -import { Chain, DeploymentStatus, Ledger } from './enums'; - -export type ServiceHash = string; - -export type LedgerConfig = { - rpc: string; - type: Ledger; - chain: Chain; -}; - -export type ServiceKeys = { - address: Address; - private_key: string; - ledger: Chain; -}; - -export type ChainData = { - instances?: Address[]; - token?: number; - multisig?: Address; - on_chain_state: number; - staked: boolean; - user_params: { - cost_of_bond: number; - fund_requirements: { - agent: number; - safe: number; - }; - nft: string; - staking_program_id: StakingProgram; - threshold: number; - use_staking: true; - }; -}; - -export type Service = { - name: string; - hash: string; - keys: ServiceKeys[]; - readme?: string; - chain_configs: { - [chainId: number]: { - ledger_config: LedgerConfig; - chain_data: ChainData; - }; - }; -}; - -export type ServiceTemplate = { - name: string; - hash: string; - image: string; - description: string; - service_version: string; - home_chain_id: string; - configurations: { [key: string]: ConfigurationTemplate }; - deploy?: boolean; -}; - -export type ConfigurationTemplate = { - rpc?: string; // added on deployment - staking_program_id?: StakingProgram; // added on deployment - nft: string; - agent_id: number; - threshold: number; - use_staking: boolean; - cost_of_bond: number; - monthly_gas_estimate: number; - fund_requirements: FundRequirementsTemplate; -}; - -export type FundRequirementsTemplate = { - agent: number; - safe: number; -}; - -export type DeployedNodes = { - agent: string[]; - tendermint: string[]; -}; - -export type Deployment = { - status: DeploymentStatus; - nodes: DeployedNodes; -}; - -export type EmptyPayload = Record; - -export type EmptyResponse = Record; - -export type HttpResponse = { - error?: string; - data?: string; -}; - -export type ClientResponse = { - error?: string; - data?: ResponseType; -}; - -export type StopDeployment = { - delete: boolean /* Delete deployment*/; -}; - -export type UpdateServicePayload = { - old: ServiceHash; - new: ServiceTemplate; -}; - -export type DeleteServicesPayload = { - hashes: ServiceHash[]; -}; - -export type DeleteServicesResponse = { - hashes: ServiceHash[]; -}; - -export type AppInfo = { - account?: { - key: Address; - }; -}; - -export type WalletResponse = { - address: Address; - safe_chains: Chain[]; - ledger_type: Ledger; - safe: Address; - safe_nonce: number; -}; - -export type Wallet = WalletResponse & { - ethBalance?: number; - olasBalance?: number; -}; diff --git a/frontend/components/Alert/AlertTitle.tsx b/frontend/components/Alert/AlertTitle.tsx deleted file mode 100644 index 5afecb32f..000000000 --- a/frontend/components/Alert/AlertTitle.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { Typography } from 'antd'; - -export const AlertTitle = ({ children }: { children: React.ReactNode }) => ( - {children} -); diff --git a/frontend/components/Alert/index.tsx b/frontend/components/Alert/index.tsx deleted file mode 100644 index 5a0222108..000000000 --- a/frontend/components/Alert/index.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { - ExclamationCircleOutlined, - InfoCircleOutlined, - WarningOutlined, -} from '@ant-design/icons'; -import { Alert as AlertAntd, AlertProps } from 'antd'; - -type AlertType = 'primary' | 'info' | 'warning' | 'error'; - -const icons = { - primary: , - info: , - warning: , - error: , -}; - -export const CustomAlert = ({ - type, - fullWidth, - ...rest -}: { type: AlertType; fullWidth?: boolean } & Omit) => ( - -); diff --git a/frontend/components/Card/CardTitle.tsx b/frontend/components/Card/CardTitle.tsx deleted file mode 100644 index 41b35c231..000000000 --- a/frontend/components/Card/CardTitle.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { Flex, Typography } from 'antd'; -import { ReactNode } from 'react'; - -export const CardTitle = ({ title }: { title: string | ReactNode }) => ( - - - {title} - - -); diff --git a/frontend/components/Confetti/ConfettiAnimation.jsx b/frontend/components/Confetti/ConfettiAnimation.jsx deleted file mode 100644 index 9e02463ff..000000000 --- a/frontend/components/Confetti/ConfettiAnimation.jsx +++ /dev/null @@ -1,43 +0,0 @@ -import { useCallback, useRef } from 'react'; -import ReactCanvasConfetti from 'react-canvas-confetti'; -import { useInterval } from 'usehooks-ts'; - -const canvasStyles = { - position: 'fixed', - pointerEvents: 'none', - width: '100%', - height: '100%', - top: 0, - left: 0, -}; - -export const ConfettiAnimation = () => { - const animationInstance = useRef(null); - - const makeShot = useCallback((particleRatio, opts) => { - if (!animationInstance.current) return; - - animationInstance.current({ - ...opts, - origin: { y: 0.45 }, - particleCount: Math.floor(200 * particleRatio), - }); - }, []); - - const fire = useCallback(() => { - makeShot(0.25, { spread: 26, startVelocity: 55 }); - makeShot(0.2, { spread: 60 }); - makeShot(0.35, { spread: 80, decay: 0.91, scalar: 0.8 }); - makeShot(0.1, { spread: 100, startVelocity: 25, decay: 0.92, scalar: 1.2 }); - makeShot(0.1, { spread: 100, startVelocity: 45 }); - }, [makeShot]); - - const getInstance = useCallback((instance) => { - animationInstance.current = instance; - }, []); - - // Fire confetti every 2.5 seconds - useInterval(() => fire(), 2500); - - return ; -}; diff --git a/frontend/components/HelpAndSupportPage/index.tsx b/frontend/components/HelpAndSupportPage/index.tsx deleted file mode 100644 index 1aec818ac..000000000 --- a/frontend/components/HelpAndSupportPage/index.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import { CloseOutlined, QuestionCircleOutlined } from '@ant-design/icons'; -import { Button, Card, Flex, message, Typography } from 'antd'; -import { useCallback, useEffect, useState } from 'react'; - -import { UNICODE_SYMBOLS } from '@/constants/symbols'; -import { FAQ_URL, SUPPORT_URL } from '@/constants/urls'; -import { Pages } from '@/enums/PageState'; -import { useElectronApi } from '@/hooks/useElectronApi'; -import { useLogs } from '@/hooks/useLogs'; -import { usePageState } from '@/hooks/usePageState'; - -import { CardTitle } from '../Card/CardTitle'; -import { CardSection } from '../styled/CardSection'; - -const { Title, Paragraph } = Typography; - -const SettingsTitle = () => ( - - - Help & support - - } - /> -); - -const LogsSavedMessage = ({ onClick }: { onClick: () => void }) => { - return ( - - Logs saved - - - ); -}; - -export const HelpAndSupport = () => { - const { goto } = usePageState(); - const { openPath, saveLogs } = useElectronApi(); - - const logs = useLogs(); - - const [isLoading, setIsLoading] = useState(false); - const [canSaveLogs, setCanSaveLogs] = useState(false); - - const onSaveLogs = useCallback(() => setCanSaveLogs(true), []); - - useEffect(() => { - if (canSaveLogs && logs && !isLoading) { - setIsLoading(true); - saveLogs?.(logs) - .then((result) => { - if (result.success) { - message.success({ - content: ( - openPath?.(result.dirPath)} /> - ), - duration: 10, - }); - } else { - message.error('Save logs failed or cancelled'); - } - }) - .finally(() => { - setIsLoading(false); - setCanSaveLogs(false); - }); - } - }, [canSaveLogs, isLoading, logs, openPath, saveLogs]); - - return ( - } - bordered={false} - extra={ - - - - ); -}; diff --git a/frontend/components/Layout/TopBar.tsx b/frontend/components/Layout/TopBar.tsx deleted file mode 100644 index ddaf17016..000000000 --- a/frontend/components/Layout/TopBar.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import { Typography } from 'antd'; -import styled from 'styled-components'; - -import { COLOR } from '@/constants/colors'; -import { useElectronApi } from '@/hooks/useElectronApi'; -import { useStore } from '@/hooks/useStore'; - -const { Text } = Typography; - -const TrafficLightIcon = styled.div` - width: 12px; - height: 12px; - border-radius: 50%; - margin-left: 8px; - -webkit-app-region: no-drag; -`; - -const RedLight = styled(TrafficLightIcon)` - background-color: #fe5f57; -`; - -const YellowLight = styled(TrafficLightIcon)` - background-color: #febc2e; -`; - -const DisabledLight = styled(TrafficLightIcon)` - background-color: #ddd; -`; - -const TrafficLights = styled.div` - display: flex; - align-items: center; - margin-right: 24px; - -webkit-app-region: no-drag; -`; - -const TopBarContainer = styled.div` - position: sticky; - top: 0; - z-index: 1; - display: flex; - align-items: center; - padding: 10px 8px; - border-radius: 8px 8px 0 0px; - border-bottom: 1px solid ${COLOR.BORDER_GRAY}; - background: ${COLOR.WHITE}; - -webkit-app-region: drag; -`; - -export const TopBar = () => { - const electronApi = useElectronApi(); - const store = useStore(); - const envName = store?.storeState?.environmentName; - - return ( - - - electronApi?.closeApp?.()} /> - electronApi?.minimizeApp?.()} /> - - - - {`Pearl (alpha) ${envName ? `(${envName})` : ''}`.trim()} - - ); -}; diff --git a/frontend/components/Layout/index.tsx b/frontend/components/Layout/index.tsx deleted file mode 100644 index 42d6f1fdf..000000000 --- a/frontend/components/Layout/index.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import { WifiOutlined } from '@ant-design/icons'; -import { message } from 'antd'; -import { PropsWithChildren, useContext, useEffect } from 'react'; -import styled, { css } from 'styled-components'; - -import { COLOR } from '@/constants/colors'; -import { OnlineStatusContext } from '@/context/OnlineStatusProvider'; - -import { TopBar } from './TopBar'; - -const Container = styled.div<{ blur: 'true' | 'false' }>` - background-color: ${COLOR.WHITE}; - border-radius: 8px; - - ${(props) => - props.blur === 'true' && - css` - filter: blur(2px); - position: relative; - overflow: hidden; - - &::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(27, 38, 50, 0.1); - z-index: 1; - } - `} -`; - -export const Layout = ({ - children, -}: PropsWithChildren & { vertical?: boolean }) => { - const { isOnline } = useContext(OnlineStatusContext); - - useEffect(() => { - let messageKey; - if (!isOnline) { - messageKey = message.error({ - content: 'Network connection is unstable', - duration: 0, - icon: , - }); - } else { - message.destroy(messageKey); - } - }, [isOnline]); - - return ( - - - {children} - - ); -}; diff --git a/frontend/components/MainPage/MainHeader/FirstRunModal.tsx b/frontend/components/MainPage/MainHeader/FirstRunModal.tsx deleted file mode 100644 index 73f017d70..000000000 --- a/frontend/components/MainPage/MainHeader/FirstRunModal.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { Button, Flex, Modal, Typography } from 'antd'; -import Image from 'next/image'; -import { FC } from 'react'; - -import { useServiceTemplates } from '@/hooks/useServiceTemplates'; -import { getMinimumStakedAmountRequired } from '@/utils/service'; - -type FirstRunModalProps = { open: boolean; onClose: () => void }; - -export const FirstRunModal: FC = ({ open, onClose }) => { - const { getServiceTemplates } = useServiceTemplates(); - - if (!open) return null; - - const minimumStakedAmountRequired = getMinimumStakedAmountRequired( - getServiceTemplates()[0], - ); - - return ( - - Got it - , - ]} - > - - OLAS logo - - - {`Your agent is running and you've staked ${minimumStakedAmountRequired} OLAS!`} - - - Your agent is working towards earning rewards. - - - Pearl is designed to make it easy for you to earn staking rewards every - day. Simply leave the app and agent running in the background for ~1hr a - day. - - - ); -}; diff --git a/frontend/components/MainPage/header/AgentButton.tsx b/frontend/components/MainPage/header/AgentButton.tsx deleted file mode 100644 index 6fcdbdea0..000000000 --- a/frontend/components/MainPage/header/AgentButton.tsx +++ /dev/null @@ -1,304 +0,0 @@ -import { InfoCircleOutlined } from '@ant-design/icons'; -import { Button, ButtonProps, Flex, Popover, Typography } from 'antd'; -import { useCallback, useMemo } from 'react'; - -import { Chain, DeploymentStatus } from '@/client'; -import { COLOR } from '@/constants/colors'; -import { StakingProgram } from '@/enums/StakingProgram'; -import { useBalance } from '@/hooks/useBalance'; -import { useElectronApi } from '@/hooks/useElectronApi'; -import { useServices } from '@/hooks/useServices'; -import { useServiceTemplates } from '@/hooks/useServiceTemplates'; -import { useStakingContractInfo } from '@/hooks/useStakingContractInfo'; -import { useStakingProgram } from '@/hooks/useStakingProgram'; -import { useStore } from '@/hooks/useStore'; -import { useWallet } from '@/hooks/useWallet'; -import { ServicesService } from '@/service/Services'; -import { WalletService } from '@/service/Wallet'; -import { getMinimumStakedAmountRequired } from '@/utils/service'; - -import { - CannotStartAgentDueToUnexpectedError, - CannotStartAgentPopover, -} from './CannotStartAgentPopover'; -import { requiredGas } from './constants'; - -const { Text } = Typography; - -const LOADING_MESSAGE = - "Starting the agent may take a while, so feel free to minimize the app. We'll notify you once it's running. Please, don't quit the app."; - -const AgentStartingButton = () => ( - - - - - {LOADING_MESSAGE} - - } - > - - -); - -const AgentStoppingButton = () => ( - -); - -const AgentRunningButton = () => { - const { showNotification } = useElectronApi(); - const { service, setIsServicePollingPaused, setServiceStatus } = - useServices(); - - const handlePause = useCallback(async () => { - if (!service) return; - // Paused to stop overlapping service poll while waiting for response - setIsServicePollingPaused(true); - - // Optimistically update service status - setServiceStatus(DeploymentStatus.STOPPING); - try { - await ServicesService.stopDeployment(service.hash); - } catch (error) { - console.error(error); - showNotification?.('Error while stopping agent'); - } finally { - // Resume polling, will update to correct status regardless of success - setIsServicePollingPaused(false); - } - }, [service, setIsServicePollingPaused, setServiceStatus, showNotification]); - - return ( - - - - Agent is working - - - ); -}; - -const AgentNotRunningButton = () => { - const { wallets, masterSafeAddress } = useWallet(); - const { - service, - serviceStatus, - setServiceStatus, - setIsServicePollingPaused, - } = useServices(); - const { serviceTemplate } = useServiceTemplates(); - const { showNotification } = useElectronApi(); - const { - setIsPaused: setIsBalancePollingPaused, - safeBalance, - isLowBalance, - totalOlasStakedBalance, - totalEthBalance, - } = useBalance(); - const { storeState } = useStore(); - const { isEligibleForStaking, isAgentEvicted } = useStakingContractInfo(); - const { activeStakingProgram, defaultStakingProgram } = useStakingProgram(); - - // const minStakingDeposit = - // stakingContractInfoRecord?.[activeStakingProgram ?? defaultStakingProgram] - // ?.minStakingDeposit; - - const requiredOlas = getMinimumStakedAmountRequired( - serviceTemplate, - activeStakingProgram ?? defaultStakingProgram, - ); - - const safeOlasBalance = safeBalance?.OLAS; - const safeOlasBalanceWithStaked = - safeOlasBalance === undefined || totalOlasStakedBalance === undefined - ? undefined - : safeOlasBalance + totalOlasStakedBalance; - - const handleStart = useCallback(async () => { - // Must have a wallet to start the agent - if (!wallets?.[0]) return; - - // Paused to stop overlapping service poll while wallet is created or service is built - setIsServicePollingPaused(true); - - // Paused to stop confusing balance transitions while starting the agent - setIsBalancePollingPaused(true); - - // Mock "DEPLOYING" status (service polling will update this once resumed) - setServiceStatus(DeploymentStatus.DEPLOYING); - - // Create master safe if it doesn't exist - try { - if (!masterSafeAddress) { - await WalletService.createSafe(Chain.GNOSIS); - } - } catch (error) { - console.error(error); - setServiceStatus(undefined); - showNotification?.('Error while creating safe'); - setIsServicePollingPaused(false); - setIsBalancePollingPaused(false); - return; - } - - // Then create / deploy the service - try { - await ServicesService.createService({ - stakingProgram: activeStakingProgram ?? defaultStakingProgram, // overwrite with StakingProgram.Alpha to test migration - serviceTemplate, - deploy: true, - }); - } catch (error) { - console.error(error); - setServiceStatus(undefined); - showNotification?.('Error while deploying service'); - setIsServicePollingPaused(false); - setIsBalancePollingPaused(false); - return; - } - - // Show success notification based on whether there was a service prior to starting - try { - if (!service) { - showNotification?.('Your agent is now running!'); - } else { - const minimumStakedAmountRequired = getMinimumStakedAmountRequired( - serviceTemplate, - StakingProgram.Beta, // users should always deploy on Beta if they are yet to start their agent - ); - - showNotification?.( - `Your agent is running and you've staked ${minimumStakedAmountRequired} OLAS!`, - ); - } - } catch (error) { - console.error(error); - showNotification?.('Error while showing "running" notification'); - } - - // Can assume successful deployment - // resume polling, optimistically update service status (poll will update, if needed) - setIsServicePollingPaused(false); - setIsBalancePollingPaused(false); - setServiceStatus(DeploymentStatus.DEPLOYED); - }, [ - wallets, - setIsServicePollingPaused, - setIsBalancePollingPaused, - setServiceStatus, - masterSafeAddress, - showNotification, - activeStakingProgram, - defaultStakingProgram, - serviceTemplate, - service, - ]); - - const isDeployable = useMemo(() => { - // if the agent is NOT running and the balance is too low, - // user should not be able to start the agent - const isServiceInactive = - serviceStatus === DeploymentStatus.BUILT || - serviceStatus === DeploymentStatus.STOPPED; - if (isServiceInactive && isLowBalance) { - return false; - } - - if (serviceStatus === DeploymentStatus.DEPLOYED) return false; - if (serviceStatus === DeploymentStatus.DEPLOYING) return false; - if (serviceStatus === DeploymentStatus.STOPPING) return false; - - if (!requiredOlas) return false; - - // case where service exists & user has initial funded - if (service && storeState?.isInitialFunded) { - if (!safeOlasBalanceWithStaked) return false; - // at present agent will always require staked/bonded OLAS (or the ability to stake/bond) - return safeOlasBalanceWithStaked >= requiredOlas; - } - - // case if agent is evicted and user has met the staking criteria - if (isEligibleForStaking && isAgentEvicted) return true; - - const hasEnoughOlas = (safeOlasBalanceWithStaked ?? 0) >= requiredOlas; - const hasEnoughEth = (totalEthBalance ?? 0) > requiredGas; - - return hasEnoughOlas && hasEnoughEth; - }, [ - serviceStatus, - service, - storeState?.isInitialFunded, - isEligibleForStaking, - isAgentEvicted, - safeOlasBalanceWithStaked, - requiredOlas, - totalEthBalance, - isLowBalance, - ]); - - const buttonProps: ButtonProps = { - type: 'primary', - size: 'large', - disabled: !isDeployable, - onClick: isDeployable ? handleStart : undefined, - }; - - const buttonText = `Start agent ${service ? '' : '& stake'}`; - - return ; -}; - -export const AgentButton = () => { - const { service, serviceStatus, hasInitialLoaded } = useServices(); - const { isEligibleForStaking, isAgentEvicted } = useStakingContractInfo(); - - return useMemo(() => { - if (!hasInitialLoaded) { - return , - ]} - > - - OLAS logo - - - {`Your agent is running and you've staked ${minimumStakedAmountRequired} OLAS!`} - - Your agent is working towards earning rewards. - - Pearl is designed to make it easy for you to earn staking rewards every - day. Simply leave the app and agent running in the background for ~1hr a - day. - - - ); -}; diff --git a/frontend/components/MainPage/modals/MigrationModal.tsx b/frontend/components/MainPage/modals/MigrationModal.tsx deleted file mode 100644 index 30b3b2e08..000000000 --- a/frontend/components/MainPage/modals/MigrationModal.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import { Button, Flex, Modal, Typography } from 'antd'; -import Image from 'next/image'; - -import { STAKING_PROGRAM_META } from '@/constants/stakingProgramMeta'; -import { UNICODE_SYMBOLS } from '@/constants/symbols'; -import { useStakingProgram } from '@/hooks/useStakingProgram'; - -export const MigrationSuccessModal = ({ - open, - onClose, -}: { - open: boolean; - onClose: () => void; -}) => { - const { activeStakingProgram } = useStakingProgram(); - - // Close modal if no active staking program, migration doesn't apply to non-stakers - if (!activeStakingProgram) { - onClose(); - return null; - } - - const activeStakingProgramMeta = STAKING_PROGRAM_META[activeStakingProgram]; - - return ( - - Got it - , - ]} - > - - {/* Robot head */} - - Pearl agent head - - - You switched staking contract succesfully! - - - Your agent is now staked on {activeStakingProgramMeta.name}. - - {/* TODO: Add relevant block explorer domain */} - - View full contract details {UNICODE_SYMBOLS.EXTERNAL_LINK} - - - - ); -}; diff --git a/frontend/components/MainPage/sections/AddFundsSection.tsx b/frontend/components/MainPage/sections/AddFundsSection.tsx deleted file mode 100644 index 97bf85641..000000000 --- a/frontend/components/MainPage/sections/AddFundsSection.tsx +++ /dev/null @@ -1,155 +0,0 @@ -import { - CopyOutlined, - // QrcodeOutlined, -} from '@ant-design/icons'; -import { - Button, - Flex, - message, - Popover, - // QRCode, - Tooltip, - Typography, -} from 'antd'; -import Link from 'next/link'; -import { useCallback, useMemo, useState } from 'react'; -import styled from 'styled-components'; - -import { UNICODE_SYMBOLS } from '@/constants/symbols'; -import { COW_SWAP_GNOSIS_XDAI_OLAS_URL } from '@/constants/urls'; -import { useWallet } from '@/hooks/useWallet'; -import { Address } from '@/types/Address'; -import { copyToClipboard } from '@/utils/copyToClipboard'; -import { truncateAddress } from '@/utils/truncate'; - -import { CustomAlert } from '../../Alert'; -import { CardSection } from '../../styled/CardSection'; - -const { Text } = Typography; - -const CustomizedCardSection = styled(CardSection)<{ border?: boolean }>` - > .ant-btn { - width: 50%; - } -`; - -export const AddFundsSection = () => { - const [isAddFundsVisible, setIsAddFundsVisible] = useState(false); - const { masterSafeAddress } = useWallet(); - - const fundingAddress: Address | undefined = masterSafeAddress; - - const truncatedFundingAddress: string | undefined = useMemo( - () => fundingAddress && truncateAddress(fundingAddress), - [fundingAddress], - ); - - const handleCopyAddress = useCallback( - () => - fundingAddress && - copyToClipboard(fundingAddress).then(() => - message.success('Copied successfully!'), - ), - [fundingAddress], - ); - - return ( - <> - - - - Ability to withdraw is coming soon} - > - - - - - {isAddFundsVisible && ( - <> - - - - - )} - - ); -}; - -const AddFundsWarningAlertSection = () => ( - - - - Only send funds on Gnosis Chain! - - - You will lose any assets you send on other chains. - - - } - /> - -); - -const AddFundsAddressSection = ({ - fundingAddress, - truncatedFundingAddress, - handleCopy, -}: { - fundingAddress?: string; - truncatedFundingAddress?: string; - handleCopy: () => void; -}) => ( - - - {fundingAddress ?? 'Error loading address'} - - } - > - GNO: {truncatedFundingAddress ?? '--'} - - - - - } - /> - - ); -}; diff --git a/frontend/components/MainPage/sections/OlasBalanceSection.tsx b/frontend/components/MainPage/sections/OlasBalanceSection.tsx deleted file mode 100644 index 0c5571da1..000000000 --- a/frontend/components/MainPage/sections/OlasBalanceSection.tsx +++ /dev/null @@ -1,230 +0,0 @@ -import { InfoCircleOutlined } from '@ant-design/icons'; -import { Button, Flex, Skeleton, Tooltip, Typography } from 'antd'; -import { useMemo } from 'react'; -import styled from 'styled-components'; - -import { CustomAlert } from '@/components/Alert'; -import { COLOR } from '@/constants/colors'; -import { UNICODE_SYMBOLS } from '@/constants/symbols'; -import { LOW_MASTER_SAFE_BALANCE } from '@/constants/thresholds'; -import { useBalance } from '@/hooks/useBalance'; -import { useElectronApi } from '@/hooks/useElectronApi'; -import { useReward } from '@/hooks/useReward'; -import { useStore } from '@/hooks/useStore'; -import { balanceFormat } from '@/utils/numberFormatters'; - -import { CardSection } from '../../styled/CardSection'; - -const { Text, Title } = Typography; -const Balance = styled.span` - letter-spacing: -2px; - margin-right: 4px; -`; -const BalanceBreakdown = styled.div` - padding: 4px; -`; -const BalanceBreakdownLine = styled.div` - position: relative; - display: flex; - align-items: center; - justify-content: space-between; - font-size: 14px; - color: ${COLOR.TEXT}; - - > span { - background: ${COLOR.WHITE}; - z-index: 1; - &:first-child { - padding-right: 6px; - } - &:last-child { - padding-left: 6px; - } - } - - &:before { - content: ''; - position: absolute; - bottom: 6px; - width: 100%; - border-bottom: 2px dotted ${COLOR.BORDER_GRAY}; - } - - &:not(:last-child) { - margin-bottom: 8px; - } -`; -const OVERLAY_STYLE = { maxWidth: '300px', width: '300px' }; - -const CurrentBalance = () => { - const { totalOlasBalance, totalOlasStakedBalance } = useBalance(); - const { accruedServiceStakingRewards } = useReward(); - - const balances = useMemo(() => { - return [ - { - title: 'Staked amount', - value: balanceFormat(totalOlasStakedBalance ?? 0, 2), - }, - { - title: 'Unclaimed rewards', - value: balanceFormat(accruedServiceStakingRewards ?? 0, 2), - }, - { - // Unused funds should only be ‘free-floating’ OLAS that is neither unclaimed nor staked. - title: 'Unused funds', - value: balanceFormat( - (totalOlasBalance ?? 0) - - (totalOlasStakedBalance ?? 0) - - (accruedServiceStakingRewards ?? 0), - 2, - ), - }, - ]; - }, [accruedServiceStakingRewards, totalOlasBalance, totalOlasStakedBalance]); - - return ( - - Current balance  - - {balances.map((item, index) => ( - - {item.title} - {item.value} OLAS - - ))} - - } - > - - - - ); -}; - -const MainOlasBalanceAlert = styled.div` - .ant-alert { - margin-bottom: 8px; - .anticon.ant-alert-icon { - height: 20px; - width: 20px; - svg { - width: 100%; - height: 100%; - } - } - } -`; - -const LowTradingBalanceAlert = () => { - const { isBalanceLoaded, isLowBalance } = useBalance(); - const { storeState } = useStore(); - - if (!isBalanceLoaded) return null; - if (!storeState?.isInitialFunded) return; - if (!isLowBalance) return null; - - return ( - - - - Trading balance is too low - - - {`To run your agent, add at least $${LOW_MASTER_SAFE_BALANCE} XDAI to your account.`} - - - Do it quickly to avoid your agent missing its targets and getting - suspended! - - - } - /> - - ); -}; - -const AvoidSuspensionAlert = () => { - const { store } = useElectronApi(); - - return ( - - - - Avoid suspension! - - - Run your agent for at least half an hour a day to make sure it - hits its targets. If it misses its targets 2 days in a row, it’ll - be suspended. You won’t be able to run it or earn rewards for - several days. - - - - } - /> - - ); -}; - -export const MainOlasBalance = () => { - const { storeState } = useStore(); - const { isBalanceLoaded, totalOlasBalance } = useBalance(); - - // If first reward notification is shown BUT - // agent eviction alert is NOT yet shown, show this alert. - const canShowAvoidSuspensionAlert = useMemo(() => { - if (!storeState) return false; - - return ( - storeState.firstRewardNotificationShown && - !storeState.agentEvictionAlertShown - ); - }, [storeState]); - - const balance = useMemo(() => { - if (totalOlasBalance === undefined) return '--'; - return balanceFormat(totalOlasBalance, 2); - }, [totalOlasBalance]); - - return ( - - {canShowAvoidSuspensionAlert ? : null} - - {isBalanceLoaded ? ( - <> - - - {UNICODE_SYMBOLS.OLAS} - {balance} - OLAS - - - ) : ( - - )} - - ); -}; diff --git a/frontend/components/MainPage/sections/RewardsSection.tsx b/frontend/components/MainPage/sections/RewardsSection.tsx deleted file mode 100644 index 33b5cbab3..000000000 --- a/frontend/components/MainPage/sections/RewardsSection.tsx +++ /dev/null @@ -1,184 +0,0 @@ -import { InfoCircleOutlined } from '@ant-design/icons'; -import { Button, Flex, Modal, Skeleton, Tag, Tooltip, Typography } from 'antd'; -import Image from 'next/image'; -import { useCallback, useEffect, useRef, useState } from 'react'; - -import { useBalance } from '@/hooks/useBalance'; -import { useElectronApi } from '@/hooks/useElectronApi'; -import { useReward } from '@/hooks/useReward'; -import { useStore } from '@/hooks/useStore'; -import { balanceFormat } from '@/utils/numberFormatters'; - -import { ConfettiAnimation } from '../../Confetti/ConfettiAnimation'; -import { CardSection } from '../../styled/CardSection'; - -const { Text, Title, Paragraph } = Typography; - -const Loader = () => ( - - - - -); - -const DisplayRewards = () => { - const { availableRewardsForEpochEth, isEligibleForRewards } = useReward(); - const { isBalanceLoaded } = useBalance(); - - const reward = - availableRewardsForEpochEth === undefined - ? '--' - : `~${balanceFormat(availableRewardsForEpochEth, 2)}`; - - return ( - - - Staking rewards this work period  - - The agent's working period lasts at least 24 hours, but its - start and end point may not be at the same time every day. - - } - > - - - - {isBalanceLoaded ? ( - - {reward} OLAS  - {isEligibleForRewards ? ( - Earned - ) : ( - Not yet earned - )} - - ) : ( - - )} - - ); -}; - -const SHARE_TEXT = `I just earned my first reward through the Operate app powered by #olas!\n\nDownload the Pearl app:`; -const OPERATE_URL = 'https://olas.network/operate?pearl=first-reward'; - -const NotifyRewardsModal = () => { - const { isEligibleForRewards, availableRewardsForEpochEth } = useReward(); - const { totalOlasBalance } = useBalance(); - const { showNotification, store } = useElectronApi(); - const { storeState } = useStore(); - - const [canShowNotification, setCanShowNotification] = useState(false); - - const firstRewardRef = useRef(); - - // hook to set the flag to show the notification - useEffect(() => { - if (!isEligibleForRewards) return; - if (!storeState) return; - if (storeState?.firstRewardNotificationShown) return; - if (!availableRewardsForEpochEth) return; - - firstRewardRef.current = availableRewardsForEpochEth; - setCanShowNotification(true); - }, [isEligibleForRewards, availableRewardsForEpochEth, storeState]); - - // hook to show desktop app notification - useEffect(() => { - if (!canShowNotification) return; - - showNotification?.( - 'Your agent earned its first staking rewards!', - `Congratulations! Your agent just got the first reward for you! Your current balance: ${firstRewardRef.current} OLAS`, - ); - }, [canShowNotification, showNotification]); - - const closeNotificationModal = useCallback(() => { - setCanShowNotification(false); - - // once the notification is closed, set the flag to true - store?.set?.('firstRewardNotificationShown', true); - }, [store]); - - const onTwitterShare = useCallback(() => { - const encodedText = encodeURIComponent(SHARE_TEXT); - const encodedURL = encodeURIComponent(OPERATE_URL); - - window.open( - `https://twitter.com/intent/tweet?text=${encodedText}&url=${encodedURL}`, - '_blank', - ); - }, []); - - if (!canShowNotification) return null; - - return ( - - - Share on - Share on twitter - - , - ]} - > - - - - OLAS logo - - - - Your agent just earned the first reward! - - - - - Congratulations! Your agent just earned the first - - {` ${balanceFormat(availableRewardsForEpochEth, 2)} OLAS `} - - for you! - - - - Your current balance: - {` ${balanceFormat(totalOlasBalance, 2)} OLAS `} - - - Keep it running to get even more! - - - ); -}; - -export const MainRewards = () => ( - <> - - - -); diff --git a/frontend/components/ManageStakingPage/StakingContractSection/StakingContractTag.tsx b/frontend/components/ManageStakingPage/StakingContractSection/StakingContractTag.tsx deleted file mode 100644 index b09c11a05..000000000 --- a/frontend/components/ManageStakingPage/StakingContractSection/StakingContractTag.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { Tag } from 'antd'; - -import { StakingProgramStatus } from '@/enums/StakingProgramStatus'; - -export const StakingContractTag = ({ - status, -}: { - status?: StakingProgramStatus; -}) => { - if (status === StakingProgramStatus.New) { - return New; - } else if (status === StakingProgramStatus.Selected) { - return Selected; - } - return null; -}; diff --git a/frontend/components/ManageStakingPage/StakingContractSection/alerts.tsx b/frontend/components/ManageStakingPage/StakingContractSection/alerts.tsx deleted file mode 100644 index f2c1cf6cd..000000000 --- a/frontend/components/ManageStakingPage/StakingContractSection/alerts.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { Flex, Typography } from 'antd'; - -import { CustomAlert } from '@/components/Alert'; -import { UNICODE_SYMBOLS } from '@/constants/symbols'; - -const { Text } = Typography; - -export const AlertInsufficientMigrationFunds = ({ - totalOlasBalance, -}: { - totalOlasBalance: number; -}) => ( - - - Insufficient amount of funds to switch - - - Add funds to your account to meet the program requirements. - - Your current OLAS balance:{' '} - {totalOlasBalance} OLAS - - - } - /> -); - -export const AlertNoSlots = () => ( - No slots currently available - try again later.} - /> -); - -export const AlertUpdateToMigrate = () => ( - - App update required - - {/* - TODO: Define version requirement in some JSON store? - How do we access this date on a previous version? - */} - - Update Pearl to the latest version to switch to the staking contract. - - {/* TODO: trigger update through IPC */} - - Update Pearl to the latest version {UNICODE_SYMBOLS.EXTERNAL_LINK} - - - } - /> -); diff --git a/frontend/components/ManageStakingPage/StakingContractSection/index.tsx b/frontend/components/ManageStakingPage/StakingContractSection/index.tsx deleted file mode 100644 index b8fdf664c..000000000 --- a/frontend/components/ManageStakingPage/StakingContractSection/index.tsx +++ /dev/null @@ -1,301 +0,0 @@ -import { Button, Flex, Popover, theme, Typography } from 'antd'; -import { useMemo } from 'react'; - -import { DeploymentStatus } from '@/client'; -import { CardSection } from '@/components/styled/CardSection'; -import { STAKING_PROGRAM_META } from '@/constants/stakingProgramMeta'; -import { UNICODE_SYMBOLS } from '@/constants/symbols'; -import { Pages } from '@/enums/PageState'; -import { StakingProgram } from '@/enums/StakingProgram'; -import { StakingProgramStatus } from '@/enums/StakingProgramStatus'; -import { useBalance } from '@/hooks/useBalance'; -import { useModals } from '@/hooks/useModals'; -import { usePageState } from '@/hooks/usePageState'; -import { useServices } from '@/hooks/useServices'; -import { useServiceTemplates } from '@/hooks/useServiceTemplates'; -import { useStakingContractInfo } from '@/hooks/useStakingContractInfo'; -import { useStakingProgram } from '@/hooks/useStakingProgram'; -import { ServicesService } from '@/service/Services'; -import { Address } from '@/types/Address'; -import { getMinimumStakedAmountRequired } from '@/utils/service'; - -import { - AlertInsufficientMigrationFunds, - AlertNoSlots, - AlertUpdateToMigrate, -} from './alerts'; -import { StakingContractTag } from './StakingContractTag'; - -// const { Text } = Typography; - -const { useToken } = theme; - -// const CustomDivider = styled(Divider)` -// flex: auto; -// width: max-content; -// min-width: 0; -// margin: 0; -// `; - -// const ContractParameter = ({ -// label, -// value, -// }: { -// label: string; -// value: string; -// }) => ( -// -// {label} -// -// {value} -// -// ); - -export const StakingContractSection = ({ - stakingProgram, - contractAddress, -}: { - stakingProgram: StakingProgram; - contractAddress: Address; -}) => { - const { goto } = usePageState(); - const { setServiceStatus, serviceStatus, setIsServicePollingPaused } = - useServices(); - const { serviceTemplate } = useServiceTemplates(); - const { setMigrationModalOpen } = useModals(); - const { activeStakingProgram, defaultStakingProgram, updateStakingProgram } = - useStakingProgram(); - const { stakingContractInfoRecord } = useStakingContractInfo(); - const { token } = useToken(); - const { totalOlasBalance, isBalanceLoaded } = useBalance(); - const { isServiceStakedForMinimumDuration } = useStakingContractInfo(); - - const stakingContractInfoForStakingProgram = - stakingContractInfoRecord?.[stakingProgram]; - - const activeStakingProgramMeta = STAKING_PROGRAM_META[stakingProgram]; - - const isSelected = - activeStakingProgram && activeStakingProgram === stakingProgram; - - const hasEnoughRewards = true; - //(stakingContractInfoForStakingProgram?.availableRewards ?? 0) > 0; - - const minimumOlasRequiredToMigrate = useMemo( - () => getMinimumStakedAmountRequired(serviceTemplate, StakingProgram.Beta), - [serviceTemplate], - ); - - const hasEnoughOlasToMigrate = useMemo(() => { - if (totalOlasBalance === undefined) return false; - if (!minimumOlasRequiredToMigrate) return false; - return totalOlasBalance >= minimumOlasRequiredToMigrate; - }, [minimumOlasRequiredToMigrate, totalOlasBalance]); - - const hasEnoughSlots = - stakingContractInfoForStakingProgram?.maxNumServices && - stakingContractInfoForStakingProgram?.serviceIds && - stakingContractInfoForStakingProgram?.maxNumServices > - stakingContractInfoForStakingProgram?.serviceIds?.length; - - // TODO: compatibility needs to be implemented - const isAppVersionCompatible = true; // contract.appVersion === 'rc105'; - - const isMigratable = - !isSelected && - activeStakingProgram === StakingProgram.Alpha && // TODO: make more elegant - isBalanceLoaded && - hasEnoughSlots && - hasEnoughRewards && - hasEnoughOlasToMigrate && - isAppVersionCompatible && - serviceStatus !== DeploymentStatus.DEPLOYED && - serviceStatus !== DeploymentStatus.DEPLOYING && - serviceStatus !== DeploymentStatus.STOPPING && - isServiceStakedForMinimumDuration; - - const cantMigrateReason = useMemo(() => { - if (isSelected) { - return 'Contract is already selected'; - } - - if (!hasEnoughRewards) { - return 'No available rewards'; - } - - if (activeStakingProgram !== StakingProgram.Alpha) { - return 'Can only migrate from Alpha to Beta'; - } - - if (!isBalanceLoaded) { - return 'Loading balance...'; - } - - if (!hasEnoughSlots) { - return 'No available staking slots'; - } - - if (!hasEnoughOlasToMigrate) { - return 'Insufficient OLAS balance to migrate, need ${}'; - } - - if (!isAppVersionCompatible) { - return 'Pearl update required to migrate'; - } - - if (serviceStatus === DeploymentStatus.DEPLOYED) { - return 'Service is currently running'; - } - - if (serviceStatus === DeploymentStatus.DEPLOYING) { - return 'Service is currently deploying'; - } - - if (serviceStatus === DeploymentStatus.STOPPING) { - return 'Service is currently stopping'; - } - - if (!isServiceStakedForMinimumDuration) { - return 'Service has not been staked for the minimum duration'; - } - }, [ - activeStakingProgram, - hasEnoughOlasToMigrate, - hasEnoughRewards, - hasEnoughSlots, - isAppVersionCompatible, - isBalanceLoaded, - isSelected, - isServiceStakedForMinimumDuration, - serviceStatus, - ]); - - const cantMigrateAlert = useMemo(() => { - if (isSelected || !isBalanceLoaded) { - return null; - } - - if (!hasEnoughSlots) { - return ; - } - - if (!hasEnoughOlasToMigrate) { - return ( - - ); - } - - if (!isAppVersionCompatible) { - return ; - } - }, [ - isSelected, - isBalanceLoaded, - totalOlasBalance, - hasEnoughSlots, - hasEnoughOlasToMigrate, - isAppVersionCompatible, - ]); - - const contractTagStatus = useMemo(() => { - if (activeStakingProgram === stakingProgram) - return StakingProgramStatus.Selected; - - // Pearl is not staked, set as Selected if default (Beta) - if (!activeStakingProgram && stakingProgram === defaultStakingProgram) - return StakingProgramStatus.Selected; - - // Otherwise, highlight Beta as New - if (stakingProgram === StakingProgram.Beta) return StakingProgramStatus.New; - - // Otherwise, no tag - return; - }, [activeStakingProgram, defaultStakingProgram, stakingProgram]); - - return ( - - {/* Title */} - - {`${activeStakingProgramMeta.name} contract`} - {/* TODO: pass `status` attribute */} - - {!isSelected && ( - // here instead of isSelected we should check that the contract is not the old staking contract - // but the one from staking factory (if we want to open govern) - - Contract details {UNICODE_SYMBOLS.EXTERNAL_LINK} - - )} - - - {/* TODO: fix */} - - {/* Contract details - {stakingContractInfo?.availableRewards && ( - - )} - - {stakingContractInfo?.minStakingDeposit && ( - - )} */} - - {cantMigrateAlert} - {/* Switch to program button */} - {!isSelected && ( - - - - )} - - ); -}; diff --git a/frontend/components/ManageStakingPage/WhatAreStakingContracts.tsx b/frontend/components/ManageStakingPage/WhatAreStakingContracts.tsx deleted file mode 100644 index f06f2ace5..000000000 --- a/frontend/components/ManageStakingPage/WhatAreStakingContracts.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { Collapse, Flex, Typography } from 'antd'; - -import { CardSection } from '../styled/CardSection'; - -const { Text } = Typography; - -const collapseItems = [ - { - key: 1, - label: What are staking contracts?, - children: ( - - - When your agent goes to work, it participates in staking contracts. - - - Staking contracts define what the agent needs to do, how much OLAS - needs to be staked etc. - - - Your agent can only participate in one staking contract at a time. - - - You need to run your agent for max 1 hour a day, regardless of the - staking contract. - - - ), - }, -]; - -export const WhatAreStakingContractsSection = () => { - return ( - - - - ); -}; diff --git a/frontend/components/ManageStakingPage/index.tsx b/frontend/components/ManageStakingPage/index.tsx deleted file mode 100644 index 310d19eca..000000000 --- a/frontend/components/ManageStakingPage/index.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { CloseOutlined } from '@ant-design/icons'; -import { Button, Card } from 'antd'; - -import { Chain } from '@/client'; -import { SERVICE_STAKING_TOKEN_MECH_USAGE_CONTRACT_ADDRESSES } from '@/constants/contractAddresses'; -import { Pages } from '@/enums/PageState'; -import { StakingProgram } from '@/enums/StakingProgram'; -import { usePageState } from '@/hooks/usePageState'; - -import { CardTitle } from '../Card/CardTitle'; -import { StakingContractSection } from './StakingContractSection'; -import { WhatAreStakingContractsSection } from './WhatAreStakingContracts'; - -export const ManageStakingPage = () => { - const { goto } = usePageState(); - return ( - } - bordered={false} - extra={ - - } - > - - To keep your funds safe, we encourage you to add one of your existing - crypto wallets as a backup. This enables you to recover your funds if - you lose both your password and seed phrase. - -