From 93f5721ac1e6ff800a265a3f9f881fa3826ec5f5 Mon Sep 17 00:00:00 2001 From: Mantvydas Deltuva Date: Fri, 23 Aug 2024 01:03:19 +0300 Subject: [PATCH 1/2] MDE resolved pylint errors --- app/back-end/gunicorn_config.py | 8 +- app/back-end/requirements_dev.txt | 15 +- app/back-end/run.py | 5 +- app/back-end/src/__init__.py | 5 +- app/back-end/src/config.py | 2 + app/back-end/src/constants.py | 5 +- app/back-end/src/events/workspace_event.py | 33 ++-- app/back-end/src/routes/workspace_route.py | 63 ++++---- app/back-end/src/setup/eventer.py | 50 +++--- app/back-end/src/setup/extensions.py | 25 ++- app/back-end/src/setup/router.py | 5 +- app/back-end/src/utils/exceptions.py | 41 +++++ app/back-end/src/utils/helpers.py | 33 ++-- app/back-end/src/utils/socket_manager.py | 142 +++++++++++++++++- .../fileTreeItem/fileTreeItem.tsx | 4 +- 15 files changed, 345 insertions(+), 91 deletions(-) create mode 100644 app/back-end/src/utils/exceptions.py diff --git a/app/back-end/gunicorn_config.py b/app/back-end/gunicorn_config.py index 0cb95dd..1e83542 100644 --- a/app/back-end/gunicorn_config.py +++ b/app/back-end/gunicorn_config.py @@ -7,10 +7,14 @@ - Number of worker processes based on the number of CPU cores. Dependencies: -- multiprocessing: Used to determine the number of CPU cores for configuring the number of Gunicorn workers. -- src.setup.env.Env: The class responsible for retrieving environment settings such as host and port. +- multiprocessing: Used to determine the number of CPU cores for configuring the + number of Gunicorn workers. +- src.setup.env.Env: The class responsible for retrieving environment settings such + as host and port. """ +# pylint: disable=invalid-name + import multiprocessing # Bind to specified host and port diff --git a/app/back-end/requirements_dev.txt b/app/back-end/requirements_dev.txt index b3ca909..6666d7a 100644 --- a/app/back-end/requirements_dev.txt +++ b/app/back-end/requirements_dev.txt @@ -1 +1,14 @@ -black \ No newline at end of file +astroid==3.2.4 +black==24.8.0 +click==8.1.7 +dill==0.3.8 +isort==5.13.2 +mccabe==0.7.0 +mypy-extensions==1.0.0 +packaging==24.1 +pathspec==0.12.1 +platformdirs==4.2.2 +pylint==3.2.6 +tomli==2.0.1 +tomlkit==0.13.2 +typing_extensions==4.12.2 diff --git a/app/back-end/run.py b/app/back-end/run.py index 50df4cf..a7352aa 100644 --- a/app/back-end/run.py +++ b/app/back-end/run.py @@ -10,9 +10,12 @@ Dependencies: - src.create_app: The function that sets up and returns the configured Flask app instance. - src.socketio: The Socket.IO instance initialized in the application setup. -- src.setup.env.Env: The class responsible for managing environment variables, including retrieving the host and port settings. +- src.setup.env.Env: The class responsible for managing environment variables, including + retrieving the host and port settings. """ +# pylint: disable=import-error + from src import create_app, socketio, env # Initialize the Flask app diff --git a/app/back-end/src/__init__.py b/app/back-end/src/__init__.py index 94f59d4..910a62a 100644 --- a/app/back-end/src/__init__.py +++ b/app/back-end/src/__init__.py @@ -11,7 +11,8 @@ Dependencies: - Flask: The core web framework. - gevent.monkey: Provides monkey patches to enable cooperative multitasking. -- src.setup.extensions: Contains initialization for Flask extensions like compression, Socket.IO, and CORS. +- src.setup.extensions: Contains initialization for Flask extensions like compression, Socket.IO, + and CORS. - src.setup.router: Defines and manages application routing through blueprints. - src.setup.eventer: Sets up event handlers for application events. - src.constants: Provides constants used in configuration, such as BASE_ROUTE. @@ -20,6 +21,8 @@ Flask: A fully configured Flask application instance with all extensions and routes initialized. """ +# pylint: disable=import-error + import gevent.monkey from flask import Flask diff --git a/app/back-end/src/config.py b/app/back-end/src/config.py index d00557c..a90edb9 100644 --- a/app/back-end/src/config.py +++ b/app/back-end/src/config.py @@ -11,6 +11,8 @@ - dotenv: Used for loading environment variables from a `.env` file. """ +# pylint: disable=import-error + import os from dotenv import load_dotenv diff --git a/app/back-end/src/constants.py b/app/back-end/src/constants.py index 7d5ff2b..c045a08 100644 --- a/app/back-end/src/constants.py +++ b/app/back-end/src/constants.py @@ -7,12 +7,15 @@ - Workspace directory paths, including a template directory. - Base API route and specific routes for various functionalities. -These constants are typically used for file handling, directory management, and routing in the Flask application. +These constants are typically used for file handling, directory management, and routing in the +Flask application. Dependencies: - os: Used for interacting with the operating system to manage file and directory paths. """ +# pylint: disable=import-error + import os diff --git a/app/back-end/src/events/workspace_event.py b/app/back-end/src/events/workspace_event.py index 5685719..da4326f 100644 --- a/app/back-end/src/events/workspace_event.py +++ b/app/back-end/src/events/workspace_event.py @@ -1,8 +1,8 @@ """ This module contains functions for handling workspace-related WebSocket events. -It includes functions that manage file operations within the workspace directory. The module provides real-time -feedback to clients through WebSocket events. +It includes functions that manage file operations within the workspace directory. The module +provides real-time feedback to clients through WebSocket events. Dependencies: - os: Used for file and directory operations. @@ -10,9 +10,12 @@ - src.setup.constants.WORKSPACE_DIR: The base directory for workspace files. """ +# pylint: disable=import-error + import os from src.setup.extensions import socketio +from src.utils.exceptions import UnexpectedError from src.constants import WORKSPACE_DIR @@ -21,18 +24,20 @@ def handle_workspace_file_update(data): """ Handle the 'workspace_file_update' WebSocket event. - This function processes the data received from the client to update a file in the workspace directory. - It ensures that required fields are present, writes the content to the specified file, and handles any errors - by sending appropriate status updates back to the client. + This function processes the data received from the client to update a file in the workspace + directory. It ensures that required fields are present, writes the content to the specified + file, and handles any errors by sending appropriate status updates back to the client. Args: - data (dict): The data received from the client, expected to contain 'uuid', 'fileId', and 'content'. + data (dict): The data received from the client, expected to contain 'uuid', 'fileId', and + 'content'. Emits: - 'workspace_file_update_status': Emits a status message indicating success or failure of the file update operation. + 'workspace_file_update_status': Emits a status message indicating success or failure of + the file update operation. """ uuid = data.get("uuid") - fileId = data.get("fileId") + file_id = data.get("fileId") content = data.get("content") # Ensure the uuid is provided @@ -44,28 +49,26 @@ def handle_workspace_file_update(data): return # Ensure the fileId is provided - if not fileId: + if not file_id: socketio.emit( "workspace_file_update_status", {"status": "error", "message": "File ID is missing"}, ) return - file_path = os.path.join(WORKSPACE_DIR, uuid, fileId) + file_path = os.path.join(WORKSPACE_DIR, uuid, file_id) try: # Ensure the directory exists os.makedirs(os.path.dirname(file_path), exist_ok=True) # Write the content to the file - with open(file_path, "w") as file: + with open(file_path, "w", encoding="utf-8") as file: file.write(content) # Notify the client of the successful update socketio.emit("workspace_file_update_status", {"status": "success"}) - except Exception as e: + except UnexpectedError as e: # Notify the client of an error during the update - socketio.emit( - "workspace_file_update_status", {"status": "error", "message": str(e)} - ) + socketio.emit("workspace_file_update_status", {"status": "error", "message": str(e)}) diff --git a/app/back-end/src/routes/workspace_route.py b/app/back-end/src/routes/workspace_route.py index 89372a5..2765b48 100644 --- a/app/back-end/src/routes/workspace_route.py +++ b/app/back-end/src/routes/workspace_route.py @@ -7,7 +7,8 @@ Dependencies: - os: For file and directory operations, such as checking existence and copying directories. -- shutil: For copying directory trees, ensuring that user-specific directories are properly initialized. +- shutil: For copying directory trees, ensuring that user-specific directories are properly + initialized. - flask.Blueprint: To create and organize route blueprints for modular route management in Flask. - flask.request: To handle incoming HTTP requests and extract headers and parameters. - flask.jsonify: To create JSON responses for API endpoints. @@ -15,16 +16,21 @@ Extensions: - src.setup.extensions.compress: Used for compressing responses to optimize data transfer. -- src.setup.extensions.logger: Provides logging functionalities for capturing and recording events and errors. -- src.setup.constants: Contains constants for directory paths and routes used in the workspace management. +- src.setup.extensions.logger: Provides logging functionalities for capturing and recording events + and errors. +- src.setup.constants: Contains constants for directory paths and routes used in the workspace + management. """ +# pylint: disable=import-error + import os import shutil from flask import Blueprint, request, jsonify, send_file from src.setup.extensions import compress, logger from src.utils.helpers import socketio_emit_to_user_session, build_workspace_structure +from src.utils.exceptions import UnexpectedError from src.constants import ( WORKSPACE_DIR, WORKSPACE_TEMPLATE_DIR, @@ -40,13 +46,14 @@ def get_workspace(): """ Retrieve the structure of the workspace directory. - This endpoint provides a JSON representation of the user's workspace directory structure. If the directory - does not exist, it copies a template directory to the user's workspace. The structure includes metadata - about files and folders in the workspace. + This endpoint provides a JSON representation of the user's workspace directory structure. If the + directory does not exist, it copies a template directory to the user's workspace. The structure + includes metadata about files and folders in the workspace. Process: - Extracts the UUID and SID from request headers to identify the user session. - - Ensures that the user-specific workspace directory exists; if not, copies a template directory. + - Ensures that the user-specific workspace directory exists; if not, copies a template + directory. - Builds the directory structure as a nested JSON object. - Emits feedback to the user's console about the status of the workspace retrieval process. @@ -55,7 +62,8 @@ def get_workspace(): Returns: Response: A Flask response object with the following possible outcomes: - - `200 OK`: If the workspace structure is successfully retrieved, returns a JSON representation of the directory structure. + - `200 OK`: If the workspace structure is successfully retrieved, returns a JSON + representation of the directory structure. - `400 Bad Request`: If the UUID or SID header is missing in the request. - `403 Forbidden`: If there is a permission issue accessing the workspace directory. - `404 Not Found`: If the workspace directory or files are not found. @@ -64,9 +72,11 @@ def get_workspace(): Errors and Feedback: - If the `uuid` or `sid` headers are missing, returns a `400 Bad Request` response. - On successful retrieval, a success message is emitted to the user's console. - - In case of errors, appropriate feedback is emitted to the user's console and an error response is returned: + - In case of errors, appropriate feedback is emitted to the user's console and an error + response is returned: - `FileNotFoundError`: Indicates that the directory or file was not found. - - `PermissionError`: Indicates permission issues while accessing the workspace directory. + - `PermissionError`: Indicates permission issues while accessing the workspace + directory. - Other exceptions: Logs and reports unexpected errors. """ @@ -99,9 +109,7 @@ def get_workspace(): # Build and return the workspace structure as a JSON object workspace_structure = [ - build_workspace_structure( - os.path.join(user_workspace_dir, child), user_workspace_dir - ) + build_workspace_structure(os.path.join(user_workspace_dir, child), user_workspace_dir) for child in os.listdir(user_workspace_dir) ] @@ -117,7 +125,7 @@ def get_workspace(): return jsonify(workspace_structure) except FileNotFoundError as e: - logger.error(f"FileNotFoundError: {e} while accessing {user_workspace_dir}") + logger.error("FileNotFoundError: %s while accessing %s", e, user_workspace_dir) # Emit a feedback to the user's console socketio_emit_to_user_session( CONSOLE_FEEDBACK_EVENT, @@ -130,7 +138,7 @@ def get_workspace(): ) return jsonify({"error": "Requested file not found"}), 404 except PermissionError as e: - logger.error(f"PermissionError: {e} while accessing {user_workspace_dir}") + logger.error("PermissionError: %s while accessing %s", e, user_workspace_dir) # Emit a feedback to the user's console socketio_emit_to_user_session( CONSOLE_FEEDBACK_EVENT, @@ -142,14 +150,14 @@ def get_workspace(): sid, ) return jsonify({"error": "Permission denied"}), 403 - except Exception as e: - logger.error(f"Unexpected error while serving workspace for UUID '{uuid}': {e}") + except UnexpectedError as e: + logger.error("UnexpectedError: %s while accessing %s", e.message, user_workspace_dir) # Emit a feedback to the user's console socketio_emit_to_user_session( CONSOLE_FEEDBACK_EVENT, { "type": "errr", - "message": f"Unexpected error while serving workspace for UUID '{uuid}': {e}", + "message": f"UnexpectedError: {e.message} while accessing {user_workspace_dir}", }, uuid, sid, @@ -165,8 +173,8 @@ def get_workspace_file(relative_path): This endpoint serves files from the user's workspace directory. If the directory does not exist, it copies a template directory to the user's workspace. The file specified by `relative_path` - is then served for download. Feedback about the file retrieval process is sent to the user's console - via Socket.IO. + is then served for download. Feedback about the file retrieval process is sent to the user's + console via Socket.IO. Args: relative_path (str): The path to the file within the user's workspace directory. @@ -182,7 +190,8 @@ def get_workspace_file(relative_path): Errors and Feedback: - If the `uuid` or `sid` headers are missing, a `400 Bad Request` response is returned. - On successful file retrieval, a success message is emitted to the user's console. - - On errors, appropriate feedback is emitted to the user's console and an error response is returned: + - On errors, appropriate feedback is emitted to the user's console and an error response is + returned: - `FileNotFoundError`: Indicates the requested file was not found. - `PermissionError`: Indicates permission issues while accessing the file. - Other exceptions: Logs and reports unexpected errors. @@ -231,7 +240,7 @@ def get_workspace_file(relative_path): return send_file(file_path, as_attachment=False) except FileNotFoundError as e: - logger.error(f"FileNotFoundError: {e} while accessing {file_path}") + logger.error("FileNotFoundError: %s while accessing %s", e, file_path) # Emit a feedback to the user's console socketio_emit_to_user_session( CONSOLE_FEEDBACK_EVENT, @@ -244,7 +253,7 @@ def get_workspace_file(relative_path): ) return jsonify({"error": "Requested file not found"}), 404 except PermissionError as e: - logger.error(f"PermissionError: {e} while accessing {file_path}") + logger.error("PermissionError: %s while accessing %s", e, file_path) # Emit a feedback to the user's console socketio_emit_to_user_session( CONSOLE_FEEDBACK_EVENT, @@ -256,16 +265,14 @@ def get_workspace_file(relative_path): sid, ) return jsonify({"error": "Permission denied"}), 403 - except Exception as e: - logger.error( - f"Unexpected error while serving file '{relative_path}' for UUID '{uuid}': {e}" - ) + except UnexpectedError as e: + logger.error("UnexpectedError: %s while accessing %s", e.message, file_path) # Emit a feedback to the user's console socketio_emit_to_user_session( CONSOLE_FEEDBACK_EVENT, { "type": "errr", - "message": f"Unexpected error while serving file '{relative_path}' for UUID '{uuid}': {e}", + "message": f"UnexpectedError: {e.message} while accessing {file_path}", }, uuid, sid, diff --git a/app/back-end/src/setup/eventer.py b/app/back-end/src/setup/eventer.py index b60206b..ad9f96b 100644 --- a/app/back-end/src/setup/eventer.py +++ b/app/back-end/src/setup/eventer.py @@ -1,30 +1,41 @@ """ This module is responsible for importing and registering all event modules within the application. -Event modules are imported to ensure that their event handlers are registered properly when the application initializes. +Event modules are imported to ensure that their event handlers are registered properly when the +application initializes. -It includes the registration of event handlers for Socket.IO events such as user connections and disconnections. +It includes the registration of event handlers for Socket.IO events such as user connections and +disconnections. Dependencies: -- src.events.workspace_event: An event module related to workspace operations, imported to ensure its event handlers are registered. +- src.events.workspace_event: An event module related to workspace operations, imported to ensure + its event handlers are registered. Functions: - eventer: Registers event handlers for Socket.IO events. Specifically, it handles: - - "connect": Called when a user connects. It registers the user's session and logs the connection. - - "disconnect": Called when a user disconnects. It removes the user's session and logs the disconnection. + - "connect": Called when a user connects. It registers the user's session and logs the + connection. + - "disconnect": Called when a user disconnects. It removes the user's session and logs the + disconnection. Details: -- `handle_connect`: Handles the connection event by extracting the UUID from the request, registering the user session with `socket_manager`, and logging the event. -- `handle_disconnect`: Handles the disconnection event by removing the user session from `socket_manager` and logging the event. +- `handle_connect`: Handles the connection event by extracting the UUID from the request, + registering the user session with `socket_manager`, and logging the event. +- `handle_disconnect`: Handles the disconnection event by removing the user session from + `socket_manager` and logging the event. Logging: -- `logger`: Used to log connection and disconnection events, including error messages when no UUID is provided. +- `logger`: Used to log connection and disconnection events, including error messages when no UUID + is provided. """ +# pylint: disable=import-error + from flask import request from src.setup.extensions import socketio, logger, socket_manager # Import all event modules here +# TODO - Import the workspace_event module to register its event handlers import src.events.workspace_event @@ -38,23 +49,25 @@ def handle_connect(): """ Handle a new Socket.IO connection event. - This function is triggered when a client establishes a connection to the Socket.IO server. It retrieves - the user's UUID from the query parameters, registers the user session using `socket_manager`, and logs - the connection event. + This function is triggered when a client establishes a connection to the Socket.IO server. + It retrieves the user's UUID from the query parameters, registers the user session using + `socket_manager`, and logs the connection event. Process: - Extracts the UUID from the query parameters of the connection request. - Registers the user's session with the `socket_manager` using the UUID and session ID. - Logs the connection event, including the UUID and session ID. - If no UUID is provided in the connection request, an error is logged indicating the missing UUID. + If no UUID is provided in the connection request, an error is logged indicating the missing + UUID. Logs: - Info: When a user successfully connects, including their UUID and session ID. - Error: When the UUID is not provided in the connection request. Returns: - None: This function does not return a value. It performs actions based on the connection event. + None: This function does not return a value. It performs actions based on the connection + event. """ uuid = request.args.get("uuid") if uuid: @@ -68,22 +81,25 @@ def handle_disconnect(): """ Handle a Socket.IO disconnection event. - This function is triggered when a client disconnects from the Socket.IO server. It retrieves the user's - UUID from the query parameters, removes the user session using `socket_manager`, and logs the disconnection event. + This function is triggered when a client disconnects from the Socket.IO server. It retrieves + the user's UUID from the query parameters, removes the user session using `socket_manager`, + and logs the disconnection event. Process: - Extracts the UUID from the query parameters of the disconnection request. - Removes the user's session from `socket_manager` using the UUID and session ID. - Logs the disconnection event, including the UUID and session ID. - If no UUID is provided in the disconnection request, an error is logged indicating the missing UUID. + If no UUID is provided in the disconnection request, an error is logged indicating the + missing UUID. Logs: - Info: When a user successfully disconnects, including their UUID and session ID. - Error: When the UUID is not provided in the disconnection request. Returns: - None: This function does not return a value. It performs actions based on the disconnection event. + None: This function does not return a value. It performs actions based on the + disconnection event. """ uuid = request.args.get("uuid") if uuid: diff --git a/app/back-end/src/setup/extensions.py b/app/back-end/src/setup/extensions.py index d550a13..c58d4df 100644 --- a/app/back-end/src/setup/extensions.py +++ b/app/back-end/src/setup/extensions.py @@ -2,25 +2,34 @@ This module sets up and configures logging and initializes key Flask extensions for the application. The module is responsible for: -- Configuring the logging system to provide consistent log formatting and log levels for monitoring and debugging. +- Configuring the logging system to provide consistent log formatting and log levels for monitoring + and debugging. - Initializing essential Flask extensions including: - - `Compress`: For handling response compression to improve performance and reduce bandwidth usage. - - `SocketIO`: For real-time communication using WebSocket support. - - `CORS`: For managing Cross-Origin Resource Sharing (CORS) policies to control access between different domains. + - `Compress`: For handling response compression to improve performance and reduce bandwidth + usage. + - `SocketIO`: For real-time communication using WebSocket support. + - `CORS`: For managing Cross-Origin Resource Sharing (CORS) policies to control access between + different domains. Dependencies: -- logging: Python's standard module for logging messages, used to configure logging behavior and format. +- logging: Python's standard module for logging messages, used to configure logging behavior and + format. - flask_compress: Flask extension that provides response compression capabilities. - flask_socketio: Flask extension that adds WebSocket support and real-time communication. -- flask_cors: Flask extension that handles CORS (Cross-Origin Resource Sharing) to manage cross-domain requests. +- flask_cors: Flask extension that handles CORS (Cross-Origin Resource Sharing) to manage + cross-domain requests. Initialization: - **Logging**: Configured to output log messages with a specific format and log level. - **Env**: An instance of `Env` from `src.config` is used to load environment variables. -- **SocketManager**: Initialized with the Redis URL from environment variables for managing WebSocket sessions. -- **Flask Extensions**: Instances of `Compress`, `SocketIO`, and `CORS` are created and ready to be integrated into the Flask application. +- **SocketManager**: Initialized with the Redis URL from environment variables for managing + WebSocket sessions. +- **Flask Extensions**: Instances of `Compress`, `SocketIO`, and `CORS` are created and ready + to be integrated into the Flask application. """ +# pylint: disable=import-error + import logging from flask_compress import Compress from flask_socketio import SocketIO diff --git a/app/back-end/src/setup/router.py b/app/back-end/src/setup/router.py index c188c98..fa998ee 100644 --- a/app/back-end/src/setup/router.py +++ b/app/back-end/src/setup/router.py @@ -2,7 +2,8 @@ This module defines the router setup for the Flask application. It is responsible for: -- Creating a main blueprint (`router_bp`) that serves as the central point for registering other route blueprints. +- Creating a main blueprint (`router_bp`) that serves as the central point for registering + other route blueprints. - Registering all the individual route blueprints with a specified URL prefix. Dependencies: @@ -10,6 +11,8 @@ - src.routes.workspace_route: Contains the blueprint for workspace-related routes. """ +# pylint: disable=import-error + from flask import Blueprint from src.routes.workspace_route import workspace_route_bp diff --git a/app/back-end/src/utils/exceptions.py b/app/back-end/src/utils/exceptions.py new file mode 100644 index 0000000..402f70d --- /dev/null +++ b/app/back-end/src/utils/exceptions.py @@ -0,0 +1,41 @@ +""" +This module defines custom exception classes for the application. + +It provides: +- `UnexpectedError`: A custom exception class used to signal unexpected errors + that occur during the execution of the application. + +Dependencies: +- Exception: The base class for all built-in exceptions in Python. +""" + + +class UnexpectedError(Exception): + """ + Exception raised for unexpected errors in the application. + + This exception is used to indicate that an error has occurred which was not + anticipated or handled explicitly. It allows for custom error messages to + be provided when raising the exception. + + Args: + message (str): A descriptive message about the error. + + Attributes: + message (str): The error message provided during the exception initialization. + + Inherits: + Exception: The base class for all built-in exceptions in Python. + """ + + def __init__(self, message): + """ + Initialize an instance of the `UnexpectedError` exception. + + Args: + message (str): A descriptive message about the error. This message + is stored in the `message` attribute and is passed + to the base `Exception` class. + """ + self.message = message + super().__init__(self.message) diff --git a/app/back-end/src/utils/helpers.py b/app/back-end/src/utils/helpers.py index 6eb418f..0aecce0 100644 --- a/app/back-end/src/utils/helpers.py +++ b/app/back-end/src/utils/helpers.py @@ -1,32 +1,37 @@ """ -This package provides utilities for handling Socket.IO events and managing workspace directory structures. +This package provides utilities for handling Socket.IO events and managing workspace directory +structures. Functions: - socketio_emit_to_user_session: Sends a Socket.IO event to a specific user session. The event data is augmented with a timestamp indicating the current time. - build_workspace_structure: Recursively builds a dictionary representation of a directory structure - for a given workspace. It includes metadata about files and directories and provides a hierarchical - view of the workspace. + for a given workspace. It includes metadata about files and directories and provides a + hierarchical view of the workspace. Dependencies: - os: Provides a way to interact with the operating system, including filesystem operations. - datetime: Supplies classes for manipulating dates and times. -- src.setup.extensions: Contains `socketio` and `socket_manager` used for emitting events and managing - user sessions in Socket.IO. +- src.setup.extensions: Contains `socketio` and `socket_manager` used for emitting events and + managing user sessions in Socket.IO. Details: -- `socketio_emit_to_user_session` emits an event to a specific user session identified by UUID and session ID (SID). -- `build_workspace_structure` generates a nested dictionary structure representing the directories and - files within a workspace, providing metadata such as labels and types. +- `socketio_emit_to_user_session` emits an event to a specific user session identified by UUID + and session ID (SID). +- `build_workspace_structure` generates a nested dictionary structure representing the directories + and files within a workspace, providing metadata such as labels and types. Usage: - Use `socketio_emit_to_user_session` to communicate with specific user sessions through Socket.IO. -- Use `build_workspace_structure` to construct a detailed, recursive view of a directory structure for - applications requiring hierarchical data representation. +- Use `build_workspace_structure` to construct a detailed, recursive view of a directory structure + for applications requiring hierarchical data representation. -No classes or modules are directly exposed by this package, only the utility functions defined above. +No classes or modules are directly exposed by this package, only the utility functions defined +above. """ +# pylint: disable=import-error + import os from datetime import datetime @@ -82,8 +87,10 @@ def build_workspace_structure(path, user_workspace_dir): dict: A dictionary representing the directory structure. Each entry contains: - "id" (str): # The relative path of the item from the `user_workspace_dir`. - "label" (str): # The name of the file or directory. - - "fileType" (str): # The type of the item, either "folder" for directories or "csv" for files. - - "children" (list): # A list of child items, which is empty for files and populated with nested dictionaries for directories. + - "fileType" (str): # The type of the item, either "folder" for directories or "csv" + for files. + - "children" (list): # A list of child items, which is empty for files and populated + with nested dictionaries for directories. """ workspace_structure = { "id": os.path.relpath(path, user_workspace_dir), diff --git a/app/back-end/src/utils/socket_manager.py b/app/back-end/src/utils/socket_manager.py index 2c94a10..82f5e32 100644 --- a/app/back-end/src/utils/socket_manager.py +++ b/app/back-end/src/utils/socket_manager.py @@ -1,32 +1,161 @@ +""" +This module provides the `SocketManager` class for managing WebSocket user sessions using Redis. + +The `SocketManager` class is responsible for: +- Registering user sessions by associating a user UUID with a socket ID. +- Removing user sessions when users disconnect. +- Retrieving active sessions for a specific user or all users. + +Dependencies: +- redis: Python Redis client for interacting with the Redis store. + +Usage: + socket_manager = SocketManager(redis_url="redis://localhost:6379/0") + socket_manager.register_user_session(uuid, sid) + sessions = socket_manager.get_user_sessions(uuid) +""" + +# pylint: disable=import-error + import redis class SocketManager: - def __init__(self, redis_url="redis://localhost:6379/0", namespace="socket_id_map"): + """ + Manages WebSocket user sessions using Redis as a backend. + + This class provides methods to register, remove, and retrieve user sessions + associated with WebSocket connections. It uses Redis to store session data, + enabling efficient management and retrieval of session information. + + Attributes: + redis (StrictRedis): A Redis client for interacting with the Redis store. + namespace (str): A namespace used as a prefix for Redis keys to avoid key collisions. + + Methods: + register_user_session(uuid, sid): Registers a socket ID (sid) for a given user UUID. + remove_user_session(uuid, sid): Removes a socket ID (sid) from a given user UUID. + get_user_sessions(uuid): Retrieves all socket IDs associated with a given user UUID. + get_user_session(uuid, sid): Checks if a specific socket ID (sid) exists for a given user + UUID. + get_all_sessions(): Retrieves all active sessions for all users. + remove_all_sessions(): Removes all stored sessions in the namespace. + """ + + def __init__( + self, + redis_url="redis://localhost:6379/0", + namespace="socket_id_map", + ): + """ + Initializes the SocketManager with a connection to a Redis instance and a specified + namespace. + + Args: + redis_url (str): The URL of the Redis instance to connect to. Defaults + to "redis://localhost:6379/0". + namespace (str): The namespace used as a prefix for Redis keys to prevent key + collisions. Defaults to "socket_id_map". + + Attributes: + redis (StrictRedis): A Redis client instance for performing operations in the + Redis store. + namespace (str): The namespace that will be used to prefix all Redis keys associated + with user sessions. + """ self.redis = redis.StrictRedis.from_url(redis_url) self.namespace = namespace def _get_redis_key(self): + """ + Constructs the base Redis key using the defined namespace. + + Returns: + str: The base Redis key, which is the namespace used for all user session keys. + """ return f"{self.namespace}" def register_user_session(self, uuid, sid): + """ + Registers a user's session ID (sid) in Redis under their unique identifier (uuid). + + This method adds the session ID to a Redis set associated with the user's UUID, + allowing for multiple active sessions per user. + + Args: + uuid (str): The unique identifier for the user. + sid (str): The session ID to be associated with the user's UUID. + + Returns: + None + """ self.redis.sadd(f"{self._get_redis_key()}:{uuid}", sid) def remove_user_session(self, uuid, sid): + """ + Removes a user's session ID (sid) from Redis. + + This method removes the specified session ID from the Redis set associated with + the user's UUID. If the set becomes empty after removal, the set is deleted. + + Args: + uuid (str): The unique identifier for the user. + sid (str): The session ID to be removed from the user's session set. + + Returns: + None + """ self.redis.srem(f"{self._get_redis_key()}:{uuid}", sid) if self.redis.scard(f"{self._get_redis_key()}:{uuid}") == 0: self.redis.delete(f"{self._get_redis_key()}:{uuid}") def get_user_sessions(self, uuid): + """ + Retrieves a list of session IDs for a given user UUID. + + This method fetches all session IDs associated with the specified user UUID + from Redis and decodes them from bytes to strings. + + Args: + uuid (str): The unique identifier for the user. + + Returns: + list: A list of session IDs (strings) associated with the given UUID. + """ sids = self.redis.smembers(f"{self._get_redis_key()}:{uuid}") return [sid.decode("utf-8") for sid in sids] def get_user_session(self, uuid, sid): + """ + Checks if a specific session ID exists for a given user UUID. + + This method retrieves all session IDs associated with the specified user UUID + from Redis and checks if the provided session ID is among them. It returns + the session ID if it exists, otherwise it returns None. + + Args: + uuid (str): The unique identifier for the user. + sid (str): The session ID to check. + + Returns: + str or None: The session ID if it exists for the given UUID, otherwise None. + """ sids = self.redis.smembers(f"{self._get_redis_key()}:{uuid}") return sid if sid in [s.decode("utf-8") for s in sids] else None def get_all_sessions(self): + """ + Retrieves all user sessions from Redis. + + This method fetches all keys matching the pattern for user sessions and + constructs a dictionary where each key is a user UUID and the value is + a list of session IDs associated with that UUID. + + Returns: + dict: A dictionary mapping user UUIDs to lists of session IDs. Each key + is a UUID, and the value is a list of session IDs (strings) for that UUID. + """ keys = self.redis.keys(f"{self._get_redis_key()}:*") return { key.decode("utf-8").split(":")[1]: [ @@ -36,6 +165,17 @@ def get_all_sessions(self): } def remove_all_sessions(self): + """ + Removes all user sessions from Redis. + + This method deletes all session keys from Redis that match the pattern + for user sessions. This operation clears out all stored session information + for all users. + + Returns: + None: This method does not return any value. It performs the action of + deleting the session data. + """ keys = self.redis.keys(f"{self._get_redis_key()}:*") for key in keys: self.redis.delete(key) diff --git a/app/front-end/src/features/editor/components/fileTreeView/fileTreeItem/fileTreeItem.tsx b/app/front-end/src/features/editor/components/fileTreeView/fileTreeItem/fileTreeItem.tsx index 16adf5b..332636d 100644 --- a/app/front-end/src/features/editor/components/fileTreeView/fileTreeItem/fileTreeItem.tsx +++ b/app/front-end/src/features/editor/components/fileTreeView/fileTreeItem/fileTreeItem.tsx @@ -1,7 +1,7 @@ import { useWorkspaceContext } from '@/features/editor/hooks'; import { getIconFromFileType, isExpandable } from '@/features/editor/utils'; import { FileTypes } from '@/types'; -import FolderRounded from '@mui/icons-material/FolderRounded'; +import { FolderRounded as FolderRoundedIcon } from '@mui/icons-material'; import Collapse from '@mui/material/Collapse'; import { alpha, styled } from '@mui/material/styles'; import { TransitionProps } from '@mui/material/transitions'; @@ -128,7 +128,7 @@ export const FileTreeItem = React.forwardRef(function CustomTreeItem( const expandable = isExpandable(children); let icon; if (expandable) { - icon = FolderRounded; + icon = FolderRoundedIcon; } else if (item.fileType) { icon = getIconFromFileType(item.fileType); } From 62c800eea28f4b9d4a175bbae11b7f2b822f2845 Mon Sep 17 00:00:00 2001 From: Mantvydas Deltuva Date: Fri, 23 Aug 2024 01:19:27 +0300 Subject: [PATCH 2/2] MDE more refactoring --- GUI/README.md | 72 - GUI/back-end/.env.development | 1 - GUI/back-end/.env.production | 1 - GUI/back-end/key | 0 GUI/back-end/main.py | 75 - GUI/back-end/requirements.txt | Bin 350 -> 0 bytes GUI/back-end/router.py | 13 - GUI/back-end/routes/__init__.py | 4 - GUI/back-end/routes/profiles.py | 16 - GUI/back-end/routes/users.py | 16 - GUI/front-end/.env.development | 1 - GUI/front-end/.env.production | 1 - GUI/front-end/.eslintrc.cjs | 18 - GUI/front-end/.gitignore | 24 - GUI/front-end/index.html | 43 - GUI/front-end/package-lock.json | 4077 ----------------- GUI/front-end/package.json | 34 - .../public/svgs/Kath_OnlyText_Dark.svg | 31 - .../public/svgs/Kath_OnlyText_Light.svg | 31 - GUI/front-end/public/svgs/Logo.svg | 20 - .../components/displays/chat/ChatDisplay.tsx | 66 - .../components/displays/chat/ChatGroup.tsx | 36 - .../components/displays/chat/ChatInstance.tsx | 76 - .../displays/chat/InputInstance.tsx | 73 - .../displays/extension/ExtensionDisplay.tsx | 64 - .../extension/FunctionalityInstance.tsx | 51 - .../displays/extension/HistoryInstance.tsx | 20 - .../src/components/displays/index.ts | 3 - .../displays/settings/SettingsDisplay.tsx | 143 - .../displays/settings/SettingsGroup.tsx | 30 - .../displays/settings/SettingsInstance.tsx | 154 - GUI/front-end/src/components/svgs/index.ts | 1 - .../src/components/svgs/logo/KathLogo.tsx | 61 - .../ApplicationContextProvider.tsx | 38 - .../application/UseApplicationContext.ts | 4 - GUI/front-end/src/contexts/index.ts | 8 - .../language/LanguageContextProvider.tsx | 45 - .../contexts/language/UseLanguageContext.ts | 4 - .../contexts/theme/ThemeContextProvider.tsx | 114 - .../src/contexts/theme/UseThemeContext.ts | 4 - .../src/contexts/tool/ToolContextProvider.tsx | 41 - .../src/contexts/tool/UseToolContext.ts | 4 - GUI/front-end/src/css/app/App.css | 34 - GUI/front-end/src/hooks/index.ts | 2 - .../src/hooks/request/requestHook.ts | 13 - GUI/front-end/src/hooks/user/userHook.ts | 11 - GUI/front-end/src/main/app/App.tsx | 83 - GUI/front-end/src/main/layout/BaseLayout.tsx | 137 - .../src/main/layout/HeaderLayout.tsx | 33 - GUI/front-end/src/main/main.tsx | 28 - GUI/front-end/src/services/httpClient.ts | 11 - GUI/front-end/src/services/index.ts | 2 - .../src/services/request/requestService.ts | 12 - .../src/services/user/userService.ts | 13 - .../src/types/constants/constants.ts | 1 - .../src/types/constants/endpoints.ts | 6 - GUI/front-end/src/types/constants/index.ts | 2 - GUI/front-end/src/types/enum/Color.ts | 19 - GUI/front-end/src/types/enum/index.ts | 1 - GUI/front-end/src/vite-env.d.ts | 1 - GUI/front-end/tsconfig.json | 25 - GUI/front-end/tsconfig.node.json | 11 - GUI/front-end/vite.config.ts | 18 - app/back-end/src/events/workspace_event.py | 115 +- app/back-end/src/setup/eventer.py | 8 +- 65 files changed, 72 insertions(+), 6032 deletions(-) delete mode 100644 GUI/README.md delete mode 100644 GUI/back-end/.env.development delete mode 100644 GUI/back-end/.env.production delete mode 100644 GUI/back-end/key delete mode 100644 GUI/back-end/main.py delete mode 100644 GUI/back-end/requirements.txt delete mode 100644 GUI/back-end/router.py delete mode 100644 GUI/back-end/routes/__init__.py delete mode 100644 GUI/back-end/routes/profiles.py delete mode 100644 GUI/back-end/routes/users.py delete mode 100644 GUI/front-end/.env.development delete mode 100644 GUI/front-end/.env.production delete mode 100644 GUI/front-end/.eslintrc.cjs delete mode 100644 GUI/front-end/.gitignore delete mode 100644 GUI/front-end/index.html delete mode 100644 GUI/front-end/package-lock.json delete mode 100644 GUI/front-end/package.json delete mode 100644 GUI/front-end/public/svgs/Kath_OnlyText_Dark.svg delete mode 100644 GUI/front-end/public/svgs/Kath_OnlyText_Light.svg delete mode 100644 GUI/front-end/public/svgs/Logo.svg delete mode 100644 GUI/front-end/src/components/displays/chat/ChatDisplay.tsx delete mode 100644 GUI/front-end/src/components/displays/chat/ChatGroup.tsx delete mode 100644 GUI/front-end/src/components/displays/chat/ChatInstance.tsx delete mode 100644 GUI/front-end/src/components/displays/chat/InputInstance.tsx delete mode 100644 GUI/front-end/src/components/displays/extension/ExtensionDisplay.tsx delete mode 100644 GUI/front-end/src/components/displays/extension/FunctionalityInstance.tsx delete mode 100644 GUI/front-end/src/components/displays/extension/HistoryInstance.tsx delete mode 100644 GUI/front-end/src/components/displays/index.ts delete mode 100644 GUI/front-end/src/components/displays/settings/SettingsDisplay.tsx delete mode 100644 GUI/front-end/src/components/displays/settings/SettingsGroup.tsx delete mode 100644 GUI/front-end/src/components/displays/settings/SettingsInstance.tsx delete mode 100644 GUI/front-end/src/components/svgs/index.ts delete mode 100644 GUI/front-end/src/components/svgs/logo/KathLogo.tsx delete mode 100644 GUI/front-end/src/contexts/application/ApplicationContextProvider.tsx delete mode 100644 GUI/front-end/src/contexts/application/UseApplicationContext.ts delete mode 100644 GUI/front-end/src/contexts/index.ts delete mode 100644 GUI/front-end/src/contexts/language/LanguageContextProvider.tsx delete mode 100644 GUI/front-end/src/contexts/language/UseLanguageContext.ts delete mode 100644 GUI/front-end/src/contexts/theme/ThemeContextProvider.tsx delete mode 100644 GUI/front-end/src/contexts/theme/UseThemeContext.ts delete mode 100644 GUI/front-end/src/contexts/tool/ToolContextProvider.tsx delete mode 100644 GUI/front-end/src/contexts/tool/UseToolContext.ts delete mode 100644 GUI/front-end/src/css/app/App.css delete mode 100644 GUI/front-end/src/hooks/index.ts delete mode 100644 GUI/front-end/src/hooks/request/requestHook.ts delete mode 100644 GUI/front-end/src/hooks/user/userHook.ts delete mode 100644 GUI/front-end/src/main/app/App.tsx delete mode 100644 GUI/front-end/src/main/layout/BaseLayout.tsx delete mode 100644 GUI/front-end/src/main/layout/HeaderLayout.tsx delete mode 100644 GUI/front-end/src/main/main.tsx delete mode 100644 GUI/front-end/src/services/httpClient.ts delete mode 100644 GUI/front-end/src/services/index.ts delete mode 100644 GUI/front-end/src/services/request/requestService.ts delete mode 100644 GUI/front-end/src/services/user/userService.ts delete mode 100644 GUI/front-end/src/types/constants/constants.ts delete mode 100644 GUI/front-end/src/types/constants/endpoints.ts delete mode 100644 GUI/front-end/src/types/constants/index.ts delete mode 100644 GUI/front-end/src/types/enum/Color.ts delete mode 100644 GUI/front-end/src/types/enum/index.ts delete mode 100644 GUI/front-end/src/vite-env.d.ts delete mode 100644 GUI/front-end/tsconfig.json delete mode 100644 GUI/front-end/tsconfig.node.json delete mode 100644 GUI/front-end/vite.config.ts diff --git a/GUI/README.md b/GUI/README.md deleted file mode 100644 index cb398fc..0000000 --- a/GUI/README.md +++ /dev/null @@ -1,72 +0,0 @@ -# Kath UI Repository - -Welcome to the Kath UI repository! This repository contains the front-end and back-end code for the Kath project. - -## Front-end - -The front-end is built with Vite, a next-generation frontend tooling. To run the front-end, follow these steps: - -1. Navigate to the `front-end` directory: - - ``` - cd front-end - ``` - -2. Install dependencies using npm: - - ``` - npm install - ``` - -3. Run the development server: - ``` - npm run dev - ``` - -This will start the development server and open the application in your default web browser at [http://localhost:3000](http://localhost:3000). - -## Back-end - -The back-end is built with Flask, a lightweight WSGI web application framework. To run the back-end, follow these steps: - -1. Navigate to the `back-end` directory: - - ``` - cd back-end - ``` - -2. Create a virtual environment (venv): - - ``` - python -m venv venv - ``` - -3. Activate the virtual environment: - - - On Windows: - ``` - venv/Scripts/activate - ``` - - On macOS/Linux: - ``` - source venv/bin/activate - ``` - -4. Once the virtual environment is activated, install dependencies using pip: - - ``` - pip install -r requirements.txt - ``` - -5. Select the interpreter from the virtual environment in your code editor or IDE: - - - [VS Code](https://code.visualstudio.com/docs/python/environments): Click on the interpreter version in the bottom right corner and select the one from the `venv` directory. - -6. Run the Flask application: - ``` - python main.py - ``` - -This will start the Flask development server, and your back-end will be up and running. - -The back-end will be accessible at [http://localhost:8080](http://localhost:8080). diff --git a/GUI/back-end/.env.development b/GUI/back-end/.env.development deleted file mode 100644 index bb4d26b..0000000 --- a/GUI/back-end/.env.development +++ /dev/null @@ -1 +0,0 @@ -ORIGINS=http://localhost:3000 \ No newline at end of file diff --git a/GUI/back-end/.env.production b/GUI/back-end/.env.production deleted file mode 100644 index 9da657e..0000000 --- a/GUI/back-end/.env.production +++ /dev/null @@ -1 +0,0 @@ -ORIGINS=http://website.com \ No newline at end of file diff --git a/GUI/back-end/key b/GUI/back-end/key deleted file mode 100644 index e69de29..0000000 diff --git a/GUI/back-end/main.py b/GUI/back-end/main.py deleted file mode 100644 index 0a8237c..0000000 --- a/GUI/back-end/main.py +++ /dev/null @@ -1,75 +0,0 @@ -import logging - -from flask import Flask, request -from flask_cors import CORS -from dotenv import load_dotenv -import os -import sys -from io import StringIO -import openai -from data_collection import * - -from router import router_bp - - -prime_prompt_text = 'You are KATH tool, don\'t give more than one code example in any case. Your purpose is to convert scientists prompts into Python code. You have function for downloading data from databases. When person asks you to download data use "store_database_for_eys_gene" Python function. store_database function download data from GnomAd, Clinvar and LOVD. To download data pass name of database in lowercase. Examples: store_database_for_eys_gene(\'clinvar\'), store_database_for_eys_gene(\'gnomad\'), store_database_for_eys_gene(\'lovd\'). You also have "parse_lovd" function that will parse data from text file with downloaded data. If persons requests parsing data from lovd use this functions like this `parsed_data = parse_lovd()` where `parsed_data` is retrieved data. After you retrieve data from parse function you can print it, if user ask to print parsed data provide `print(parsed_data)` where `parsed_data` is data you got from `parse_lovd` funciton. When person asks to download data from database, print just generated function with passed arguments and nothing more. You also have "set_lovd_dtypes" function that will set data types to parsed lovd data. Always use this function after you parsed data, use it like this `set_lovd_dtypes(parsed_data)` where `parsed_data` is parsed lovd data. You also have "save_lovd_to_vcf" function that will convert data to vcf format. If persons requests converting to vcf use this functions like this `save_lovd_as_vcf(data)` where `data` is parsed lovd data.' -# Determine the environment -environment = os.getenv('ENVIRONMENT', 'development') -if environment == 'production': - dotenv_path = '.env.production' -else: - dotenv_path = '.env.development' - -# Load environment variables -load_dotenv(dotenv_path) - -# Set environment variables -origins = os.getenv('ORIGINS') - -# Create a Flask app -app = Flask(__name__) - -# Routing -app.register_blueprint(router_bp('/api/v1')) - -# Configurations -cors = CORS(app, resources={r"/*": {"origins": "*"}}) - - -@app.route('/api/v1/request', methods=['POST']) -def process(): - request_data = request.get_json() - print("Got data") - logging.info(request_data) - if not request_data: - return '' - - with open("key") as f: - openai.api_key = f.readline().strip() - - discussions = [{"role": "system", "content": prime_prompt_text}] - discussions.append({"role": "user", "content": request_data}) - - response = openai.chat.completions.create( - model="gpt-3.5-turbo", - messages=discussions, - ) - - answer = response.choices[0].message.content - - api_answer = answer + '\n\n' - if '```' in api_answer and '```python' in api_answer: - execute = api_answer[api_answer.find('```python') + 9:api_answer.rfind('```')] - old_stdout = sys.stdout - redirected_output = sys.stdout = StringIO() - exec(execute) - sys.stdout = old_stdout - - api_answer += redirected_output.getvalue() - # api_answer = execute - return api_answer.replace('\n', '\n\n') - - -# Run the app -if __name__ == '__main__': - app.run(debug=True, host='0.0.0.0', port=8080) \ No newline at end of file diff --git a/GUI/back-end/requirements.txt b/GUI/back-end/requirements.txt deleted file mode 100644 index 23e597ccd30367da13cf5eb70450b3c7544e78a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350 zcmZ8cyAFat5S-e?Pk|u#YOG8wOsp)d5m6E42#AS(ygEB4jUgNEcAocn?{P(e3MFzh zSnwMm#EcVRhygO;8F9nr+S63D)owZiuR{Y>w&A{Ej}A4qJRj-Rdl+k?PBos) jJF`uNfT@nRoacwQ#CZ*Zsyj%Fc#wrMiMgL diff --git a/GUI/back-end/router.py b/GUI/back-end/router.py deleted file mode 100644 index 4cbba2d..0000000 --- a/GUI/back-end/router.py +++ /dev/null @@ -1,13 +0,0 @@ -from flask import Blueprint -from routes import route_users_bp, route_profiles_bp - -def router_bp(prefix): - router_bp = Blueprint('router', __name__, url_prefix=prefix) - - # Register routes - ### THESE LINES ARE ONLY FOR EXAMPLE PURPOSES ### - router_bp.register_blueprint(route_users_bp) - router_bp.register_blueprint(route_profiles_bp) - ################################################# - - return router_bp \ No newline at end of file diff --git a/GUI/back-end/routes/__init__.py b/GUI/back-end/routes/__init__.py deleted file mode 100644 index 0d83d32..0000000 --- a/GUI/back-end/routes/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -### THESE LINES ARE ONLY FOR EXAMPLE PURPOSES ### -from .profiles import route_profiles_bp -from .users import route_users_bp -################################################# \ No newline at end of file diff --git a/GUI/back-end/routes/profiles.py b/GUI/back-end/routes/profiles.py deleted file mode 100644 index 60d80e1..0000000 --- a/GUI/back-end/routes/profiles.py +++ /dev/null @@ -1,16 +0,0 @@ -### THIS FILE IS ONLY FOR EXAMPLE PURPOSES ### -from flask import Blueprint, jsonify - -route_profiles_bp = Blueprint('profiles', __name__) - -@route_profiles_bp.route('/profiles', methods=['GET']) -def get_profiles(): - return jsonify( - { - 'profiles': [ - 'Dom', - 'Helo', - 'Syn' - ] - } - ) \ No newline at end of file diff --git a/GUI/back-end/routes/users.py b/GUI/back-end/routes/users.py deleted file mode 100644 index 215b9b8..0000000 --- a/GUI/back-end/routes/users.py +++ /dev/null @@ -1,16 +0,0 @@ -### THIS FILE IS ONLY FOR EXAMPLE PURPOSES ### -from flask import Blueprint, jsonify - -route_users_bp = Blueprint('users', __name__) - -@route_users_bp.route('/users', methods=['GET']) -def get_users(): - return jsonify( - { - 'users': [ - 'Mantvydas', - 'Tomas', - 'Lukas' - ] - } - ) diff --git a/GUI/front-end/.env.development b/GUI/front-end/.env.development deleted file mode 100644 index fa59a61..0000000 --- a/GUI/front-end/.env.development +++ /dev/null @@ -1 +0,0 @@ -VITE_API_URL=http://34.31.24.160:8080/api/v1 \ No newline at end of file diff --git a/GUI/front-end/.env.production b/GUI/front-end/.env.production deleted file mode 100644 index d2059c0..0000000 --- a/GUI/front-end/.env.production +++ /dev/null @@ -1 +0,0 @@ -VITE_API_URL=http://website.com/api/v1 \ No newline at end of file diff --git a/GUI/front-end/.eslintrc.cjs b/GUI/front-end/.eslintrc.cjs deleted file mode 100644 index d6c9537..0000000 --- a/GUI/front-end/.eslintrc.cjs +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - root: true, - env: { browser: true, es2020: true }, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react-hooks/recommended', - ], - ignorePatterns: ['dist', '.eslintrc.cjs'], - parser: '@typescript-eslint/parser', - plugins: ['react-refresh'], - rules: { - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, -} diff --git a/GUI/front-end/.gitignore b/GUI/front-end/.gitignore deleted file mode 100644 index a547bf3..0000000 --- a/GUI/front-end/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/GUI/front-end/index.html b/GUI/front-end/index.html deleted file mode 100644 index 67b8b97..0000000 --- a/GUI/front-end/index.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - kath - - -
- - - - diff --git a/GUI/front-end/package-lock.json b/GUI/front-end/package-lock.json deleted file mode 100644 index a4dd900..0000000 --- a/GUI/front-end/package-lock.json +++ /dev/null @@ -1,4077 +0,0 @@ -{ - "name": "front-end", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "front-end", - "version": "0.0.0", - "dependencies": { - "@emotion/react": "^11.11.4", - "@emotion/styled": "^11.11.5", - "@mui/icons-material": "^5.15.15", - "@mui/material": "^5.15.15", - "@tanstack/react-query": "^5.34.1", - "axios": "^1.6.8", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@types/react": "^18.2.66", - "@types/react-dom": "^18.2.22", - "@typescript-eslint/eslint-plugin": "^7.2.0", - "@typescript-eslint/parser": "^7.2.0", - "@vitejs/plugin-react": "^4.2.1", - "eslint": "^8.57.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.6", - "typescript": "^5.2.2", - "vite": "^5.2.0" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", - "dependencies": { - "@babel/highlight": "^7.24.2", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "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" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", - "dependencies": { - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz", - "integrity": "sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz", - "integrity": "sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", - "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@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.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@emotion/babel-plugin": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", - "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/serialize": "^1.1.2", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@emotion/cache": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", - "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", - "dependencies": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", - "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", - "dependencies": { - "@emotion/memoize": "^0.8.1" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "node_modules/@emotion/react": { - "version": "11.11.4", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", - "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "hoist-non-react-statics": "^3.3.1" - }, - "peerDependencies": { - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/serialize": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", - "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", - "dependencies": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", - "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" - }, - "node_modules/@emotion/styled": { - "version": "11.11.5", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", - "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/is-prop-valid": "^1.2.2", - "@emotion/serialize": "^1.1.4", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1" - }, - "peerDependencies": { - "@emotion/react": "^11.0.0-rc.0", - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@emotion/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "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" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", - "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", - "dependencies": { - "@floating-ui/utils": "^0.2.1" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", - "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", - "dependencies": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", - "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", - "dependencies": { - "@floating-ui/dom": "^1.6.1" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@mui/base": { - "version": "5.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", - "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@floating-ui/react-dom": "^2.0.8", - "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.14", - "@popperjs/core": "^2.11.8", - "clsx": "^2.1.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.15", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.15.tgz", - "integrity": "sha512-aXnw29OWQ6I5A47iuWEI6qSSUfH6G/aCsW9KmW3LiFqr7uXZBK4Ks+z8G+qeIub8k0T5CMqlT2q0L+ZJTMrqpg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - } - }, - "node_modules/@mui/icons-material": { - "version": "5.15.15", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.15.tgz", - "integrity": "sha512-kkeU/pe+hABcYDH6Uqy8RmIsr2S/y5bP2rp+Gat4CcRjCcVne6KudS1NrZQhUCRysrTDCAhcbcf9gt+/+pGO2g==", - "dependencies": { - "@babel/runtime": "^7.23.9" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@mui/material": "^5.0.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/material": { - "version": "5.15.15", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.15.tgz", - "integrity": "sha512-3zvWayJ+E1kzoIsvwyEvkTUKVKt1AjchFFns+JtluHCuvxgKcLSRJTADw37k0doaRtVAsyh8bz9Afqzv+KYrIA==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/base": "5.0.0-beta.40", - "@mui/core-downloads-tracker": "^5.15.15", - "@mui/system": "^5.15.15", - "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.14", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.1.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1", - "react-is": "^18.2.0", - "react-transition-group": "^4.4.5" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/private-theming": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz", - "integrity": "sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.15.14", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/styled-engine": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz", - "integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@emotion/cache": "^11.11.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.4.1", - "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - } - } - }, - "node_modules/@mui/system": { - "version": "5.15.15", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz", - "integrity": "sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.15.14", - "@mui/styled-engine": "^5.15.14", - "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.14", - "clsx": "^2.1.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/types": { - "version": "7.2.14", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz", - "integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==", - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/utils": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz", - "integrity": "sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@types/prop-types": "^15.7.11", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz", - "integrity": "sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz", - "integrity": "sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz", - "integrity": "sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz", - "integrity": "sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz", - "integrity": "sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz", - "integrity": "sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz", - "integrity": "sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz", - "integrity": "sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz", - "integrity": "sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz", - "integrity": "sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz", - "integrity": "sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz", - "integrity": "sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz", - "integrity": "sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz", - "integrity": "sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz", - "integrity": "sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.4.tgz", - "integrity": "sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@tanstack/query-core": { - "version": "5.34.1", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.34.1.tgz", - "integrity": "sha512-/a4yTnX525QUl8rFULrDLIogjqqcY/CiVvS/vWMgl477mO4WIIDxwQsLvEgb7vzlW8FqX/9CiCmaiAUnYVgB1w==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-query": { - "version": "5.34.1", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.34.1.tgz", - "integrity": "sha512-5DWzrK+ou5maZqVoIY0S26TYNpnA7re6JlviXVOe/4OBPtlvd4WEHJmyeLZhE43piJvrsKMxemp/f6Q2RPfebA==", - "dependencies": { - "@tanstack/query-core": "5.34.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" - }, - "node_modules/@types/react": { - "version": "18.2.79", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.79.tgz", - "integrity": "sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.25", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.25.tgz", - "integrity": "sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", - "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.1.tgz", - "integrity": "sha512-KwfdWXJBOviaBVhxO3p5TJiLpNuh2iyXyjmWN0f1nU87pwyvfS0EmjC6ukQVYVFJd/K1+0NWGPDXiyEyQorn0Q==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.7.1", - "@typescript-eslint/type-utils": "7.7.1", - "@typescript-eslint/utils": "7.7.1", - "@typescript-eslint/visitor-keys": "7.7.1", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.7.1.tgz", - "integrity": "sha512-vmPzBOOtz48F6JAGVS/kZYk4EkXao6iGrD838sp1w3NQQC0W8ry/q641KU4PrG7AKNAf56NOcR8GOpH8l9FPCw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "7.7.1", - "@typescript-eslint/types": "7.7.1", - "@typescript-eslint/typescript-estree": "7.7.1", - "@typescript-eslint/visitor-keys": "7.7.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.1.tgz", - "integrity": "sha512-PytBif2SF+9SpEUKynYn5g1RHFddJUcyynGpztX3l/ik7KmZEv19WCMhUBkHXPU9es/VWGD3/zg3wg90+Dh2rA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.7.1", - "@typescript-eslint/visitor-keys": "7.7.1" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.7.1.tgz", - "integrity": "sha512-ZksJLW3WF7o75zaBPScdW1Gbkwhd/lyeXGf1kQCxJaOeITscoSl0MjynVvCzuV5boUz/3fOI06Lz8La55mu29Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "7.7.1", - "@typescript-eslint/utils": "7.7.1", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.1.tgz", - "integrity": "sha512-AmPmnGW1ZLTpWa+/2omPrPfR7BcbUU4oha5VIbSbS1a1Tv966bklvLNXxp3mrbc+P2j4MNOTfDffNsk4o0c6/w==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.1.tgz", - "integrity": "sha512-CXe0JHCXru8Fa36dteXqmH2YxngKJjkQLjxzoj6LYwzZ7qZvgsLSc+eqItCrqIop8Vl2UKoAi0StVWu97FQZIQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.7.1", - "@typescript-eslint/visitor-keys": "7.7.1", - "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" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.7.1.tgz", - "integrity": "sha512-QUvBxPEaBXf41ZBbaidKICgVL8Hin0p6prQDu6bbetWo39BKbWJxRsErOzMNT1rXvTll+J7ChrbmMCXM9rsvOQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.7.1", - "@typescript-eslint/types": "7.7.1", - "@typescript-eslint/typescript-estree": "7.7.1", - "semver": "^7.6.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.1.tgz", - "integrity": "sha512-gBL3Eq25uADw1LQ9kVpf3hRM+DWzs0uZknHYK3hq4jcTPqVCClHGDnB6UUUV2SFeBeA4KWHWbbLqmbGcZ4FYbw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.7.1", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", - "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.5", - "@babel/plugin-transform-react-jsx-self": "^7.23.3", - "@babel/plugin-transform-react-jsx-source": "^7.23.3", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" - } - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "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" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001612", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz", - "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "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" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.748", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.748.tgz", - "integrity": "sha512-VWqjOlPZn70UZ8FTKUOkUvBLeTQ0xpty66qV0yJcAGY2/CthI4xyW9aEozRVtuwv3Kpf5xTesmJUcPwuJmgP4A==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "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" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.6.tgz", - "integrity": "sha512-NjGXdm7zgcKRkKMua34qVO9doI7VOxZ6ancSvBELJSSoX97jyndXcSoa8XBh69JoB31dNz3EEzlMcizZl7LaMA==", - "dev": true, - "peerDependencies": { - "eslint": ">=7" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "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" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "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" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-is": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.0.tgz", - "integrity": "sha512-wRiUsea88TjKDc4FBEn+sLvIDesp6brMbGWnJGjew2waAc9evdhja/2LvePc898HJbHw0L+MTWy7NhpnELAvLQ==" - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz", - "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.16.4", - "@rollup/rollup-android-arm64": "4.16.4", - "@rollup/rollup-darwin-arm64": "4.16.4", - "@rollup/rollup-darwin-x64": "4.16.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.16.4", - "@rollup/rollup-linux-arm-musleabihf": "4.16.4", - "@rollup/rollup-linux-arm64-gnu": "4.16.4", - "@rollup/rollup-linux-arm64-musl": "4.16.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4", - "@rollup/rollup-linux-riscv64-gnu": "4.16.4", - "@rollup/rollup-linux-s390x-gnu": "4.16.4", - "@rollup/rollup-linux-x64-gnu": "4.16.4", - "@rollup/rollup-linux-x64-musl": "4.16.4", - "@rollup/rollup-win32-arm64-msvc": "4.16.4", - "@rollup/rollup-win32-ia32-msvc": "4.16.4", - "@rollup/rollup-win32-x64-msvc": "4.16.4", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/vite": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", - "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", - "dev": true, - "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.38", - "rollup": "^4.13.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/GUI/front-end/package.json b/GUI/front-end/package.json deleted file mode 100644 index 364b3d8..0000000 --- a/GUI/front-end/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "front-end", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" - }, - "dependencies": { - "@emotion/react": "^11.11.4", - "@emotion/styled": "^11.11.5", - "@mui/icons-material": "^5.15.15", - "@mui/material": "^5.15.15", - "@tanstack/react-query": "^5.34.1", - "axios": "^1.6.8", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@types/react": "^18.2.66", - "@types/react-dom": "^18.2.22", - "@typescript-eslint/eslint-plugin": "^7.2.0", - "@typescript-eslint/parser": "^7.2.0", - "@vitejs/plugin-react": "^4.2.1", - "eslint": "^8.57.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.6", - "typescript": "^5.2.2", - "vite": "^5.2.0" - } -} diff --git a/GUI/front-end/public/svgs/Kath_OnlyText_Dark.svg b/GUI/front-end/public/svgs/Kath_OnlyText_Dark.svg deleted file mode 100644 index a70834c..0000000 --- a/GUI/front-end/public/svgs/Kath_OnlyText_Dark.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/GUI/front-end/public/svgs/Kath_OnlyText_Light.svg b/GUI/front-end/public/svgs/Kath_OnlyText_Light.svg deleted file mode 100644 index 7ec10f8..0000000 --- a/GUI/front-end/public/svgs/Kath_OnlyText_Light.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/GUI/front-end/public/svgs/Logo.svg b/GUI/front-end/public/svgs/Logo.svg deleted file mode 100644 index e499051..0000000 --- a/GUI/front-end/public/svgs/Logo.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/GUI/front-end/src/components/displays/chat/ChatDisplay.tsx b/GUI/front-end/src/components/displays/chat/ChatDisplay.tsx deleted file mode 100644 index 9ababf5..0000000 --- a/GUI/front-end/src/components/displays/chat/ChatDisplay.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import InputInstance from './InputInstance'; -import React from 'react'; -import ChatGroup from './ChatGroup'; -import ChatInstance from './ChatInstance'; -import { AccountCircle as AccountCircleIcon } from '@mui/icons-material'; -import { useApplicationContext } from '../../../contexts'; -import { KathLogo } from '../../svgs'; -import { useSendRequest } from '../../../hooks'; - -interface Props {} - -export const ChatDisplay: React.FC = () => { - const [ChatInstances, setChatInstances] = React.useState([]); - const [isInputDisabled, setIsInputDisabled] = React.useState(false); - - const applicationContext = useApplicationContext(); - const sendRequest = useSendRequest(); - - // Array of mock-up texts - // const mockUpTexts = [ - // 'Gene frequencies can change over time due to natural selection, mutation, genetic drift, and gene flow.', - // 'The BRCA1 gene, linked to breast cancer, is a subject of extensive research.', - // 'Genome-wide association studies (GWAS) have identified numerous genetic variants associated with complex diseases.', - // 'In the field of genetics, the concept of gene frequency is of paramount importance. It refers to the frequency with which a particular gene variant occurs in a population. This frequency can change over time due to various evolutionary forces such as natural selection, mutation, genetic drift, and gene flow. For instance, if a gene variant confers a survival advantage, its frequency may increase in the population over generations due to natural selection.', - // 'One of the most researched genes in human genetics is the BRCA1 gene. This gene produces a protein that helps suppress the growth of tumors. Mutations in the BRCA1 gene can lead to a significantly increased risk for breast and ovarian cancer. Researchers are continually studying this gene to understand its function better and develop effective therapies for individuals carrying BRCA1 mutations.', - // 'Genome-wide association studies (GWAS) have revolutionized our understanding of the genetic basis of complex diseases. These studies involve scanning the genomes of thousands of individuals to identify genetic variants associated with a particular disease. For example, GWAS have identified numerous genetic variants associated with diseases such as diabetes, heart disease, and various forms of cancer. However, most of these variants only slightly increase the risk of disease, indicating that these diseases are influenced by a combination of genetic, environmental, and lifestyle factors.', - // 'The study of gene frequencies, also known as population genetics, is a fascinating and complex field that seeks to understand how genetic variation occurs within and between populations. This field of study is critical for understanding evolution, genetic diseases, and biodiversity. Gene frequencies can change over time due to several factors, including natural selection, mutation, genetic drift, and gene flow. Natural selection is the process by which certain traits become more or less common in a population based on the survival and reproductive success of individuals with those traits. Mutations, which are changes in the DNA sequence, can introduce new genetic variants into a population. Genetic drift is a random process that can cause gene frequencies to change from one generation to the next, particularly in small populations. Gene flow, which is the transfer of genetic variation from one population to another, can also affect gene frequencies.\n\nOne area of intense research in human genetics is the study of specific genes associated with diseases. For example, the BRCA1 and BRCA2 genes are known to be associated with a higher risk of breast and ovarian cancer. These genes produce proteins that help repair damaged DNA, and when these genes are mutated, the DNA repair process may not function correctly, leading to the development of cancer. Extensive research is being conducted to better understand these genes and develop effective therapies for individuals carrying these mutations.\n\nAnother important area of research is genome-wide association studies (GWAS), which aim to identify genetic variants associated with specific diseases. These studies involve scanning the genomes of thousands of individuals to identify genetic variants that are more common in individuals with a particular disease compared to healthy individuals. GWAS have identified numerous genetic variants associated with a wide range of diseases, including diabetes, heart disease, and various forms of cancer. However, most of these variants only slightly increase the risk of disease, indicating that these diseases are influenced by a combination of genetic, environmental, and lifestyle factors.Despite the significant advances in our understanding of human genetics, there is still much to learn. For example, many of the genetic variants identified by GWAS explain only a small fraction of the heritability of complex diseases, suggesting that there are likely many more genetic variants to be discovered. Furthermore, the role of rare genetic variants, which are not well captured by GWAS, is an area of active research. There is also increasing interest in understanding the role of non-coding regions of the genome, which do not code for proteins but may play important roles in regulating gene expression. As our understanding of human genetics continues to evolve, it is clear that this field of research will continue to provide important insights into human health and disease.\n\nPlease note that this is a simplified explanation and the actual research in genetics is much more complex and nuanced. For accurate and up-to-date information, please refer to scientific literature or consult a genetics professional.', - // ]; - ///////////////////////// - - const handleSubmit = async (content: string) => { - setIsInputDisabled(true); - setChatInstances((prevInstances) => [ - ...prevInstances, - } author='User' content={content} />, - ]); - - const responseResult = await sendRequest.mutateAsync(content); - setIsInputDisabled(false); - - setChatInstances((prevInstances) => [ - ...prevInstances, - } author={applicationContext.name} content={responseResult} />, - ]); - - // Temporary mock up response - // setTimeout(() => { - // const randomIndex = Math.floor(Math.random() * mockUpTexts.length); - // const randomMockUpText = mockUpTexts[randomIndex]; - - // setChatInstances((prevInstances) => [ - // ...prevInstances, - // } author={applicationContext.name} content={randomMockUpText} />, - // ]); - // setIsInputDisabled(false); - // }, 1000); - /////////////////////////////////////// - }; - - return ( - - - - - ); -}; diff --git a/GUI/front-end/src/components/displays/chat/ChatGroup.tsx b/GUI/front-end/src/components/displays/chat/ChatGroup.tsx deleted file mode 100644 index c371cbc..0000000 --- a/GUI/front-end/src/components/displays/chat/ChatGroup.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { Box } from '@mui/material'; -import React, { useEffect, useRef } from 'react'; - -interface Props { - instances: React.ReactNode[]; -} - -const ChatGroup: React.FC = (props) => { - const endRef = useRef(null); - - useEffect(() => { - if (endRef.current) { - endRef.current.scrollIntoView({ behavior: 'smooth' }); - } - }, [props.instances]); - - return ( - - - {props.instances.map((instance) => instance)} -
- - - ); -}; - -export default ChatGroup; diff --git a/GUI/front-end/src/components/displays/chat/ChatInstance.tsx b/GUI/front-end/src/components/displays/chat/ChatInstance.tsx deleted file mode 100644 index e9725c6..0000000 --- a/GUI/front-end/src/components/displays/chat/ChatInstance.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { Box, Icon, IconButton, Typography, useTheme } from '@mui/material'; -import React, { useEffect, useState } from 'react'; -import { ContentPaste as ContentPasteIcon } from '@mui/icons-material'; - -interface Props { - icon: React.ReactNode; - author: string; - content: string; -} - -const ChatInstance: React.FC = (props) => { - const [isVisible, setIsVisible] = useState(false); - const [isCopied, setIsCopied] = useState(false); - - const Theme = useTheme(); - - const copyToClipboard = async () => { - await navigator.clipboard - .writeText(props.content) - .then(() => { - setIsCopied(true); - setTimeout(() => setIsCopied(false), 2000); - }) - .catch(() => {}); - }; - - useEffect(() => { - setIsVisible(true); - }, []); - - return ( - - - - {props.icon} - - - - {props.author} - - {props.content.split('\n\n').map((paragraph, index) => ( - - {paragraph} - - ))} - - - - - - Copied! - - - - - - ); -}; - -export default ChatInstance; diff --git a/GUI/front-end/src/components/displays/chat/InputInstance.tsx b/GUI/front-end/src/components/displays/chat/InputInstance.tsx deleted file mode 100644 index 0e831c0..0000000 --- a/GUI/front-end/src/components/displays/chat/InputInstance.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import { Box, IconButton, Input, useTheme } from '@mui/material'; -import { Send as SendIcon } from '@mui/icons-material'; -import React from 'react'; - -interface Props { - onSubmit: (content: string) => void; - disabled: boolean; -} - -const InputInstance: React.FC = (props) => { - const [content, setContent] = React.useState(''); - - const Theme = useTheme(); - - const handleSendClick = () => { - // TODO: Implement sending message - if (content.trim().length === 0) return; - props.onSubmit(content); - setContent(''); - }; - - return ( - - - { - setContent(e.target.value); - }} - value={content} - placeholder='How can I help you?' - onKeyDown={(e) => { - if (e.key === 'Enter' && !e.shiftKey) { - e.preventDefault(); - handleSendClick(); - } - }} - > - - - - - - - - ); -}; - -export default InputInstance; diff --git a/GUI/front-end/src/components/displays/extension/ExtensionDisplay.tsx b/GUI/front-end/src/components/displays/extension/ExtensionDisplay.tsx deleted file mode 100644 index b0520b7..0000000 --- a/GUI/front-end/src/components/displays/extension/ExtensionDisplay.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { Box, Typography, useTheme } from '@mui/material'; -import { useState } from 'react'; -import { useLanguageContext } from '../../../contexts'; -// import FunctionalityInstance from './FunctionalityInstance'; -// import HistoryInstance from './HistoryInstance'; - -interface Props {} - -export const ExtensionDisplay: React.FC = () => { - const [selectedTab, setSelectedTab] = useState('Functionality'); - - const Theme = useTheme(); - const languageContext = useLanguageContext(); - - return ( - - - setSelectedTab('Functionality')} - > - - {languageContext.language === 'en' ? 'Functionality' : 'Funkcionalumas'} - - - setSelectedTab('History')} - > - - {languageContext.language === 'en' ? 'History' : 'Istorija'} - - - - {/* - {selectedTab === 'Functionality' ? : } - */} - - ); -}; diff --git a/GUI/front-end/src/components/displays/extension/FunctionalityInstance.tsx b/GUI/front-end/src/components/displays/extension/FunctionalityInstance.tsx deleted file mode 100644 index 8464c1a..0000000 --- a/GUI/front-end/src/components/displays/extension/FunctionalityInstance.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { ArrowDropDown as ArrowDropDownIcon } from '@mui/icons-material/'; -import { Box, MenuItem, Select, Typography, styled, useTheme } from '@mui/material'; -import { useLanguageContext, useToolContext } from '../../../contexts'; -import React from 'react'; - -interface Props {} - -const FunctionalityInstance: React.FC = () => { - const Theme = useTheme(); - - const languageContext = useLanguageContext(); - const toolContext = useToolContext(); - - return ( - - {languageContext.language === 'en' ? 'Tool' : 'Įrankis'} - - - ); -}; - -export default FunctionalityInstance; diff --git a/GUI/front-end/src/components/displays/extension/HistoryInstance.tsx b/GUI/front-end/src/components/displays/extension/HistoryInstance.tsx deleted file mode 100644 index 06c3d43..0000000 --- a/GUI/front-end/src/components/displays/extension/HistoryInstance.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { Error as ErrorIcon } from '@mui/icons-material'; -import { Box, Typography, useTheme } from '@mui/material'; -import { useLanguageContext } from '../../../contexts'; - -interface Props {} - -const HistoryInstance: React.FC = () => { - const Theme = useTheme(); - const languageContext = useLanguageContext(); - return ( - - - - {languageContext.language === 'en' ? 'No history available' : 'Istorijos nėra'} - - - ); -}; - -export default HistoryInstance; diff --git a/GUI/front-end/src/components/displays/index.ts b/GUI/front-end/src/components/displays/index.ts deleted file mode 100644 index 6150a73..0000000 --- a/GUI/front-end/src/components/displays/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { SettingsDisplay } from './settings/SettingsDisplay'; -export { ExtensionDisplay } from './extension/ExtensionDisplay'; -export { ChatDisplay } from './chat/ChatDisplay'; diff --git a/GUI/front-end/src/components/displays/settings/SettingsDisplay.tsx b/GUI/front-end/src/components/displays/settings/SettingsDisplay.tsx deleted file mode 100644 index 3ffcf60..0000000 --- a/GUI/front-end/src/components/displays/settings/SettingsDisplay.tsx +++ /dev/null @@ -1,143 +0,0 @@ -import { Grid, IconButton, Typography, useTheme } from '@mui/material'; -import { - Close as CloseIcon, - Logout as LogoutIcon, - PsychologyAlt as PsychologyAltIcon, - DarkModeOutlined as DarkModeOutlinedIcon, - LightModeOutlined as LightModeOutlinedIcon, - Language as LanguageIcon, - FolderDeleteOutlined as FolderDeleteOutlinedIcon, -} from '@mui/icons-material'; -import React from 'react'; -import SettingsInstance from './SettingsInstance'; -import SettingsGroup from './SettingsGroup'; -import { COLOR } from '../../../types/enum'; -import { useApplicationContext, useLanguageContext, useThemeContext } from '../../../contexts'; - -interface Props { - onClose: () => void; -} - -export const SettingsDisplay: React.FC = (props) => { - const Theme = useTheme(); - - const themeContext = useThemeContext(); - const languageContext = useLanguageContext(); - const applicationContext = useApplicationContext(); - - const handleOnClickLogOut = () => {}; // TODO: implement - - const handleOnChangeNameOfApplication = (newName?: string) => { - applicationContext.update(newName || ''); - }; - - const handleOnClickDeleteAllChats = () => {}; // TODO: implement - - const AccountInstances = [ - } - title={languageContext.language === 'en' ? 'Authentication' : 'Autentifikacija'} - description={ - languageContext.language === 'en' - ? 'Ability to log out of personal account.' - : 'Galimybė atsijungti nuo asmeninės paskyros.' - } - variant={'button'} - values={languageContext.language === 'en' ? ['Log out'] : ['Atsijungti']} - onClick={handleOnClickLogOut} - />, - ]; - - const GeneralInstances = [ - } - title={languageContext.language === 'en' ? 'Name of application' : 'Programos pavadinimas'} - description={ - languageContext.language === 'en' - ? 'This is the name of AI. You have the ability to rename it.' - : 'Tai yra AI pavadinimas. Jūs galite pervadinti.' - } - variant={'input'} - values={[applicationContext.name]} - onChange={handleOnChangeNameOfApplication} - />, - - ) : ( - - ) - } - title={languageContext.language === 'en' ? 'Theme' : 'Stilius'} - description={languageContext.language === 'en' ? 'Select GUI style.' : 'Pasirinkite GUI stilių.'} - variant={'dropdown'} - values={[themeContext.mode, ...themeContext.values.filter((value) => !value.includes(themeContext.mode))]} - onChange={() => themeContext.update()} - />, - } - title={languageContext.language === 'en' ? 'Language' : 'Kalba'} - description={languageContext.language === 'en' ? 'Select GUI language.' : 'Pasirinkite GUI kalbą.'} - variant={'dropdown'} - values={[ - languageContext.language, - ...languageContext.values.filter((value) => !value.includes(languageContext.language)), - ]} - onChange={() => languageContext.update()} - />, - } - title={languageContext.language === 'en' ? 'Delete all chats' : 'Ištrinti visus pokalbius'} - description={ - languageContext.language === 'en' ? 'Ability to delete chat history.' : 'Galimybė ištrinti pokalbių istoriją.' - } - variant={'button'} - values={languageContext.language === 'en' ? ['Delete all'] : ['Ištrinti']} - buttonColor={COLOR.red} - onClick={handleOnClickDeleteAllChats} - />, - ]; - - return ( - - - - - - {languageContext.language === 'en' ? 'Settings' : 'Nustatymai'} - - - - - - - - - - - - - - - ); -}; diff --git a/GUI/front-end/src/components/displays/settings/SettingsGroup.tsx b/GUI/front-end/src/components/displays/settings/SettingsGroup.tsx deleted file mode 100644 index 753c7d1..0000000 --- a/GUI/front-end/src/components/displays/settings/SettingsGroup.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { Box, Typography, useTheme } from '@mui/material'; -import React from 'react'; - -interface Props { - title: string; - instances: React.ReactNode[]; -} - -const SettingsGroup: React.FC = (props) => { - const Theme = useTheme(); - return ( - - - - {props.title} - - {props.instances.map((instance) => instance)} - - - ); -}; - -export default SettingsGroup; diff --git a/GUI/front-end/src/components/displays/settings/SettingsInstance.tsx b/GUI/front-end/src/components/displays/settings/SettingsInstance.tsx deleted file mode 100644 index 49e9eb1..0000000 --- a/GUI/front-end/src/components/displays/settings/SettingsInstance.tsx +++ /dev/null @@ -1,154 +0,0 @@ -import { - Box, - Button, - FormControl, - FormHelperText, - IconButton, - Input, - MenuItem, - Select, - Typography, - styled, - useTheme, -} from '@mui/material'; -import { ArrowDropDown as ArrowDropDownIcon } from '@mui/icons-material'; -import React, { useEffect, useState } from 'react'; -import { useLanguageContext } from '../../../contexts'; - -interface Props { - icon: React.ReactNode; - title: string; - description: string; - variant: string; - values: string[]; - onClick?: () => void; - onChange?: (newValue?: string) => void; - buttonColor?: string; -} - -const SettingsInstance: React.FC = (props) => { - const [currentValue, setCurrentValue] = React.useState(props.values[0]); - const [error, setError] = useState(''); - - const Theme = useTheme(); - - const languageContext = useLanguageContext(); - - const handleOnChange = (value: string) => { - const trimmedValue = value.trim(); - setCurrentValue(trimmedValue); - if (trimmedValue.length === 0 || trimmedValue.length > 20) { - setError(languageContext.language === 'en' ? 'Invalid input' : 'Negalima įvestis'); - return; - } - - setError(''); - if (props.onChange) { - props.onChange(trimmedValue); - } - }; - - useEffect(() => { - setCurrentValue(props.values[0]); - }, [props.values]); - - return ( - - - - - {props.icon} - - - - - {props.title} - - - {props.description} - - - - {props.variant === 'button' && ( - - )} - {props.variant === 'input' && ( - - { - handleOnChange(e.target.value); - }} - /> - {error} - - )} - {props.variant === 'dropdown' && ( - - )} - - - - ); -}; - -export default SettingsInstance; diff --git a/GUI/front-end/src/components/svgs/index.ts b/GUI/front-end/src/components/svgs/index.ts deleted file mode 100644 index a6b257a..0000000 --- a/GUI/front-end/src/components/svgs/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { KathLogo } from './logo/KathLogo'; diff --git a/GUI/front-end/src/components/svgs/logo/KathLogo.tsx b/GUI/front-end/src/components/svgs/logo/KathLogo.tsx deleted file mode 100644 index 254b00a..0000000 --- a/GUI/front-end/src/components/svgs/logo/KathLogo.tsx +++ /dev/null @@ -1,61 +0,0 @@ -interface Props { - color?: string; -} - -export const KathLogo: React.FC = (props) => { - return ( - - ); -}; diff --git a/GUI/front-end/src/contexts/application/ApplicationContextProvider.tsx b/GUI/front-end/src/contexts/application/ApplicationContextProvider.tsx deleted file mode 100644 index e71d5f9..0000000 --- a/GUI/front-end/src/contexts/application/ApplicationContextProvider.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import React, { createContext, useEffect, useState } from 'react'; - -interface ApplicationContextProps { - name: string; - update: (newName: string) => void; -} - -export const ApplicationContext = createContext({ - name: 'Kath', - update: () => {}, -}); - -interface Props { - children?: React.ReactNode; -} - -export const ApplicationContextProvider: React.FC = ({ children }) => { - const [name, setName] = useState(localStorage.getItem('application-name') || 'Kath'); - - function update(newName: string) { - localStorage.setItem('application-name', newName); - setName(newName); - } - - useEffect(() => { - if (!localStorage.getItem('application-name')) { - localStorage.setItem('application-name', 'Kath'); - setName('Kath'); - } - }, []); - - const ApplicationContextValue: ApplicationContextProps = { - name, - update, - }; - - return {children}; -}; diff --git a/GUI/front-end/src/contexts/application/UseApplicationContext.ts b/GUI/front-end/src/contexts/application/UseApplicationContext.ts deleted file mode 100644 index 7776761..0000000 --- a/GUI/front-end/src/contexts/application/UseApplicationContext.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { useContext } from 'react'; -import { ApplicationContext } from './ApplicationContextProvider'; - -export const useApplicationContext = () => useContext(ApplicationContext); diff --git a/GUI/front-end/src/contexts/index.ts b/GUI/front-end/src/contexts/index.ts deleted file mode 100644 index b32bde7..0000000 --- a/GUI/front-end/src/contexts/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export { ThemeContextProvider } from './theme/ThemeContextProvider'; -export { useThemeContext } from './theme/UseThemeContext'; -export { LanguageContextProvider } from './language/LanguageContextProvider'; -export { useLanguageContext } from './language/UseLanguageContext'; -export { ApplicationContextProvider } from './application/ApplicationContextProvider'; -export { useApplicationContext } from './application/UseApplicationContext'; -export { ToolContextProvider } from './tool/ToolContextProvider'; -export { useToolContext } from './tool/UseToolContext'; diff --git a/GUI/front-end/src/contexts/language/LanguageContextProvider.tsx b/GUI/front-end/src/contexts/language/LanguageContextProvider.tsx deleted file mode 100644 index 9ed815c..0000000 --- a/GUI/front-end/src/contexts/language/LanguageContextProvider.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import React, { createContext, useEffect, useState } from 'react'; - -interface LanguageContextProps { - language: string; - update: () => void; - values: string[]; -} - -export const LanguageContext = createContext({ - language: 'en', - update: () => {}, - values: [], -}); - -interface Props { - children?: React.ReactNode; -} - -export const LanguageContextProvider: React.FC = ({ children }) => { - const [language, setLanguage] = useState(localStorage.getItem('language') || 'en'); - - function update() { - if (localStorage.getItem('language') === 'en') { - localStorage.setItem('language', 'lt'); - } else { - localStorage.setItem('language', 'en'); - } - setLanguage((prev) => (prev === 'en' ? 'lt' : 'en')); - } - - useEffect(() => { - if (!localStorage.getItem('language')) { - localStorage.setItem('language', 'en'); - setLanguage('en'); - } - }, []); - - const LanguageContextValue: LanguageContextProps = { - language, - update, - values: ['en', 'lt'], - }; - - return {children}; -}; diff --git a/GUI/front-end/src/contexts/language/UseLanguageContext.ts b/GUI/front-end/src/contexts/language/UseLanguageContext.ts deleted file mode 100644 index c85b8e8..0000000 --- a/GUI/front-end/src/contexts/language/UseLanguageContext.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { useContext } from 'react'; -import { LanguageContext } from './LanguageContextProvider'; - -export const useLanguageContext = () => useContext(LanguageContext); diff --git a/GUI/front-end/src/contexts/theme/ThemeContextProvider.tsx b/GUI/front-end/src/contexts/theme/ThemeContextProvider.tsx deleted file mode 100644 index f3236e9..0000000 --- a/GUI/front-end/src/contexts/theme/ThemeContextProvider.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import React, { createContext, useEffect, useMemo, useState } from 'react'; -import { PaletteMode, ThemeProvider, createTheme } from '@mui/material'; -import { COLOR } from '../../types/enum'; - -interface ThemeContextProps { - mode: string; - update: () => void; - values: string[]; -} - -export const ThemeContext = createContext({ - mode: 'dark', - update: () => {}, - values: [], -}); - -interface Props { - children?: React.ReactNode; -} - -export const ThemeContextProvider: React.FC = ({ children }) => { - const [mode, setMode] = useState(localStorage.getItem('color-mode') || 'dark'); - - const update = () => { - if (localStorage.getItem('color-mode') === 'light') { - localStorage.setItem('color-mode', 'dark'); - } else { - localStorage.setItem('color-mode', 'light'); - } - setMode((prev) => (prev === 'light' ? 'dark' : 'light')); - }; - - useEffect(() => { - if (!localStorage.getItem('color-mode')) { - const isSystemDark = window.matchMedia('(prefers-color-scheme: dark)'); - const systemMode = isSystemDark.matches ? 'dark' : 'light'; - localStorage.setItem('color-mode', systemMode); - setMode(systemMode); - } - }, []); - - const theme = useMemo( - () => - createTheme({ - palette: { - mode: mode as PaletteMode, - primary: { - main: mode === 'dark' ? COLOR.background_default_dark : COLOR.background_default_light, - }, - text: { - primary: mode === 'dark' ? COLOR.text_primary_dark : COLOR.text_primary_light, - secondary: COLOR.text_secondary, - }, - background: { - default: mode === 'dark' ? COLOR.background_default_dark : COLOR.background_default_light, - paper: mode === 'dark' ? COLOR.background_paper_dark : COLOR.background_paper_light, - }, - action: { - hover: mode === 'dark' ? COLOR.action_hover_dark : COLOR.action_hover_light, - }, - }, - components: { - MuiButton: { - styleOverrides: { - root: { - ':hover': { - backgroundColor: mode === 'dark' ? COLOR.action_hover_dark : COLOR.action_hover_light, - }, - }, - }, - }, - MuiIconButton: { - styleOverrides: { - root: { - width: '50px', - height: '50px', - }, - }, - }, - MuiSvgIcon: { - styleOverrides: { - root: { - width: '40px', - height: '40px', - }, - }, - }, - MuiTypography: { - styleOverrides: { - root: { - fontFamily: 'Poppins', - fontSize: '20px', - color: mode === 'dark' ? COLOR.text_primary_dark : COLOR.text_primary_light, - fontWeight: '400', - }, - }, - }, - }, - }), - [mode] - ); - - const ThemeContextValue: ThemeContextProps = { - mode, - update, - values: ['light', 'dark'], - }; - - return ( - - {children} - - ); -}; diff --git a/GUI/front-end/src/contexts/theme/UseThemeContext.ts b/GUI/front-end/src/contexts/theme/UseThemeContext.ts deleted file mode 100644 index 9836971..0000000 --- a/GUI/front-end/src/contexts/theme/UseThemeContext.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { useContext } from 'react'; -import { ThemeContext } from './ThemeContextProvider'; - -export const useThemeContext = () => useContext(ThemeContext); diff --git a/GUI/front-end/src/contexts/tool/ToolContextProvider.tsx b/GUI/front-end/src/contexts/tool/ToolContextProvider.tsx deleted file mode 100644 index 22ef7a3..0000000 --- a/GUI/front-end/src/contexts/tool/ToolContextProvider.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import React, { createContext, useEffect, useState } from 'react'; - -interface ToolContextProps { - tool: string; - update: (newTool: string) => void; - values: string[]; -} - -export const ToolContext = createContext({ - tool: 'Cadd', - update: () => {}, - values: [], -}); - -interface Props { - children?: React.ReactNode; -} - -export const ToolContextProvider: React.FC = ({ children }) => { - const [tool, setTool] = useState(localStorage.getItem('tool') || 'Cadd'); - - function update(newTool: string) { - localStorage.setItem('tool', newTool); - setTool(newTool); - } - - useEffect(() => { - if (!localStorage.getItem('tool')) { - localStorage.setItem('tool', 'Cadd'); - setTool('Cadd'); - } - }, []); - - const ToolContextValue: ToolContextProps = { - tool, - update, - values: ['Cadd', 'Splice AI', 'Pangoli', 'EVE', 'Metadome'], - }; - - return {children}; -}; diff --git a/GUI/front-end/src/contexts/tool/UseToolContext.ts b/GUI/front-end/src/contexts/tool/UseToolContext.ts deleted file mode 100644 index d647144..0000000 --- a/GUI/front-end/src/contexts/tool/UseToolContext.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { useContext } from 'react'; -import { ToolContext } from './ToolContextProvider'; - -export const useToolContext = () => useContext(ToolContext); diff --git a/GUI/front-end/src/css/app/App.css b/GUI/front-end/src/css/app/App.css deleted file mode 100644 index ea8c774..0000000 --- a/GUI/front-end/src/css/app/App.css +++ /dev/null @@ -1,34 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap'); - -/* For light theme */ -:root { - --scrollbar-bg: rgba(0, 0, 0, 0.1); - --scrollbar-thumb: #aaa; - --scrollbar-thumb-hover: #555; -} - -/* For dark theme */ -body.dark-theme { - --scrollbar-bg: rgba(255, 255, 255, 0.1); - --scrollbar-thumb: #a7acbb; - --scrollbar-thumb-hover: #888; -} - -/* This applies to all scrollable elements */ -::-webkit-scrollbar { - width: 10px; -} - -::-webkit-scrollbar-track { - background: var(--scrollbar-bg); - border-radius: 1rem; -} - -::-webkit-scrollbar-thumb { - background: var(--scrollbar-thumb); - border-radius: 1rem; -} - -::-webkit-scrollbar-thumb:hover { - background: var(--scrollbar-thumb-hover); -} diff --git a/GUI/front-end/src/hooks/index.ts b/GUI/front-end/src/hooks/index.ts deleted file mode 100644 index 925e7e5..0000000 --- a/GUI/front-end/src/hooks/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { useGetUsers } from './user/userHook'; -export { useSendRequest } from './request/requestHook'; diff --git a/GUI/front-end/src/hooks/request/requestHook.ts b/GUI/front-end/src/hooks/request/requestHook.ts deleted file mode 100644 index 17f0721..0000000 --- a/GUI/front-end/src/hooks/request/requestHook.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { useMutation, useQueryClient } from "@tanstack/react-query" -import { sendRequest } from "../../services"; - -export const useSendRequest = () => { - const queryClient = useQueryClient(); - - return useMutation({ - mutationFn: sendRequest, - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ['request']}); - }, - }); -}; \ No newline at end of file diff --git a/GUI/front-end/src/hooks/user/userHook.ts b/GUI/front-end/src/hooks/user/userHook.ts deleted file mode 100644 index 36344e4..0000000 --- a/GUI/front-end/src/hooks/user/userHook.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { useQuery } from '@tanstack/react-query'; -import { getUsers } from '../../services'; - -export const useGetUsers = () => { - return useQuery({ - queryKey: ['users'], - queryFn: getUsers, - refetchOnWindowFocus: false, - refetchInterval: false, - }); -}; diff --git a/GUI/front-end/src/main/app/App.tsx b/GUI/front-end/src/main/app/App.tsx deleted file mode 100644 index beeab4f..0000000 --- a/GUI/front-end/src/main/app/App.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import React, { useEffect } from 'react'; -import { Box, useTheme } from '@mui/material'; -import { useGetUsers } from '../../hooks'; -import { ExtensionDisplay, ChatDisplay } from '../../components/displays'; -import BaseLayout from '../layout/BaseLayout'; -import HeaderLayout from '../layout/HeaderLayout'; -import '../../css/app/App.css'; - -function App() { - /// THESE LINES ARE ONLY FOR EXAMPLE PURPOSES /// - - const { data } = useGetUsers(); - useEffect(() => { - console.log(data); - }, [data]); - - ///////////////////////////////////////////////// - - const [isDrawerOpen, setIsDrawerOpen] = React.useState(false); - const Theme = useTheme(); - - useEffect(() => { - if (Theme.palette.mode === 'dark') { - document.body.classList.add('dark-theme'); - } else { - document.body.classList.remove('dark-theme'); - } - }, [Theme.palette.mode]); - - return ( - - - {/* Left side - drawer */} - - - - - {/* Right size - chat */} - - {/* Up - header */} - {/* TODO: set to isDrawerOpen */} - setIsDrawerOpen(!isDrawerOpen)} /> - - {/* Chat display */} - - - - - - - ); -} - -export default App; diff --git a/GUI/front-end/src/main/layout/BaseLayout.tsx b/GUI/front-end/src/main/layout/BaseLayout.tsx deleted file mode 100644 index 9a34b0b..0000000 --- a/GUI/front-end/src/main/layout/BaseLayout.tsx +++ /dev/null @@ -1,137 +0,0 @@ -import { Box, Container, Drawer, IconButton, useTheme } from '@mui/material'; -import { useThemeContext, useLanguageContext } from '../../contexts'; -import { - DarkMode as DarkModeIcon, - LightMode as LightModeIcon, - Public as PublicIcon, - Tune as TuneIcon, -} from '@mui/icons-material'; -import React from 'react'; -import { SettingsDisplay } from '../../components/displays'; -import { KathLogo } from '../../components/svgs'; - -interface Props { - children?: React.ReactNode; -} - -const BaseLayout: React.FC = (props) => { - const [isTuneOpen, setIsTuneOpen] = React.useState(false); - - const Theme = useTheme(); - - const themeContext = useThemeContext(); - const languageContext = useLanguageContext(); - - const handleLogoClick = () => {}; // TODO route to home page - - return ( - - - - - - - setIsTuneOpen(!isTuneOpen)} - sx={{ - marginBottom: '30px', - backgroundColor: isTuneOpen ? Theme.palette.action.hover : 'transparent', - ':hover': { - backgroundColor: Theme.palette.action.hover, - }, - }} - > - - - - {Theme.palette.mode === 'dark' ? ( - - ) : ( - - )} - - - - - - - - {props.children} - setIsTuneOpen(!isTuneOpen)} - PaperProps={{ - sx: { - width: 'calc(100% - 80px)', - height: '100%', - border: 'none', - left: '80px', - backgroundColor: Theme.palette.background.default, - }, - }} - > - setIsTuneOpen(!isTuneOpen)} /> - - - - ); -}; - -export default BaseLayout; diff --git a/GUI/front-end/src/main/layout/HeaderLayout.tsx b/GUI/front-end/src/main/layout/HeaderLayout.tsx deleted file mode 100644 index 42a6935..0000000 --- a/GUI/front-end/src/main/layout/HeaderLayout.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { Box, IconButton, useTheme } from '@mui/material'; -import { ChevronLeft as ChevronLeftIcon } from '@mui/icons-material'; - -interface Props { - open: boolean; - onClick: () => void; -} - -const HeaderLayout: React.FC = (props) => { - const Theme = useTheme(); - return ( - - - - - - ); -}; - -export default HeaderLayout; diff --git a/GUI/front-end/src/main/main.tsx b/GUI/front-end/src/main/main.tsx deleted file mode 100644 index cb2e7e8..0000000 --- a/GUI/front-end/src/main/main.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom/client'; -import App from './app/App.tsx'; -import { - LanguageContextProvider, - ThemeContextProvider, - ApplicationContextProvider, - ToolContextProvider, -} from '../contexts'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; - -const queryClient = new QueryClient(); - -ReactDOM.createRoot(document.getElementById('root')!).render( - - - - - - - - - - - - - -); diff --git a/GUI/front-end/src/services/httpClient.ts b/GUI/front-end/src/services/httpClient.ts deleted file mode 100644 index 822291c..0000000 --- a/GUI/front-end/src/services/httpClient.ts +++ /dev/null @@ -1,11 +0,0 @@ -import axios from 'axios'; -import { API_URL } from '../types/constants'; - -const httpClient = axios.create({ - baseURL: API_URL, - headers: { - 'Content-Type': 'application/json', - }, -}); - -export default httpClient; diff --git a/GUI/front-end/src/services/index.ts b/GUI/front-end/src/services/index.ts deleted file mode 100644 index e7dc0d8..0000000 --- a/GUI/front-end/src/services/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { getUsers } from './user/userService'; -export { sendRequest } from './request/requestService'; diff --git a/GUI/front-end/src/services/request/requestService.ts b/GUI/front-end/src/services/request/requestService.ts deleted file mode 100644 index 4a295b5..0000000 --- a/GUI/front-end/src/services/request/requestService.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ENDPOINTS } from "../../types/constants"; -import httpClient from "../httpClient"; - - -export async function sendRequest(request: string) { - return await httpClient - .post(ENDPOINTS.REQUEST, request) - .then((res) => res.data) - .catch((err) => { - console.error(err); - }); -} \ No newline at end of file diff --git a/GUI/front-end/src/services/user/userService.ts b/GUI/front-end/src/services/user/userService.ts deleted file mode 100644 index cee7513..0000000 --- a/GUI/front-end/src/services/user/userService.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { AxiosError } from 'axios'; -import { ENDPOINTS } from '../../types/constants'; -import httpClient from '../httpClient'; - -export async function getUsers() { - return await httpClient - .get(ENDPOINTS.USERS) - .then((res) => res.data) - .catch((err) => { - // Handle error - console.error((err as AxiosError).code); - }); -} diff --git a/GUI/front-end/src/types/constants/constants.ts b/GUI/front-end/src/types/constants/constants.ts deleted file mode 100644 index 1aa05e4..0000000 --- a/GUI/front-end/src/types/constants/constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const API_URL = import.meta.env.VITE_API_URL; diff --git a/GUI/front-end/src/types/constants/endpoints.ts b/GUI/front-end/src/types/constants/endpoints.ts deleted file mode 100644 index b188564..0000000 --- a/GUI/front-end/src/types/constants/endpoints.ts +++ /dev/null @@ -1,6 +0,0 @@ - -export const ENDPOINTS = { - USERS: `/users`, - PROFILES: `/profiles`, - REQUEST: '/request', -}; \ No newline at end of file diff --git a/GUI/front-end/src/types/constants/index.ts b/GUI/front-end/src/types/constants/index.ts deleted file mode 100644 index 44a1817..0000000 --- a/GUI/front-end/src/types/constants/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { API_URL } from './constants'; -export { ENDPOINTS } from './endpoints'; diff --git a/GUI/front-end/src/types/enum/Color.ts b/GUI/front-end/src/types/enum/Color.ts deleted file mode 100644 index 7170575..0000000 --- a/GUI/front-end/src/types/enum/Color.ts +++ /dev/null @@ -1,19 +0,0 @@ -export enum COLOR { - // Dark mode colors - text_primary_dark = '#DFE2EB', - background_default_dark = '#292C34', - background_paper_dark = '#2D313A', - action_hover_dark = '#42464F', - - // Light mode colors - text_primary_light = '#444444', - background_default_light = '#F3F3F3', - background_paper_light = '#FFFFFF', - action_hover_light = '#E4E5E8', - - // Common colors - text_secondary = '#A7ACBB', - - green = '#4A934A', - red = '#EF4444', -} diff --git a/GUI/front-end/src/types/enum/index.ts b/GUI/front-end/src/types/enum/index.ts deleted file mode 100644 index 0fd619b..0000000 --- a/GUI/front-end/src/types/enum/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './Color'; diff --git a/GUI/front-end/src/vite-env.d.ts b/GUI/front-end/src/vite-env.d.ts deleted file mode 100644 index 11f02fe..0000000 --- a/GUI/front-end/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/GUI/front-end/tsconfig.json b/GUI/front-end/tsconfig.json deleted file mode 100644 index a7fc6fb..0000000 --- a/GUI/front-end/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["src"], - "references": [{ "path": "./tsconfig.node.json" }] -} diff --git a/GUI/front-end/tsconfig.node.json b/GUI/front-end/tsconfig.node.json deleted file mode 100644 index 97ede7e..0000000 --- a/GUI/front-end/tsconfig.node.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "skipLibCheck": true, - "module": "ESNext", - "moduleResolution": "bundler", - "allowSyntheticDefaultImports": true, - "strict": true - }, - "include": ["vite.config.ts"] -} diff --git a/GUI/front-end/vite.config.ts b/GUI/front-end/vite.config.ts deleted file mode 100644 index 9d4971d..0000000 --- a/GUI/front-end/vite.config.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { defineConfig } from 'vite'; -import react from '@vitejs/plugin-react'; - -export default defineConfig({ - plugins: [react()], - base: '/', - server: { - host: '0.0.0.0', - port: 3000, - }, - build: { - rollupOptions: { - input: { - main: 'index.html', - }, - }, - }, -}); diff --git a/app/back-end/src/events/workspace_event.py b/app/back-end/src/events/workspace_event.py index da4326f..d0b9d4e 100644 --- a/app/back-end/src/events/workspace_event.py +++ b/app/back-end/src/events/workspace_event.py @@ -13,62 +13,83 @@ # pylint: disable=import-error import os +from flask_socketio import SocketIO -from src.setup.extensions import socketio from src.utils.exceptions import UnexpectedError from src.constants import WORKSPACE_DIR -@socketio.on("workspace_file_update") -def handle_workspace_file_update(data): +def workspace_event_handler(socketio: SocketIO): """ - Handle the 'workspace_file_update' WebSocket event. + Registers WebSocket event handlers for workspace operations using the provided SocketIO + instance. - This function processes the data received from the client to update a file in the workspace - directory. It ensures that required fields are present, writes the content to the specified - file, and handles any errors by sending appropriate status updates back to the client. + This function sets up event handling for the 'workspace_file_update' event, which allows + clients to update files in the workspace directory. It verifies the presence of necessary + data (UUID and file ID), handles file writing, and provides status updates back to the client. Args: - data (dict): The data received from the client, expected to contain 'uuid', 'fileId', and - 'content'. + socketio (SocketIO): The SocketIO instance used for managing WebSocket connections and + events. + + Events Handled: + - 'workspace_file_update': Processes file update requests and emits status updates. Emits: - 'workspace_file_update_status': Emits a status message indicating success or failure of - the file update operation. + - 'workspace_file_update_status': Indicates success or failure of the file update operation + with a status message. """ - uuid = data.get("uuid") - file_id = data.get("fileId") - content = data.get("content") - - # Ensure the uuid is provided - if not uuid: - socketio.emit( - "workspace_file_update_status", - {"status": "error", "message": "UUID is missing"}, - ) - return - - # Ensure the fileId is provided - if not file_id: - socketio.emit( - "workspace_file_update_status", - {"status": "error", "message": "File ID is missing"}, - ) - return - - file_path = os.path.join(WORKSPACE_DIR, uuid, file_id) - - try: - # Ensure the directory exists - os.makedirs(os.path.dirname(file_path), exist_ok=True) - - # Write the content to the file - with open(file_path, "w", encoding="utf-8") as file: - file.write(content) - - # Notify the client of the successful update - socketio.emit("workspace_file_update_status", {"status": "success"}) - - except UnexpectedError as e: - # Notify the client of an error during the update - socketio.emit("workspace_file_update_status", {"status": "error", "message": str(e)}) + + @socketio.on("workspace_file_update") + def handle_workspace_file_update(data): + """ + Handle the 'workspace_file_update' WebSocket event. + + This function processes the data received from the client to update a file in the workspace + directory. It ensures that required fields are present, writes the content to the specified + file, and handles any errors by sending appropriate status updates back to the client. + + Args: + data (dict): The data received from the client, expected to contain 'uuid', 'fileId', + and 'content'. + + Emits: + 'workspace_file_update_status': Emits a status message indicating success or failure of + the file update operation. + """ + uuid = data.get("uuid") + file_id = data.get("fileId") + content = data.get("content") + + # Ensure the uuid is provided + if not uuid: + socketio.emit( + "workspace_file_update_status", + {"status": "error", "message": "UUID is missing"}, + ) + return + + # Ensure the fileId is provided + if not file_id: + socketio.emit( + "workspace_file_update_status", + {"status": "error", "message": "File ID is missing"}, + ) + return + + file_path = os.path.join(WORKSPACE_DIR, uuid, file_id) + + try: + # Ensure the directory exists + os.makedirs(os.path.dirname(file_path), exist_ok=True) + + # Write the content to the file + with open(file_path, "w", encoding="utf-8") as file: + file.write(content) + + # Notify the client of the successful update + socketio.emit("workspace_file_update_status", {"status": "success"}) + + except UnexpectedError as e: + # Notify the client of an error during the update + socketio.emit("workspace_file_update_status", {"status": "error", "message": str(e)}) diff --git a/app/back-end/src/setup/eventer.py b/app/back-end/src/setup/eventer.py index ad9f96b..4584f9b 100644 --- a/app/back-end/src/setup/eventer.py +++ b/app/back-end/src/setup/eventer.py @@ -35,14 +35,14 @@ from src.setup.extensions import socketio, logger, socket_manager # Import all event modules here -# TODO - Import the workspace_event module to register its event handlers -import src.events.workspace_event +from src.events.workspace_event import workspace_event_handler def eventer(): """ Register all event handlers including connect and disconnect events. """ + workspace_event_handler(socketio) @socketio.on("connect") def handle_connect(): @@ -72,7 +72,7 @@ def handle_connect(): uuid = request.args.get("uuid") if uuid: socket_manager.register_user_session(uuid, request.sid) - logger.info(f"User {uuid} connected with socket ID {request.sid}") + logger.info("User %s connected with socket ID %s", uuid, request.sid) else: logger.error("No uuid provided during connection") @@ -104,6 +104,6 @@ def handle_disconnect(): uuid = request.args.get("uuid") if uuid: socket_manager.remove_user_session(uuid, request.sid) - logger.info(f"User {uuid} disconnected with socket ID {request.sid}") + logger.info("User %s disconnected with socket ID %s", uuid, request.sid) else: logger.error("No uuid provided during disconnection")