From 5c6a17abf3c8ed79f50fa3e434d0cb9590f4f911 Mon Sep 17 00:00:00 2001 From: shump Date: Thu, 12 Feb 2026 14:52:37 -0600 Subject: [PATCH] Add full Oculog codebase --- .gitignore | 40 + clients/ubuntu/build-deb.sh | 35 + clients/ubuntu/check-client-version.sh | 47 + clients/ubuntu/client.conf.example | 7 + clients/ubuntu/client.py | 902 + clients/ubuntu/debian/control | 10 + clients/ubuntu/debian/postinst | 55 + clients/ubuntu/debian/postrm | 26 + clients/ubuntu/debian/rules | 16 + clients/ubuntu/install.sh | 189 + clients/ubuntu/oculog-client.service | 15 + clients/ubuntu/requirements.txt | 3 + clients/ubuntu/troubleshoot-install.sh | 87 + clients/ubuntu/uninstall.sh | 41 + clients/ubuntu/update-client.sh | 146 + docker-compose.yml | 75 + server/backend/.dockerignore | 7 + server/backend/Dockerfile | 19 + server/backend/db/init.sql | 125 + server/backend/db/migration_add_disks.sql | 8 + .../backend/db/migration_add_server_info.sql | 17 + .../db/migration_add_synthetic_monitors.sql | 44 + server/backend/package-lock.json | 1500 ++ server/backend/package.json | 26 + server/backend/src/alertEvaluator.js | 271 + server/backend/src/db.js | 2016 ++ server/backend/src/index.js | 1067 + server/backend/src/middleware/auth.js | 27 + server/backend/src/migrate-cli.js | 28 + server/backend/src/migrate.js | 419 + server/backend/src/monitorRunner.js | 282 + server/backend/src/osvClient.js | 504 + server/backend/src/packageBuilder.js | 90 + server/frontend/.dockerignore | 8 + server/frontend/Dockerfile | 19 + server/frontend/package-lock.json | 17491 ++++++++++++++++ server/frontend/package.json | 37 + server/frontend/public/index.html | 89 + server/frontend/public/oculog-logo.png | Bin 0 -> 546106 bytes server/frontend/src/App.css | 298 + server/frontend/src/App.js | 324 + server/frontend/src/components/Alerting.css | 399 + server/frontend/src/components/Alerting.js | 442 + .../src/components/ClientDownload.css | 217 + .../frontend/src/components/ClientDownload.js | 163 + .../frontend/src/components/ErrorBoundary.js | 33 + server/frontend/src/components/MetricCard.css | 93 + server/frontend/src/components/MetricCard.js | 37 + .../frontend/src/components/MetricsChart.css | 30 + .../frontend/src/components/MetricsChart.js | 158 + .../src/components/MetricsDashboard.css | 862 + .../src/components/MetricsDashboard.js | 783 + server/frontend/src/components/Security.css | 266 + server/frontend/src/components/Security.js | 224 + .../src/components/SecurityDashboard.css | 660 + .../src/components/SecurityDashboard.js | 552 + .../src/components/ServerInfoPane.css | 311 + .../frontend/src/components/ServerInfoPane.js | 184 + server/frontend/src/components/ServerList.css | 129 + server/frontend/src/components/ServerList.js | 41 + .../src/components/ServerSecurity.css | 189 + .../frontend/src/components/ServerSecurity.js | 260 + .../src/components/SyntheticMonitors.css | 297 + .../src/components/SyntheticMonitors.js | 337 + server/frontend/src/components/Wiki.css | 214 + server/frontend/src/components/Wiki.js | 649 + server/frontend/src/index.css | 62 + server/frontend/src/index.js | 216 + 68 files changed, 34218 insertions(+) create mode 100644 .gitignore create mode 100755 clients/ubuntu/build-deb.sh create mode 100755 clients/ubuntu/check-client-version.sh create mode 100644 clients/ubuntu/client.conf.example create mode 100755 clients/ubuntu/client.py create mode 100644 clients/ubuntu/debian/control create mode 100755 clients/ubuntu/debian/postinst create mode 100755 clients/ubuntu/debian/postrm create mode 100755 clients/ubuntu/debian/rules create mode 100755 clients/ubuntu/install.sh create mode 100644 clients/ubuntu/oculog-client.service create mode 100644 clients/ubuntu/requirements.txt create mode 100755 clients/ubuntu/troubleshoot-install.sh create mode 100755 clients/ubuntu/uninstall.sh create mode 100755 clients/ubuntu/update-client.sh create mode 100644 docker-compose.yml create mode 100644 server/backend/.dockerignore create mode 100644 server/backend/Dockerfile create mode 100644 server/backend/db/init.sql create mode 100644 server/backend/db/migration_add_disks.sql create mode 100644 server/backend/db/migration_add_server_info.sql create mode 100644 server/backend/db/migration_add_synthetic_monitors.sql create mode 100644 server/backend/package-lock.json create mode 100644 server/backend/package.json create mode 100644 server/backend/src/alertEvaluator.js create mode 100644 server/backend/src/db.js create mode 100644 server/backend/src/index.js create mode 100644 server/backend/src/middleware/auth.js create mode 100644 server/backend/src/migrate-cli.js create mode 100644 server/backend/src/migrate.js create mode 100644 server/backend/src/monitorRunner.js create mode 100644 server/backend/src/osvClient.js create mode 100644 server/backend/src/packageBuilder.js create mode 100644 server/frontend/.dockerignore create mode 100644 server/frontend/Dockerfile create mode 100644 server/frontend/package-lock.json create mode 100644 server/frontend/package.json create mode 100644 server/frontend/public/index.html create mode 100644 server/frontend/public/oculog-logo.png create mode 100644 server/frontend/src/App.css create mode 100644 server/frontend/src/App.js create mode 100644 server/frontend/src/components/Alerting.css create mode 100644 server/frontend/src/components/Alerting.js create mode 100644 server/frontend/src/components/ClientDownload.css create mode 100644 server/frontend/src/components/ClientDownload.js create mode 100644 server/frontend/src/components/ErrorBoundary.js create mode 100644 server/frontend/src/components/MetricCard.css create mode 100644 server/frontend/src/components/MetricCard.js create mode 100644 server/frontend/src/components/MetricsChart.css create mode 100644 server/frontend/src/components/MetricsChart.js create mode 100644 server/frontend/src/components/MetricsDashboard.css create mode 100644 server/frontend/src/components/MetricsDashboard.js create mode 100644 server/frontend/src/components/Security.css create mode 100644 server/frontend/src/components/Security.js create mode 100644 server/frontend/src/components/SecurityDashboard.css create mode 100644 server/frontend/src/components/SecurityDashboard.js create mode 100644 server/frontend/src/components/ServerInfoPane.css create mode 100644 server/frontend/src/components/ServerInfoPane.js create mode 100644 server/frontend/src/components/ServerList.css create mode 100644 server/frontend/src/components/ServerList.js create mode 100644 server/frontend/src/components/ServerSecurity.css create mode 100644 server/frontend/src/components/ServerSecurity.js create mode 100644 server/frontend/src/components/SyntheticMonitors.css create mode 100644 server/frontend/src/components/SyntheticMonitors.js create mode 100644 server/frontend/src/components/Wiki.css create mode 100644 server/frontend/src/components/Wiki.js create mode 100644 server/frontend/src/index.css create mode 100644 server/frontend/src/index.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e9bf7ca --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +# Dependencies +node_modules/ +__pycache__/ +*.pyc +*.pyo +*.pyd +.Python +venv/ +env/ +ENV/ + +# Build outputs +dist/ +build/ +*.egg-info/ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Logs +*.log +logs/ + +# Environment variables +.env +.env.local + +# Database +*.db +*.sqlite +*.sqlite3 + diff --git a/clients/ubuntu/build-deb.sh b/clients/ubuntu/build-deb.sh new file mode 100755 index 0000000..223cb40 --- /dev/null +++ b/clients/ubuntu/build-deb.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +set -e + +# Colors +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' + +echo -e "${GREEN}Building Oculog Client Debian Package${NC}" +echo "==========================================" +echo "" + +# Check if dpkg-buildpackage is available +if ! command -v dpkg-buildpackage &> /dev/null; then + echo -e "${YELLOW}dpkg-buildpackage not found. Installing build dependencies...${NC}" + sudo apt-get update + sudo apt-get install -y devscripts build-essential debhelper +fi + +# Clean previous builds +echo "Cleaning previous builds..." +rm -rf debian/oculog-client + rm -f ../oculog-client_*.deb + rm -f ../oculog-client_*.changes + rm -f ../oculog-client_*.buildinfo + +# Build the package +echo "Building package..." +dpkg-buildpackage -b -us -uc + +echo "" +echo -e "${GREEN}Package built successfully!${NC}" +echo "Package location: ../oculog-client_*.deb" + diff --git a/clients/ubuntu/check-client-version.sh b/clients/ubuntu/check-client-version.sh new file mode 100755 index 0000000..2e0ba54 --- /dev/null +++ b/clients/ubuntu/check-client-version.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# Quick script to check client version status + +echo "=== Client Version Diagnostic ===" +echo "" + +# 1. Check what version is in the file +echo "1. Version in client.py file:" +if sudo grep -q 'CLIENT_VERSION_BUILD_TIMESTAMP = "' /opt/oculog/client.py 2>/dev/null; then + VERSION=$(sudo grep 'CLIENT_VERSION_BUILD_TIMESTAMP = "' /opt/oculog/client.py | head -1 | sed 's/.*"\(.*\)".*/\1/') + echo " ✓ Injected version: $VERSION" +else + echo " ⚠ No injected version found (using file modification time)" + MTIME=$(sudo stat -c %y /opt/oculog/client.py 2>/dev/null | cut -d' ' -f1,2 | sed 's/ /T/' | cut -d'.' -f1 | sed 's/T/-/' | sed 's/:/-/g' | cut -d'-' -f1-5) + echo " File modification time: $MTIME" +fi + +echo "" + +# 2. Check what version the client is reporting +echo "2. Version reported by running client:" +VERSION_IN_LOG=$(sudo journalctl -u oculog-client.service -n 100 2>/dev/null | grep -i "version:" | tail -1 | sed 's/.*version: \([^,]*\).*/\1/') +if [ -n "$VERSION_IN_LOG" ]; then + echo " ✓ Client reports: $VERSION_IN_LOG" +else + echo " ⚠ No version found in recent logs" +fi + +echo "" + +# 3. Check recent metrics sends +echo "3. Recent metrics activity:" +RECENT_SENDS=$(sudo journalctl -u oculog-client.service -n 20 2>/dev/null | grep -i "metrics sent successfully" | wc -l) +if [ "$RECENT_SENDS" -gt 0 ]; then + echo " ✓ Metrics are being sent successfully" + echo " Last successful send:" + sudo journalctl -u oculog-client.service -n 20 2>/dev/null | grep -i "metrics sent successfully" | tail -1 +else + echo " ⚠ No successful metric sends in recent logs" +fi + +echo "" +echo "=== Diagnostic Complete ===" +echo "" +echo "If version injection failed, the client will use file modification time." +echo "To force re-injection, run the update script again." + diff --git a/clients/ubuntu/client.conf.example b/clients/ubuntu/client.conf.example new file mode 100644 index 0000000..0383dbf --- /dev/null +++ b/clients/ubuntu/client.conf.example @@ -0,0 +1,7 @@ +{ + "server_url": "http://your-server-ip:3001", + "server_id": "ubuntu-server-01", + "api_key": "your-api-key-here", + "interval": 30 +} + diff --git a/clients/ubuntu/client.py b/clients/ubuntu/client.py new file mode 100755 index 0000000..5543e64 --- /dev/null +++ b/clients/ubuntu/client.py @@ -0,0 +1,902 @@ +#!/usr/bin/env python3 +""" +Oculog Client Agent +Collects system metrics and sends them to the server +""" + +import os +import sys +import time +import json +import socket +import requests +import psutil +import logging +import subprocess +from pathlib import Path +from datetime import datetime, timezone + +# Configuration +CONFIG_FILE = '/etc/oculog/client.conf' +LOG_FILE = '/var/log/oculog/client.log' +PID_FILE = '/var/run/oculog-client.pid' +CLIENT_SCRIPT_PATH = '/opt/oculog/client.py' + +# Client version - build timestamp in format year-month-day-hour-minute +# This will be injected by the server when serving the script +# Format: CLIENT_VERSION_BUILD_TIMESTAMP = "YYYY-MM-DD-HH-MM" +# If not injected, will use file modification time +CLIENT_VERSION_BUILD_TIMESTAMP = None # Will be injected by server + +def get_client_version(): + """Get client version from build timestamp or file modification time""" + # First check if build timestamp was injected + if CLIENT_VERSION_BUILD_TIMESTAMP: + return CLIENT_VERSION_BUILD_TIMESTAMP + + # Fallback to file modification time + try: + script_dir = os.path.dirname(os.path.abspath(__file__)) + script_path = os.path.join(script_dir, 'client.py') + if not os.path.exists(script_path): + script_path = CLIENT_SCRIPT_PATH + + if os.path.exists(script_path): + mtime = os.path.getmtime(script_path) + dt = datetime.fromtimestamp(mtime) + return dt.strftime('%Y-%m-%d-%H-%M') + except Exception as e: + logger.warning(f"Could not determine client version: {e}") + + # Final fallback: use current time (for new installations) + return datetime.now().strftime('%Y-%m-%d-%H-%M') + +CLIENT_VERSION = get_client_version() + +# Ensure log directory exists +log_dir = os.path.dirname(LOG_FILE) +os.makedirs(log_dir, exist_ok=True) + +# Setup logging +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + handlers=[ + logging.FileHandler(LOG_FILE), + logging.StreamHandler(sys.stdout) + ] +) +logger = logging.getLogger('oculog-client') + + +class VulnerabilityScanner: + """Scans for vulnerabilities in installed packages""" + + def __init__(self, enabled=True): + self.enabled = enabled + self.last_scan_time = 0 + self.scan_interval = 86400 # 1 day in seconds + + def get_installed_packages(self): + """Get list of all installed packages (excluding removed packages)""" + try: + # Use dpkg-query with status to filter out removed packages + # Status format: wantok installed, config-files, half-configured, etc. + # We only want packages with "install ok installed" status + result = subprocess.run( + ['dpkg-query', '-W', '-f=${Status}\t${Package}\t${Version}\n'], + capture_output=True, + text=True, + timeout=10 + ) + + if result.returncode != 0: + logger.error(f"dpkg-query failed: {result.stderr}") + return [] + + packages = [] + for line in result.stdout.strip().split('\n'): + if not line.strip(): + continue + parts = line.split('\t') + if len(parts) >= 3: + status, name, version = parts[0], parts[1], parts[2] + # Only include packages that are actually installed + # Status format: "install ok installed" means fully installed + # "deinstall ok config-files" (rc) means removed but config remains - exclude these + if 'install ok installed' in status: + packages.append({ + 'name': name.strip(), + 'version': version.strip() + }) + + return packages + except subprocess.TimeoutExpired: + logger.error("dpkg-query timed out") + return [] + except Exception as e: + logger.error(f"Error getting installed packages: {e}") + return [] + + def should_scan(self): + """Check if it's time to run a vulnerability scan""" + if not self.enabled: + return False + current_time = time.time() + return (current_time - self.last_scan_time) >= self.scan_interval + + def get_os_version(self): + """Get Ubuntu version from /etc/os-release""" + try: + if os.path.exists('/etc/os-release'): + with open('/etc/os-release', 'r') as f: + for line in f: + line = line.strip() + if line.startswith('VERSION_ID='): + # Extract version, remove quotes + version = line.split('=', 1)[1].strip('"').strip("'") + return version + elif line.startswith('VERSION='): + # Fallback: try to extract version from VERSION field + version_str = line.split('=', 1)[1].strip('"').strip("'") + # Try to extract version number (e.g., "22.04" from "22.04 LTS") + import re + match = re.search(r'(\d+\.\d+)', version_str) + if match: + return match.group(1) + return None + except Exception as e: + logger.warning(f"Error reading OS version: {e}") + return None + + def scan(self): + """Perform vulnerability scan""" + try: + logger.info("Starting vulnerability scan...") + packages = self.get_installed_packages() + + if not packages: + logger.warning("No packages found to scan") + return False + + logger.info(f"Scanning {len(packages)} packages for vulnerabilities") + self.last_scan_time = time.time() + + # Return packages with OS version info + return { + 'packages': packages, + 'os_version': self.get_os_version() + } + except Exception as e: + logger.error(f"Error during vulnerability scan: {e}") + return None + + +class MetricsCollector: + """Collects system metrics""" + + def __init__(self): + self.hostname = socket.gethostname() + self.last_network_stats = None + self.last_network_time = None + # Cache for rarely-changing data + self.cached_os_release = None + self.cached_public_ip = None + self.cached_public_ip_time = 0 + self.public_ip_cache_duration = 3600 # Cache public IP for 1 hour + self.last_docker_check = 0 + self.docker_check_interval = 300 # Check docker every 5 minutes + self.cached_docker_available = None + self.cached_containers = None + + def get_cpu_metrics(self): + """Get CPU usage percentage""" + try: + # Use interval=None to avoid blocking - first call returns 0.0, + # but since client runs continuously, subsequent calls will be accurate + cpu_percent = psutil.cpu_percent(interval=None) + cpu_count = psutil.cpu_count() + return { + 'usage': round(cpu_percent, 2), + 'cores': cpu_count + } + except Exception as e: + logger.error(f"Error collecting CPU metrics: {e}") + return {'usage': 0, 'cores': 0} + + def get_memory_metrics(self): + """Get memory usage""" + try: + mem = psutil.virtual_memory() + return { + 'total': round(mem.total / (1024**3), 2), # GB + 'used': round(mem.used / (1024**3), 2), # GB + 'available': round(mem.available / (1024**3), 2), # GB + 'percent': round(mem.percent, 2) + } + except Exception as e: + logger.error(f"Error collecting memory metrics: {e}") + return {'total': 0, 'used': 0, 'available': 0, 'percent': 0} + + def get_swap_metrics(self): + """Get swap usage""" + try: + swap = psutil.swap_memory() + return { + 'total': round(swap.total / (1024**3), 2), # GB + 'used': round(swap.used / (1024**3), 2), # GB + 'free': round(swap.free / (1024**3), 2), # GB + 'percent': round(swap.percent, 2) + } + except Exception as e: + logger.error(f"Error collecting swap metrics: {e}") + return {'total': 0, 'used': 0, 'free': 0, 'percent': 0} + + def get_process_count(self): + """Get total process count""" + try: + # More efficient: use process_iter with a counter instead of creating full list + count = 0 + for _ in psutil.process_iter(): + count += 1 + return count + except Exception as e: + logger.error(f"Error collecting process count: {e}") + return 0 + + def get_disk_metrics(self): + """Get disk usage for all mounted filesystems""" + try: + disks = [] + partitions = psutil.disk_partitions() + + for partition in partitions: + try: + # Skip virtual filesystems and network mounts + if partition.fstype in ['tmpfs', 'devtmpfs', 'sysfs', 'proc', 'devpts', 'cgroup', 'cgroup2', 'pstore', 'bpf', 'tracefs', 'debugfs', 'securityfs', 'hugetlbfs', 'mqueue', 'overlay', 'autofs', 'squashfs']: + continue + + # Skip network filesystems (optional - comment out if you want to include them) + if partition.fstype.startswith('nfs') or partition.fstype.startswith('cifs') or partition.fstype.startswith('smb'): + continue + + # Skip loop devices (snap packages, etc.) + if partition.device.startswith('/dev/loop'): + continue + + # Skip snap mount points + if partition.mountpoint.startswith('/snap/'): + continue + + disk_usage = psutil.disk_usage(partition.mountpoint) + disk_info = { + 'mountpoint': partition.mountpoint, + 'device': partition.device, + 'fstype': partition.fstype, + 'total': round(disk_usage.total / (1024**3), 2), # GB + 'used': round(disk_usage.used / (1024**3), 2), # GB + 'free': round(disk_usage.free / (1024**3), 2), # GB + 'percent': round(disk_usage.percent, 2) + } + disks.append(disk_info) + logger.debug(f"Collected disk metrics: {partition.mountpoint} ({partition.device}) - {disk_info['used']:.2f}GB / {disk_info['total']:.2f}GB ({disk_info['percent']:.1f}%)") + except PermissionError: + # Skip partitions we don't have permission to access + logger.debug(f"Skipping {partition.mountpoint} due to permission error") + continue + except Exception as e: + logger.warning(f"Error getting disk usage for {partition.mountpoint}: {e}") + continue + + # Return root disk for backward compatibility, plus all disks + root_disk = next((d for d in disks if d['mountpoint'] == '/'), disks[0] if disks else None) + + logger.info(f"Collected metrics for {len(disks)} disk(s): {[d['mountpoint'] for d in disks]}") + + if root_disk: + return { + 'total': root_disk['total'], + 'used': root_disk['used'], + 'free': root_disk['free'], + 'percent': root_disk['percent'], + 'disks': disks # Include all disks + } + else: + return { + 'total': 0, + 'used': 0, + 'free': 0, + 'percent': 0, + 'disks': disks + } + except Exception as e: + logger.error(f"Error collecting disk metrics: {e}") + return {'total': 0, 'used': 0, 'free': 0, 'percent': 0, 'disks': []} + + def get_network_metrics(self): + """Get network throughput""" + try: + net_io = psutil.net_io_counters() + current_time = time.time() + + if self.last_network_stats is None: + self.last_network_stats = net_io + self.last_network_time = current_time + return {'rx': 0, 'tx': 0, 'rx_total': 0, 'tx_total': 0} + + time_delta = current_time - self.last_network_time + if time_delta == 0: + return {'rx': 0, 'tx': 0, 'rx_total': 0, 'tx_total': 0} + + rx_bytes = net_io.bytes_recv - self.last_network_stats.bytes_recv + tx_bytes = net_io.bytes_sent - self.last_network_stats.bytes_sent + + rx_mbps = (rx_bytes * 8) / (time_delta * 1024 * 1024) # Mbps + tx_mbps = (tx_bytes * 8) / (time_delta * 1024 * 1024) # Mbps + + self.last_network_stats = net_io + self.last_network_time = current_time + + return { + 'rx': round(rx_mbps, 2), # Mbps + 'tx': round(tx_mbps, 2), # Mbps + 'rx_total': round(net_io.bytes_recv / (1024**3), 2), # GB + 'tx_total': round(net_io.bytes_sent / (1024**3), 2) # GB + } + except Exception as e: + logger.error(f"Error collecting network metrics: {e}") + return {'rx': 0, 'tx': 0, 'rx_total': 0, 'tx_total': 0} + + def get_server_info(self): + """Get server information: OS release, status, processes, containers, IP info""" + server_info = { + 'os_release': None, + 'live_status': None, + 'top_processes': None, + 'containers': None, + 'ip_info': None + } + + # Get OS release info (cached since it rarely changes) + if self.cached_os_release is None: + try: + os_release = {} + if os.path.exists('/etc/os-release'): + with open('/etc/os-release', 'r') as f: + for line in f: + line = line.strip() + if '=' in line and not line.startswith('#'): + key, value = line.split('=', 1) + # Remove quotes from value + value = value.strip('"').strip("'") + os_release[key] = value + self.cached_os_release = os_release if os_release else None + except Exception as e: + logger.warning(f"Error reading /etc/os-release: {e}") + self.cached_os_release = None + server_info['os_release'] = self.cached_os_release + + # Get live status (uptime, load average) + try: + uptime_seconds = time.time() - psutil.boot_time() + uptime_days = int(uptime_seconds // 86400) + uptime_hours = int((uptime_seconds % 86400) // 3600) + uptime_minutes = int((uptime_seconds % 3600) // 60) + + load_avg = os.getloadavg() + + server_info['live_status'] = { + 'uptime_days': uptime_days, + 'uptime_hours': uptime_hours, + 'uptime_minutes': uptime_minutes, + 'uptime_seconds': round(uptime_seconds, 2), + 'load_average_1min': round(load_avg[0], 2), + 'load_average_5min': round(load_avg[1], 2), + 'load_average_15min': round(load_avg[2], 2) + } + except Exception as e: + logger.warning(f"Error getting live status: {e}") + + # Get top processes by CPU usage + try: + # Collect CPU usage for all processes, then sort to get actual top processes + # This ensures we find the highest CPU-consuming processes regardless of process order + processes = [] + + for proc in psutil.process_iter(['pid', 'name', 'memory_percent', 'username']): + try: + # Get CPU percent - first call may return 0.0, but that's acceptable + # The client runs continuously so subsequent calls will have accurate values + cpu_pct = proc.cpu_percent(interval=None) + if cpu_pct is None: + cpu_pct = 0.0 + + proc_info = proc.info + proc_info['cpu_percent'] = round(cpu_pct, 2) + processes.append(proc_info) + except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): + continue + + # Sort by CPU usage and take top 10 + processes.sort(key=lambda x: x.get('cpu_percent', 0), reverse=True) + server_info['top_processes'] = processes[:10] + except Exception as e: + logger.warning(f"Error getting top processes: {e}") + + # Get running containers (Docker) - check less frequently + current_time = time.time() + if current_time - self.last_docker_check >= self.docker_check_interval: + self.last_docker_check = current_time + try: + # First check if docker is available (cached) + if self.cached_docker_available is None: + # Check if docker command exists + docker_check = subprocess.run( + ['which', 'docker'], + capture_output=True, + timeout=1 + ) + self.cached_docker_available = docker_check.returncode == 0 + + if self.cached_docker_available: + result = subprocess.run( + ['docker', 'ps', '--format', 'json'], + capture_output=True, + text=True, + timeout=5 + ) + if result.returncode == 0: + containers = [] + for line in result.stdout.strip().split('\n'): + if line.strip(): + try: + container = json.loads(line) + containers.append({ + 'id': container.get('ID', '')[:12], + 'image': container.get('Image', ''), + 'command': container.get('Command', ''), + 'created': container.get('CreatedAt', ''), + 'status': container.get('Status', ''), + 'ports': container.get('Ports', ''), + 'names': container.get('Names', '') + }) + except json.JSONDecodeError: + continue + self.cached_containers = containers if containers else None + else: + self.cached_containers = None + else: + self.cached_containers = None + except (subprocess.TimeoutExpired, FileNotFoundError, Exception) as e: + # Docker might not be installed or not running + self.cached_docker_available = False + self.cached_containers = None + + # Use cached containers value + server_info['containers'] = self.cached_containers + + # Get IP info (private and public) + try: + ip_info = { + 'private': [], + 'public': None + } + + # Get private IPs from network interfaces + for interface, addrs in psutil.net_if_addrs().items(): + for addr in addrs: + if addr.family == socket.AF_INET: # IPv4 + ip_addr = addr.address + # Skip loopback and link-local + if not ip_addr.startswith('127.') and not ip_addr.startswith('169.254.'): + ip_info['private'].append({ + 'interface': interface, + 'ip': ip_addr, + 'netmask': addr.netmask + }) + + # Try to get public IP (cached since it rarely changes) + current_time = time.time() + if self.cached_public_ip is None or (current_time - self.cached_public_ip_time) >= self.public_ip_cache_duration: + try: + # Try multiple services for reliability + public_ip_services = [ + 'https://api.ipify.org?format=json', + 'https://ifconfig.me/ip', + 'https://icanhazip.com' + ] + + for service_url in public_ip_services: + try: + response = requests.get(service_url, timeout=3) + if response.status_code == 200: + # Handle different response formats + if 'ipify' in service_url: + public_ip = response.json().get('ip', '').strip() + else: + public_ip = response.text.strip() + + if public_ip: + self.cached_public_ip = public_ip + self.cached_public_ip_time = current_time + ip_info['public'] = public_ip + break + except: + continue + except Exception as e: + logger.debug(f"Could not fetch public IP: {e}") + else: + # Use cached public IP + ip_info['public'] = self.cached_public_ip + + server_info['ip_info'] = ip_info if ip_info['private'] or ip_info['public'] else None + except Exception as e: + logger.warning(f"Error getting IP info: {e}") + + return server_info + + def collect_all_metrics(self): + """Collect all system metrics""" + server_info = self.get_server_info() + + # Extract load average and uptime from server_info for metrics payload + load_avg = None + uptime_seconds = None + if server_info.get('live_status'): + live_status = server_info['live_status'] + load_avg = { + '1min': live_status.get('load_average_1min'), + '5min': live_status.get('load_average_5min'), + '15min': live_status.get('load_average_15min') + } + uptime_seconds = live_status.get('uptime_seconds') + + return { + 'hostname': self.hostname, + 'timestamp': datetime.now(timezone.utc).isoformat(), + 'cpu': self.get_cpu_metrics(), + 'memory': self.get_memory_metrics(), + 'swap': self.get_swap_metrics(), + 'disk': self.get_disk_metrics(), + 'network': self.get_network_metrics(), + 'process_count': self.get_process_count(), + 'load_avg': load_avg, + 'uptime_seconds': uptime_seconds, + 'server_info': server_info, + 'client_version': CLIENT_VERSION + } + + +class OculogClient: + """Main client class""" + + def __init__(self, config): + self.config = config + self.server_url = config.get('server_url', 'http://localhost:3001') + self.server_id = config.get('server_id', socket.gethostname()) + self.api_key = config.get('api_key', '') + self.interval = config.get('interval', 30) # seconds + self.collector = MetricsCollector() + # Vulnerability scanning is enabled by default, but can be disabled via config + vulnerability_scan_enabled = config.get('vulnerability_scan_enabled', True) + self.vulnerability_scanner = VulnerabilityScanner(enabled=vulnerability_scan_enabled) + self.running = False + self.last_update_check = 0 + self.update_check_interval = 3600 # Check for updates every hour + + def send_metrics(self, metrics): + """Send metrics to server""" + try: + url = f"{self.server_url}/api/servers/{self.server_id}/metrics" + headers = { + 'Content-Type': 'application/json', + 'X-API-Key': self.api_key + } + + if not self.api_key: + logger.warning("No API key configured. Metrics may be rejected by server.") + + response = requests.post( + url, + json=metrics, + timeout=10, + headers=headers + ) + response.raise_for_status() + logger.info(f"Metrics sent successfully: {response.json()}") + return True + except requests.exceptions.RequestException as e: + logger.error(f"Failed to send metrics: {e}") + return False + + def send_vulnerability_scan(self, scan_data): + """Send vulnerability scan results to server in batches if needed""" + try: + url = f"{self.server_url}/api/servers/{self.server_id}/vulnerabilities/scan" + headers = { + 'Content-Type': 'application/json', + 'X-API-Key': self.api_key + } + + if not self.api_key: + logger.warning("No API key configured. Vulnerability scan may be rejected by server.") + return False + + # Extract packages and os_version + if isinstance(scan_data, dict) and 'packages' in scan_data: + packages = scan_data['packages'] + os_version = scan_data.get('os_version') + else: + # Legacy format: just a list of packages + packages = scan_data + os_version = None + + # Batch packages to avoid payload size limits (send 500 packages per batch) + batch_size = 500 + total_packages = len(packages) + total_vulnerabilities = 0 + success_count = 0 + + logger.info(f"Sending vulnerability scan for {total_packages} packages in batches of {batch_size}") + + for i in range(0, total_packages, batch_size): + batch = packages[i:i + batch_size] + batch_num = (i // batch_size) + 1 + total_batches = (total_packages + batch_size - 1) // batch_size + + payload = { + 'packages': batch, + 'os_version': os_version, + 'batch_info': { + 'batch_number': batch_num, + 'total_batches': total_batches, + 'is_last_batch': (i + batch_size >= total_packages) + } + } + + try: + response = requests.post( + url, + json=payload, + timeout=120, # Longer timeout for vulnerability scans + headers=headers + ) + response.raise_for_status() + result = response.json() + batch_vulns = result.get('vulnerabilities_found', 0) + total_vulnerabilities += batch_vulns + success_count += 1 + logger.info(f"Batch {batch_num}/{total_batches} sent successfully: {len(batch)} packages, {batch_vulns} vulnerabilities found") + except requests.exceptions.RequestException as e: + logger.error(f"Failed to send vulnerability scan batch {batch_num}/{total_batches}: {e}") + # Continue with other batches even if one fails + continue + + if success_count > 0: + logger.info(f"Vulnerability scan completed: {success_count}/{total_batches} batches successful, {total_vulnerabilities} total vulnerabilities found") + return True + else: + logger.error("All vulnerability scan batches failed") + return False + except Exception as e: + logger.error(f"Failed to send vulnerability scan: {e}") + return False + + def check_for_updates(self): + """Check if a newer client version is available""" + try: + url = f"{self.server_url}/api/client-version/latest" + headers = { + 'X-API-Key': self.api_key + } + + logger.debug(f"Checking for updates: current version={CLIENT_VERSION}, server={url}") + response = requests.get(url, timeout=5, headers=headers) + response.raise_for_status() + data = response.json() + latest_version = data.get('version') + + if not latest_version: + logger.warning(f"Update check returned no version data from server") + return False + + logger.debug(f"Server reports latest version: {latest_version}") + + # Compare versions (format: YYYY-MM-DD-HH-MM) + # Simple string comparison works for this format + if CLIENT_VERSION < latest_version: + logger.info(f"Update available: current={CLIENT_VERSION}, latest={latest_version}") + return True + else: + logger.debug(f"No update needed: current={CLIENT_VERSION}, latest={latest_version}") + + return False + except requests.exceptions.RequestException as e: + logger.warning(f"Could not check for updates (network error): {e}") + return False + except Exception as e: + logger.warning(f"Could not check for updates (unexpected error): {e}") + return False + + def perform_auto_update(self): + """Perform automatic update of the client""" + try: + logger.info("Starting automatic client update...") + + # Download updated client script + script_url = f"{self.server_url}/api/client-script" + temp_script = '/opt/oculog/client.py.new' + + response = requests.get(script_url, timeout=30) + response.raise_for_status() + + # Backup current script + if os.path.exists(CLIENT_SCRIPT_PATH): + backup_path = f"{CLIENT_SCRIPT_PATH}.backup" + subprocess.run(['cp', CLIENT_SCRIPT_PATH, backup_path], check=False) + + # Write new script + with open(temp_script, 'wb') as f: + f.write(response.content) + + # Make executable + os.chmod(temp_script, 0o755) + + # Replace old script atomically + subprocess.run(['mv', temp_script, CLIENT_SCRIPT_PATH], check=True) + + logger.info("Client script updated successfully") + + # Trigger systemd restart by exiting (systemd will restart due to Restart=always) + # We use exit code 0 to indicate successful update + logger.info("Exiting to allow systemd to restart with new version") + return True + except Exception as e: + logger.error(f"Auto-update failed: {e}") + # Try to restore backup if update failed + backup_path = f"{CLIENT_SCRIPT_PATH}.backup" + if os.path.exists(backup_path): + try: + subprocess.run(['cp', backup_path, CLIENT_SCRIPT_PATH], check=False) + logger.info("Restored backup after failed update") + except: + pass + return False + + def run(self): + """Main loop""" + self.running = True + logger.info(f"Starting Oculog client (server_id: {self.server_id}, version: {CLIENT_VERSION}, interval: {self.interval}s)") + + # Initial network stats collection (needed for first calculation) + self.collector.get_network_metrics() + time.sleep(1) + + while self.running: + try: + # Check for updates periodically + current_time = time.time() + if current_time - self.last_update_check >= self.update_check_interval: + logger.info(f"Checking for client updates (current version: {CLIENT_VERSION})...") + self.last_update_check = current_time + try: + if self.check_for_updates(): + logger.info("Newer version detected, performing auto-update...") + if self.perform_auto_update(): + logger.info("Auto-update completed, exiting to allow restart...") + # Exit gracefully - systemd will restart with Restart=always + self.running = False + sys.exit(0) + else: + logger.warning("Auto-update failed, continuing with current version") + except Exception as e: + logger.error(f"Error during update check: {e}") + # Continue running even if update check fails + + # Check for vulnerability scan (hourly) + if self.vulnerability_scanner.should_scan(): + try: + scan_data = self.vulnerability_scanner.scan() + if scan_data: + package_count = len(scan_data['packages']) if isinstance(scan_data, dict) else len(scan_data) + logger.info(f"Sending vulnerability scan for {package_count} packages...") + if self.send_vulnerability_scan(scan_data): + logger.info("Vulnerability scan completed successfully") + else: + logger.warning("Vulnerability scan failed to send, will retry on next cycle") + except Exception as e: + logger.error(f"Error during vulnerability scan: {e}") + # Continue running even if vulnerability scan fails + + metrics = self.collector.collect_all_metrics() + logger.debug(f"Collected metrics: {json.dumps(metrics, indent=2)}") + + if self.send_metrics(metrics): + logger.info("Metrics collection cycle completed successfully") + else: + logger.warning("Failed to send metrics, will retry on next cycle") + + time.sleep(self.interval) + except KeyboardInterrupt: + logger.info("Received interrupt signal, shutting down...") + self.running = False + except Exception as e: + logger.error(f"Unexpected error in main loop: {e}") + time.sleep(self.interval) + + def stop(self): + """Stop the client""" + self.running = False + + +def load_config(): + """Load configuration from file""" + default_config = { + 'server_url': 'http://localhost:3001', + 'server_id': socket.gethostname(), + 'interval': 30 + } + + if os.path.exists(CONFIG_FILE): + try: + with open(CONFIG_FILE, 'r') as f: + config = json.load(f) + default_config.update(config) + logger.info(f"Loaded configuration from {CONFIG_FILE}") + except Exception as e: + logger.warning(f"Failed to load config file, using defaults: {e}") + else: + logger.info(f"Config file not found at {CONFIG_FILE}, using defaults") + + return default_config + + +def write_pid_file(): + """Write PID file""" + try: + pid_dir = os.path.dirname(PID_FILE) + os.makedirs(pid_dir, exist_ok=True) + with open(PID_FILE, 'w') as f: + f.write(str(os.getpid())) + except Exception as e: + logger.error(f"Failed to write PID file: {e}") + + +def remove_pid_file(): + """Remove PID file""" + try: + if os.path.exists(PID_FILE): + os.remove(PID_FILE) + except Exception as e: + logger.error(f"Failed to remove PID file: {e}") + + +def main(): + """Main entry point""" + if len(sys.argv) > 1: + if sys.argv[1] == '--version': + print(f"Oculog Client version {CLIENT_VERSION}") + sys.exit(0) + elif sys.argv[1] == '--help': + print("Usage: oculog-client [--version|--help]") + print("\nOculog Client Agent") + print("Collects system metrics and sends them to the server") + sys.exit(0) + + # Ensure log directory exists + log_dir = os.path.dirname(LOG_FILE) + os.makedirs(log_dir, exist_ok=True) + + config = load_config() + client = OculogClient(config) + + try: + write_pid_file() + client.run() + finally: + remove_pid_file() + + +if __name__ == '__main__': + main() + diff --git a/clients/ubuntu/debian/control b/clients/ubuntu/debian/control new file mode 100644 index 0000000..840b355 --- /dev/null +++ b/clients/ubuntu/debian/control @@ -0,0 +1,10 @@ +Package: oculog-client +Version: 1.0.0 +Section: utils +Priority: optional +Architecture: all +Depends: python3 (>= 3.6), python3-pip +Maintainer: Ormentia +Description: Oculog Client Agent for Server Metrics Collection + Oculog client agent that collects system metrics (CPU, memory, disk, network) + and sends them to the Oculog observability platform server. diff --git a/clients/ubuntu/debian/postinst b/clients/ubuntu/debian/postinst new file mode 100755 index 0000000..908b925 --- /dev/null +++ b/clients/ubuntu/debian/postinst @@ -0,0 +1,55 @@ +#!/bin/bash +set -e + +# Post-installation script +echo "Configuring Oculog client..." + +# Create directories +mkdir -p /var/log/oculog +mkdir -p /etc/oculog + +# Install Python dependencies using system-managed approach +# Try to install via apt first (for newer Ubuntu versions) +if apt-cache show python3-psutil >/dev/null 2>&1 && apt-cache show python3-requests >/dev/null 2>&1; then + apt-get update -qq + if apt-get install -y -qq python3-psutil python3-requests >/dev/null 2>&1; then + PYTHON_BIN="/usr/bin/python3" + else + USE_VENV=1 + fi +else + USE_VENV=1 +fi + +# If apt packages aren't available, use a virtual environment +if [ "$USE_VENV" = "1" ]; then + apt-get update -qq + apt-get install -y -qq python3-venv python3-pip >/dev/null 2>&1 || true + + # Create virtual environment + python3 -m venv /opt/oculog/venv + + # Install packages in virtual environment + /opt/oculog/venv/bin/pip install --quiet --upgrade pip + /opt/oculog/venv/bin/pip install --quiet psutil==5.9.6 requests==2.31.0 + + PYTHON_BIN="/opt/oculog/venv/bin/python3" + + # Update shebang in client script + sed -i "1s|.*|#!${PYTHON_BIN}|" /opt/oculog/client.py + + # Update systemd service to use venv Python + sed -i "s|ExecStart=.*|ExecStart=${PYTHON_BIN} /opt/oculog/client.py|" /etc/systemd/system/oculog-client.service +fi + +# Enable and start service if config exists +if [ -f /etc/oculog/client.conf ]; then + systemctl daemon-reload + systemctl enable oculog-client.service 2>/dev/null || true + systemctl start oculog-client.service 2>/dev/null || true +fi + +echo "Oculog client installed successfully!" +echo "Please configure /etc/oculog/client.conf before starting the service." + +exit 0 diff --git a/clients/ubuntu/debian/postrm b/clients/ubuntu/debian/postrm new file mode 100755 index 0000000..1347553 --- /dev/null +++ b/clients/ubuntu/debian/postrm @@ -0,0 +1,26 @@ +#!/bin/bash +set -e + +# Post-removal script +if [ "$1" = "remove" ] || [ "$1" = "purge" ]; then + # Stop and disable service + systemctl stop oculog-client.service 2>/dev/null || true + systemctl disable oculog-client.service 2>/dev/null || true + + # Remove service file + rm -f /etc/systemd/system/oculog-client.service + systemctl daemon-reload + + # Remove symlink + rm -f /usr/local/bin/oculog-client + + if [ "$1" = "purge" ]; then + # Remove configuration and logs (optional - commented out to preserve data) + # rm -rf /etc/oculog + # rm -rf /var/log/oculog + # rm -rf /opt/oculog + echo "Configuration and logs preserved at /etc/oculog and /var/log/oculog" + fi +fi + +exit 0 diff --git a/clients/ubuntu/debian/rules b/clients/ubuntu/debian/rules new file mode 100755 index 0000000..0561b3d --- /dev/null +++ b/clients/ubuntu/debian/rules @@ -0,0 +1,16 @@ +#!/usr/bin/make -f + +%: + dh $@ + +override_dh_auto_install: + dh_auto_install + # Install client script + install -d $(CURDIR)/debian/oculog-client/opt/oculog + install -m 755 client.py $(CURDIR)/debian/oculog-client/opt/oculog/ + # Install systemd service + install -d $(CURDIR)/debian/oculog-client/etc/systemd/system + install -m 644 oculog-client.service $(CURDIR)/debian/oculog-client/etc/systemd/system/ + # Create symlink + install -d $(CURDIR)/debian/oculog-client/usr/local/bin + ln -sf /opt/oculog/client.py $(CURDIR)/debian/oculog-client/usr/local/bin/oculog-client diff --git a/clients/ubuntu/install.sh b/clients/ubuntu/install.sh new file mode 100755 index 0000000..2582553 --- /dev/null +++ b/clients/ubuntu/install.sh @@ -0,0 +1,189 @@ +#!/bin/bash + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +echo -e "${GREEN}Oculog Client Installation${NC}" +echo "==================================" +echo "" + +# Check if running as root +if [ "$EUID" -ne 0 ]; then + echo -e "${RED}Please run as root (use sudo)${NC}" + exit 1 +fi + +# Check if Python 3 is installed +if ! command -v python3 &> /dev/null; then + echo -e "${RED}Python 3 is not installed. Please install it first:${NC}" + echo " sudo apt update && sudo apt install -y python3 python3-pip" + exit 1 +fi + +# Get installation directory +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +INSTALL_DIR="/opt/oculog" + +# Check if this is an upgrade +IS_UPGRADE=false +SERVICE_WAS_RUNNING=false +SERVICE_WAS_ENABLED=false + +# Check if service unit file exists +if [ -f /etc/systemd/system/oculog-client.service ] || systemctl list-unit-files | grep -q "^oculog-client.service"; then + IS_UPGRADE=true + echo -e "${YELLOW}Detected existing installation - performing upgrade...${NC}" + echo "" + + # Check if service is enabled + if systemctl is-enabled --quiet oculog-client.service 2>/dev/null; then + SERVICE_WAS_ENABLED=true + fi + + # Check if service is running + if systemctl is-active --quiet oculog-client.service 2>/dev/null; then + SERVICE_WAS_RUNNING=true + echo -e "${YELLOW}Service is currently running. Stopping it...${NC}" + systemctl stop oculog-client.service || true + sleep 1 + if systemctl is-active --quiet oculog-client.service 2>/dev/null; then + echo -e "${RED}Warning: Service did not stop cleanly${NC}" + else + echo -e "${GREEN}Service stopped${NC}" + fi + fi +else + echo -e "${GREEN}Fresh installation detected${NC}" + echo "" +fi + +echo -e "${GREEN}Step 1: Creating installation directory...${NC}" +mkdir -p "$INSTALL_DIR" +mkdir -p /var/log/oculog +mkdir -p /etc/oculog + +echo -e "${GREEN}Step 2: Copying client files...${NC}" +cp "$SCRIPT_DIR/client.py" "$INSTALL_DIR/" +chmod +x "$INSTALL_DIR/client.py" + +echo -e "${GREEN}Step 3: Installing Python dependencies...${NC}" + +# Try to install via apt first (for newer Ubuntu versions with externally-managed environment) +if apt-cache show python3-psutil >/dev/null 2>&1 && apt-cache show python3-requests >/dev/null 2>&1; then + echo -e "${YELLOW}Installing via apt (system-managed packages)...${NC}" + apt-get update + if apt-get install -y python3-psutil python3-requests; then + PYTHON_BIN="/usr/bin/python3" + echo -e "${GREEN}System packages installed successfully${NC}" + else + echo -e "${YELLOW}Apt installation failed, using virtual environment...${NC}" + USE_VENV=1 + fi +else + echo -e "${YELLOW}System packages not available, using virtual environment...${NC}" + USE_VENV=1 +fi + +# If apt packages aren't available, use a virtual environment +if [ "$USE_VENV" = "1" ]; then + if [ -d "$INSTALL_DIR/venv" ]; then + echo -e "${YELLOW}Updating existing virtual environment...${NC}" + PYTHON_BIN="$INSTALL_DIR/venv/bin/python3" + else + echo -e "${YELLOW}Setting up virtual environment...${NC}" + apt-get update + apt-get install -y python3-venv python3-pip || true + + # Create virtual environment + python3 -m venv "$INSTALL_DIR/venv" + PYTHON_BIN="$INSTALL_DIR/venv/bin/python3" + fi + + # Install/upgrade packages in virtual environment + "$INSTALL_DIR/venv/bin/pip" install --quiet --upgrade pip + "$INSTALL_DIR/venv/bin/pip" install --quiet --upgrade -r "$SCRIPT_DIR/requirements.txt" + + echo -e "${GREEN}Virtual environment ready and packages installed${NC}" +fi + +# Update shebang in client script to use correct Python +sed -i "1s|.*|#!${PYTHON_BIN}|" "$INSTALL_DIR/client.py" + +echo -e "${GREEN}Step 4: Creating symlink...${NC}" +ln -sf "$INSTALL_DIR/client.py" /usr/local/bin/oculog-client + +echo -e "${GREEN}Step 5: Setting up configuration...${NC}" +if [ ! -f /etc/oculog/client.conf ]; then + # Fresh installation - create new config + if [ -f "$SCRIPT_DIR/client.conf.example" ]; then + cp "$SCRIPT_DIR/client.conf.example" /etc/oculog/client.conf + echo -e "${YELLOW}Configuration file created at /etc/oculog/client.conf${NC}" + echo -e "${YELLOW}Please edit it with your server URL and server ID${NC}" + else + cat > /etc/oculog/client.conf << EOF +{ + "server_url": "http://localhost:3001", + "server_id": "$(hostname)", + "interval": 30 +} +EOF + echo -e "${YELLOW}Default configuration created at /etc/oculog/client.conf${NC}" + fi +else + # Existing installation - preserve config + if [ "$IS_UPGRADE" = true ]; then + # Backup existing config before upgrade + BACKUP_FILE="/etc/oculog/client.conf.backup.$(date +%Y%m%d_%H%M%S)" + cp /etc/oculog/client.conf "$BACKUP_FILE" + echo -e "${GREEN}Configuration file preserved (backup: $BACKUP_FILE)${NC}" + else + echo -e "${GREEN}Configuration file already exists, preserving...${NC}" + fi +fi + +echo -e "${GREEN}Step 6: Installing systemd service...${NC}" +# Update service file to use correct Python binary +sed "s|ExecStart=/usr/local/bin/oculog-client|ExecStart=${PYTHON_BIN} $INSTALL_DIR/client.py|" "$SCRIPT_DIR/oculog-client.service" > /etc/systemd/system/oculog-client.service +systemctl daemon-reload +systemctl enable oculog-client.service + +# Restart service if it was running before upgrade +if [ "$IS_UPGRADE" = true ]; then + if [ "$SERVICE_WAS_RUNNING" = true ] || [ "$SERVICE_WAS_ENABLED" = true ]; then + echo -e "${GREEN}Step 7: Starting service...${NC}" + systemctl start oculog-client.service || true + sleep 2 + if systemctl is-active --quiet oculog-client.service 2>/dev/null; then + echo -e "${GREEN}Service started successfully${NC}" + else + echo -e "${YELLOW}Warning: Service may have failed to start. Check status with: systemctl status oculog-client${NC}" + fi + fi +fi + +echo "" +if [ "$IS_UPGRADE" = true ]; then + echo -e "${GREEN}Upgrade completed successfully!${NC}" +else + echo -e "${GREEN}Installation completed successfully!${NC}" +fi +echo "" +if [ "$IS_UPGRADE" = false ]; then + echo "Next steps:" + echo "1. Edit /etc/oculog/client.conf with your server URL" + echo "2. Start the service: sudo systemctl start oculog-client" + echo "3. Check status: sudo systemctl status oculog-client" + echo "4. View logs: sudo journalctl -u oculog-client -f" +else + echo "Upgrade complete. Service status:" + systemctl status oculog-client.service --no-pager -l || true + echo "" + echo "View logs: sudo journalctl -u oculog-client -f" +fi +echo "" + diff --git a/clients/ubuntu/oculog-client.service b/clients/ubuntu/oculog-client.service new file mode 100644 index 0000000..7a95664 --- /dev/null +++ b/clients/ubuntu/oculog-client.service @@ -0,0 +1,15 @@ +[Unit] +Description=Oculog Client Agent +After=network.target + +[Service] +Type=simple +User=root +ExecStart=/usr/local/bin/oculog-client +Restart=always +RestartSec=10 +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=multi-user.target diff --git a/clients/ubuntu/requirements.txt b/clients/ubuntu/requirements.txt new file mode 100644 index 0000000..766f6a7 --- /dev/null +++ b/clients/ubuntu/requirements.txt @@ -0,0 +1,3 @@ +psutil==5.9.6 +requests==2.31.0 + diff --git a/clients/ubuntu/troubleshoot-install.sh b/clients/ubuntu/troubleshoot-install.sh new file mode 100755 index 0000000..9900cd7 --- /dev/null +++ b/clients/ubuntu/troubleshoot-install.sh @@ -0,0 +1,87 @@ +#!/bin/bash +# Troubleshooting script for Oculog client installation + +echo "Checking Oculog client installation..." +echo "" + +# Check if client script exists +if [ -f /opt/oculog/client.py ]; then + echo "✓ Client script found at /opt/oculog/client.py" +else + echo "✗ Client script NOT found at /opt/oculog/client.py" + echo " You may need to download it manually or re-run the installer" +fi + +# Check if config exists +if [ -f /etc/oculog/client.conf ]; then + echo "✓ Configuration file found at /etc/oculog/client.conf" + echo " Current config:" + cat /etc/oculog/client.conf | sed 's/^/ /' +else + echo "✗ Configuration file NOT found at /etc/oculog/client.conf" +fi + +# Check if service file exists +if [ -f /etc/systemd/system/oculog-client.service ]; then + echo "✓ Systemd service file found" + echo " Service file contents:" + cat /etc/systemd/system/oculog-client.service | sed 's/^/ /' +else + echo "✗ Systemd service file NOT found" + echo "" + echo "Creating systemd service file..." + + # Determine Python path + if [ -f /opt/oculog/venv/bin/python3 ]; then + PYTHON_BIN="/opt/oculog/venv/bin/python3" + echo " Using virtual environment Python: $PYTHON_BIN" + else + PYTHON_BIN="/usr/bin/python3" + echo " Using system Python: $PYTHON_BIN" + fi + + # Create service file + cat > /etc/systemd/system/oculog-client.service << EOF +[Unit] +Description=Oculog Client Agent +After=network.target + +[Service] +Type=simple +User=root +ExecStart=${PYTHON_BIN} /opt/oculog/client.py +Restart=always +RestartSec=10 +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=multi-user.target +EOF + + echo "✓ Service file created" + systemctl daemon-reload + echo "✓ Systemd daemon reloaded" +fi + +# Check if symlink exists +if [ -L /usr/local/bin/oculog-client ]; then + echo "✓ Symlink found at /usr/local/bin/oculog-client" +else + echo "✗ Symlink NOT found" + if [ -f /opt/oculog/client.py ]; then + echo " Creating symlink..." + ln -sf /opt/oculog/client.py /usr/local/bin/oculog-client + echo "✓ Symlink created" + fi +fi + +echo "" +echo "Installation check complete!" +echo "" +echo "To start the service:" +echo " sudo systemctl start oculog-client" +echo " sudo systemctl enable oculog-client" +echo "" +echo "To check status:" +echo " sudo systemctl status oculog-client" diff --git a/clients/ubuntu/uninstall.sh b/clients/ubuntu/uninstall.sh new file mode 100755 index 0000000..d1aca6f --- /dev/null +++ b/clients/ubuntu/uninstall.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +echo -e "${YELLOW}Oculog Client Uninstallation${NC}" +echo "====================================" +echo "" + +# Check if running as root +if [ "$EUID" -ne 0 ]; then + echo -e "${RED}Please run as root (use sudo)${NC}" + exit 1 +fi + +echo -e "${GREEN}Step 1: Stopping and disabling service...${NC}" +systemctl stop oculog-client.service 2>/dev/null || true +systemctl disable oculog-client.service 2>/dev/null || true + +echo -e "${GREEN}Step 2: Removing systemd service file...${NC}" +rm -f /etc/systemd/system/oculog-client.service +systemctl daemon-reload + +echo -e "${GREEN}Step 3: Removing symlink...${NC}" +rm -f /usr/local/bin/oculog-client + +echo -e "${GREEN}Step 4: Removing installation directory...${NC}" +rm -rf /opt/oculog + +echo -e "${YELLOW}Note: Configuration files and logs are preserved:${NC}" +echo " - /etc/oculog/client.conf" +echo " - /var/log/oculog/client.log" +echo "" +echo -e "${GREEN}Uninstallation completed!${NC}" +echo "" + diff --git a/clients/ubuntu/update-client.sh b/clients/ubuntu/update-client.sh new file mode 100755 index 0000000..8ecdfe0 --- /dev/null +++ b/clients/ubuntu/update-client.sh @@ -0,0 +1,146 @@ +#!/bin/bash +# Oculog Client Update Script +# Updates the Oculog client with success/failure reporting for each step +# +# Usage: +# sudo bash update-client.sh [OCULOG_SERVER_URL] +# Example: sudo bash update-client.sh http://YOUR_SERVER_IP:3001 +# +# Or set environment variable: +# export OCULOG_SERVER=http://YOUR_SERVER_IP:3001 +# sudo bash update-client.sh + +set -e # Exit on error (we'll handle errors manually) + +# Configuration - use argument, environment variable, or default +if [ -n "$1" ]; then + OCULOG_SERVER="$1" +elif [ -n "$OCULOG_SERVER" ]; then + OCULOG_SERVER="$OCULOG_SERVER" +else + echo "Error: Oculog server URL not specified" + echo "" + echo "Usage: sudo bash update-client.sh [OCULOG_SERVER_URL]" + echo "Example: sudo bash update-client.sh http://YOUR_SERVER_IP:3001" + echo "" + echo "Or set environment variable:" + echo " export OCULOG_SERVER=http://YOUR_SERVER_IP:3001" + echo " sudo bash update-client.sh" + exit 1 +fi + +echo "=== Oculog Client Update Script ===" +echo "Server: $OCULOG_SERVER" +echo "" + +# Function to check command success +check_success() { + if [ $? -eq 0 ]; then + echo "✓ Success" + return 0 + else + echo "✗ Failed" + return 1 + fi +} + +# 1. Stop the Oculog client service +echo -n "Step 1: Stopping oculog-client service... " +if sudo systemctl stop oculog-client.service 2>/dev/null; then + echo "✓ Success" +else + echo "✗ Failed (service may not be running)" +fi + +# 2. Download the updated client script +echo -n "Step 2: Downloading updated client script... " +if sudo curl -s "$OCULOG_SERVER/api/client-script" | sudo tee /opt/oculog/client.py.new > /dev/null 2>&1; then + if [ -f /opt/oculog/client.py.new ] && [ -s /opt/oculog/client.py.new ]; then + echo "✓ Success" + else + echo "✗ Failed - File not created or empty" + exit 1 + fi +else + echo "✗ Failed - Download error" + exit 1 +fi + +# 3. Backup the current client script +echo -n "Step 3: Backing up current client script... " +if [ -f /opt/oculog/client.py ]; then + if sudo cp /opt/oculog/client.py /opt/oculog/client.py.backup 2>/dev/null; then + echo "✓ Success" + else + echo "✗ Failed" + exit 1 + fi +else + echo "⚠ Skipped - No existing client.py found" +fi + +# 4. Replace the client script +echo -n "Step 4: Replacing client script... " +if sudo mv /opt/oculog/client.py.new /opt/oculog/client.py 2>/dev/null; then + echo "✓ Success" +else + echo "✗ Failed" + exit 1 +fi + +# 5. Verify version was injected +echo -n "Step 5: Verifying version injection... " +if sudo grep -q 'CLIENT_VERSION_BUILD_TIMESTAMP = "[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{2\}"' /opt/oculog/client.py 2>/dev/null; then + VERSION=$(sudo grep 'CLIENT_VERSION_BUILD_TIMESTAMP = "' /opt/oculog/client.py | head -1 | sed 's/.*"\(.*\)".*/\1/') + echo "✓ Success (Version: $VERSION)" +else + echo "⚠ Warning - Version may not have been injected (will use file modification time)" +fi + +# 6. Ensure the script is executable +echo -n "Step 6: Setting executable permissions... " +if sudo chmod +x /opt/oculog/client.py 2>/dev/null; then + echo "✓ Success" +else + echo "✗ Failed" + exit 1 +fi + +# 7. Restart the service +echo -n "Step 7: Starting oculog-client service... " +if sudo systemctl start oculog-client.service 2>/dev/null; then + echo "✓ Success" +else + echo "✗ Failed" + exit 1 +fi + +# 8. Wait a moment for service to start +sleep 2 + +# 9. Verify the service is running +echo -n "Step 8: Verifying service status... " +if sudo systemctl is-active --quiet oculog-client.service 2>/dev/null; then + echo "✓ Success - Service is running" +else + echo "✗ Failed - Service is not running" + echo "" + echo "Checking service status:" + sudo systemctl status oculog-client.service --no-pager -l || true + exit 1 +fi + +echo "" +echo "=== Update Complete ===" +echo "" +echo "Note: The client version in the web UI will update after the client sends" +echo " its next metrics update (usually within 30 seconds)." +echo "" +echo "To view logs, run:" +echo " sudo journalctl -u oculog-client.service -f" +echo "" +echo "To check service status, run:" +echo " sudo systemctl status oculog-client.service" +echo "" +echo "To verify the client version immediately, check logs for:" +echo " sudo journalctl -u oculog-client.service -n 50 | grep -i version" diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..5955a13 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,75 @@ +version: '3.8' + +services: + postgres: + image: postgres:15-alpine + container_name: oculog-postgres + environment: + - POSTGRES_DB=oculog + - POSTGRES_USER=oculog + - POSTGRES_PASSWORD=oculog_password + volumes: + - postgres_data:/var/lib/postgresql/data + - ./server/backend/db/init.sql:/docker-entrypoint-initdb.d/init.sql + ports: + - "5432:5432" + restart: unless-stopped + networks: + - oculog-network + healthcheck: + test: ["CMD-SHELL", "pg_isready -U oculog"] + interval: 10s + timeout: 5s + retries: 5 + + backend: + build: + context: ./server/backend + dockerfile: Dockerfile + container_name: oculog-backend + ports: + - "3001:3001" + environment: + - NODE_ENV=development + - PORT=3001 + - CORS_ORIGIN=http://localhost:3000 + - DB_HOST=postgres + - DB_PORT=5432 + - DB_NAME=oculog + - DB_USER=oculog + - DB_PASSWORD=oculog_password + volumes: + - ./server/backend:/app + - ./clients:/app/clients + - /app/node_modules + depends_on: + postgres: + condition: service_healthy + restart: unless-stopped + networks: + - oculog-network + + frontend: + build: + context: ./server/frontend + dockerfile: Dockerfile + container_name: oculog-frontend + ports: + - "3000:3000" + environment: + - REACT_APP_API_URL=http://localhost:3001 + volumes: + - ./server/frontend:/app + - /app/node_modules + depends_on: + - backend + restart: unless-stopped + networks: + - oculog-network + +networks: + oculog-network: + driver: bridge + +volumes: + postgres_data: diff --git a/server/backend/.dockerignore b/server/backend/.dockerignore new file mode 100644 index 0000000..3ce14bb --- /dev/null +++ b/server/backend/.dockerignore @@ -0,0 +1,7 @@ +node_modules +npm-debug.log +.env +.git +.gitignore +README.md + diff --git a/server/backend/Dockerfile b/server/backend/Dockerfile new file mode 100644 index 0000000..e78ab5b --- /dev/null +++ b/server/backend/Dockerfile @@ -0,0 +1,19 @@ +FROM node:18-alpine + +WORKDIR /app + +# Copy package files +COPY package*.json ./ + +# Install dependencies +RUN npm install + +# Copy application code +COPY . . + +# Expose port +EXPOSE 3001 + +# Start the application +CMD ["npm", "start"] + diff --git a/server/backend/db/init.sql b/server/backend/db/init.sql new file mode 100644 index 0000000..8a340d0 --- /dev/null +++ b/server/backend/db/init.sql @@ -0,0 +1,125 @@ +-- Create metrics table +CREATE TABLE IF NOT EXISTS metrics ( + id SERIAL PRIMARY KEY, + server_id VARCHAR(255) NOT NULL, + timestamp TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), + cpu_usage DECIMAL(5,2), + cpu_cores INTEGER, + memory_total DECIMAL(10,2), + memory_used DECIMAL(10,2), + memory_available DECIMAL(10,2), + memory_percent DECIMAL(5,2), + disk_total DECIMAL(10,2), + disk_used DECIMAL(10,2), + disk_free DECIMAL(10,2), + disk_percent DECIMAL(5,2), + disks JSONB, + network_rx DECIMAL(10,2), + network_tx DECIMAL(10,2), + network_rx_total DECIMAL(10,2), + network_tx_total DECIMAL(10,2), + created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() +); + +-- Create indexes for better query performance +CREATE INDEX IF NOT EXISTS idx_metrics_server_id ON metrics(server_id); +CREATE INDEX IF NOT EXISTS idx_metrics_timestamp ON metrics(timestamp); +CREATE INDEX IF NOT EXISTS idx_metrics_server_timestamp ON metrics(server_id, timestamp DESC); + +-- Migration: Add disks column if it doesn't exist (for existing databases) +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'metrics' AND column_name = 'disks' + ) THEN + ALTER TABLE metrics ADD COLUMN disks JSONB; + CREATE INDEX IF NOT EXISTS idx_metrics_disks ON metrics USING GIN (disks); + END IF; +END $$; + +-- Create index for disks column (will be created if column exists) +CREATE INDEX IF NOT EXISTS idx_metrics_disks ON metrics USING GIN (disks); + +-- Migration: Add load average columns if they don't exist +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'metrics' AND column_name = 'load_avg_1min' + ) THEN + ALTER TABLE metrics ADD COLUMN load_avg_1min DECIMAL(5,2); + ALTER TABLE metrics ADD COLUMN load_avg_5min DECIMAL(5,2); + ALTER TABLE metrics ADD COLUMN load_avg_15min DECIMAL(5,2); + END IF; +END $$; + +-- Migration: Add swap columns if they don't exist +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'metrics' AND column_name = 'swap_total' + ) THEN + ALTER TABLE metrics ADD COLUMN swap_total DECIMAL(10,2); + ALTER TABLE metrics ADD COLUMN swap_used DECIMAL(10,2); + ALTER TABLE metrics ADD COLUMN swap_free DECIMAL(10,2); + ALTER TABLE metrics ADD COLUMN swap_percent DECIMAL(5,2); + END IF; +END $$; + +-- Migration: Add process_count and uptime columns if they don't exist +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'metrics' AND column_name = 'process_count' + ) THEN + ALTER TABLE metrics ADD COLUMN process_count INTEGER; + ALTER TABLE metrics ADD COLUMN uptime_seconds DECIMAL(10,2); + END IF; +END $$; + +-- Create servers table to track server metadata +CREATE TABLE IF NOT EXISTS servers ( + server_id VARCHAR(255) PRIMARY KEY, + hostname VARCHAR(255), + first_seen TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), + last_seen TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), + total_metrics_count INTEGER DEFAULT 0 +); + +-- Create function to update server last_seen and metrics count +CREATE OR REPLACE FUNCTION update_server_stats() +RETURNS TRIGGER AS $$ +BEGIN + INSERT INTO servers (server_id, hostname, first_seen, last_seen, total_metrics_count) + VALUES (NEW.server_id, NEW.server_id, NOW(), NOW(), 1) + ON CONFLICT (server_id) DO UPDATE + SET last_seen = NOW(), + total_metrics_count = servers.total_metrics_count + 1; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- Create trigger to automatically update server stats +DROP TRIGGER IF EXISTS trigger_update_server_stats ON metrics; +CREATE TRIGGER trigger_update_server_stats + AFTER INSERT ON metrics + FOR EACH ROW + EXECUTE FUNCTION update_server_stats(); + +-- Create API keys table for client authentication +CREATE TABLE IF NOT EXISTS api_keys ( + id SERIAL PRIMARY KEY, + key_hash VARCHAR(255) NOT NULL UNIQUE, + server_id VARCHAR(255), + name VARCHAR(255), + created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), + last_used TIMESTAMP WITH TIME ZONE, + is_active BOOLEAN DEFAULT TRUE +); + +CREATE INDEX IF NOT EXISTS idx_api_keys_hash ON api_keys(key_hash); +CREATE INDEX IF NOT EXISTS idx_api_keys_server_id ON api_keys(server_id); + diff --git a/server/backend/db/migration_add_disks.sql b/server/backend/db/migration_add_disks.sql new file mode 100644 index 0000000..a0bc162 --- /dev/null +++ b/server/backend/db/migration_add_disks.sql @@ -0,0 +1,8 @@ +-- Migration: Add disks column to metrics table +-- This allows storing multiple disk metrics as JSON + +ALTER TABLE metrics ADD COLUMN IF NOT EXISTS disks JSONB; + +-- Create index on disks column for better query performance +CREATE INDEX IF NOT EXISTS idx_metrics_disks ON metrics USING GIN (disks); + diff --git a/server/backend/db/migration_add_server_info.sql b/server/backend/db/migration_add_server_info.sql new file mode 100644 index 0000000..9e6c721 --- /dev/null +++ b/server/backend/db/migration_add_server_info.sql @@ -0,0 +1,17 @@ +-- Migration: Add server_info column to servers table +-- This column stores server metadata: OS info, live status, top processes, containers, IP info + +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'servers' AND column_name = 'server_info' + ) THEN + ALTER TABLE servers ADD COLUMN server_info JSONB; + CREATE INDEX IF NOT EXISTS idx_servers_server_info ON servers USING GIN (server_info); + RAISE NOTICE 'server_info column added to servers table'; + ELSE + RAISE NOTICE 'server_info column already exists'; + END IF; +END $$; + diff --git a/server/backend/db/migration_add_synthetic_monitors.sql b/server/backend/db/migration_add_synthetic_monitors.sql new file mode 100644 index 0000000..0a80100 --- /dev/null +++ b/server/backend/db/migration_add_synthetic_monitors.sql @@ -0,0 +1,44 @@ +-- Create synthetic_monitors table +CREATE TABLE IF NOT EXISTS synthetic_monitors ( + id SERIAL PRIMARY KEY, + name VARCHAR(255) NOT NULL, + type VARCHAR(50) NOT NULL CHECK (type IN ('http_status', 'ping', 'port_check')), + target VARCHAR(500) NOT NULL, + expected_status INTEGER, + port INTEGER, + interval INTEGER NOT NULL DEFAULT 60, + enabled BOOLEAN DEFAULT TRUE, + created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), + updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() +); + +-- Create monitor_results table +CREATE TABLE IF NOT EXISTS monitor_results ( + id SERIAL PRIMARY KEY, + monitor_id INTEGER NOT NULL REFERENCES synthetic_monitors(id) ON DELETE CASCADE, + status VARCHAR(20) NOT NULL CHECK (status IN ('success', 'failed')), + response_time INTEGER, + message TEXT, + timestamp TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() +); + +-- Create indexes for better query performance +CREATE INDEX IF NOT EXISTS idx_monitor_results_monitor_id ON monitor_results(monitor_id); +CREATE INDEX IF NOT EXISTS idx_monitor_results_timestamp ON monitor_results(timestamp DESC); +CREATE INDEX IF NOT EXISTS idx_synthetic_monitors_enabled ON synthetic_monitors(enabled) WHERE enabled = TRUE; + +-- Create function to update updated_at timestamp +CREATE OR REPLACE FUNCTION update_updated_at_column() +RETURNS TRIGGER AS $$ +BEGIN + NEW.updated_at = NOW(); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- Create trigger to automatically update updated_at +DROP TRIGGER IF EXISTS trigger_update_synthetic_monitors_updated_at ON synthetic_monitors; +CREATE TRIGGER trigger_update_synthetic_monitors_updated_at + BEFORE UPDATE ON synthetic_monitors + FOR EACH ROW + EXECUTE FUNCTION update_updated_at_column(); diff --git a/server/backend/package-lock.json b/server/backend/package-lock.json new file mode 100644 index 0000000..c1fc9c0 --- /dev/null +++ b/server/backend/package-lock.json @@ -0,0 +1,1500 @@ +{ + "name": "oculog-backend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "oculog-backend", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "axios": "^1.6.0", + "body-parser": "^1.20.2", + "cors": "^2.8.5", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "pg": "^8.11.3" + }, + "devDependencies": { + "nodemon": "^3.0.1" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "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, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "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==", + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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, + "license": "MIT", + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nodemon": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.11.tgz", + "integrity": "sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/pg": { + "version": "8.17.2", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.17.2.tgz", + "integrity": "sha512-vjbKdiBJRqzcYw1fNU5KuHyYvdJ1qpcQg1CeBrHFqV1pWgHeVR6j/+kX0E1AAXfyuLUGY1ICrN2ELKA/z2HWzw==", + "license": "MIT", + "peer": true, + "dependencies": { + "pg-connection-string": "^2.10.1", + "pg-pool": "^3.11.0", + "pg-protocol": "^1.11.0", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.3.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.3.0.tgz", + "integrity": "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.10.1.tgz", + "integrity": "sha512-iNzslsoeSH2/gmDDKiyMqF64DATUCWj3YJ0wP14kqcsf2TUklwimd+66yYojKwZCA7h2yRNLGug71hCBA2a4sw==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.11.0.tgz", + "integrity": "sha512-MJYfvHwtGp870aeusDh+hg9apvOe2zmpZJpyt+BMtzUWlVqbhFmMK6bOBXLBUPd7iRtIF9fZplDc7KrPN3PN7w==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.11.0.tgz", + "integrity": "sha512-pfsxk2M9M3BuGgDOfuy37VNRRX3jmKgMjcvAcWqNDpZSf4cUmv8HSOl5ViRQFsfARFn0KuUQTgLxVMbNq5NW3g==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "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, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + } + } +} diff --git a/server/backend/package.json b/server/backend/package.json new file mode 100644 index 0000000..6b8f8a1 --- /dev/null +++ b/server/backend/package.json @@ -0,0 +1,26 @@ +{ + "name": "oculog-backend", + "version": "1.0.0", + "description": "Backend API for Oculog metrics observability platform", + "main": "src/index.js", + "scripts": { + "start": "node src/index.js", + "dev": "nodemon src/index.js", + "migrate": "node src/migrate-cli.js" + }, + "keywords": ["metrics", "observability", "monitoring"], + "author": "", + "license": "MIT", + "dependencies": { + "express": "^4.18.2", + "cors": "^2.8.5", + "dotenv": "^16.3.1", + "body-parser": "^1.20.2", + "pg": "^8.11.3", + "axios": "^1.6.0" + }, + "devDependencies": { + "nodemon": "^3.0.1" + } +} + diff --git a/server/backend/src/alertEvaluator.js b/server/backend/src/alertEvaluator.js new file mode 100644 index 0000000..da554a8 --- /dev/null +++ b/server/backend/src/alertEvaluator.js @@ -0,0 +1,271 @@ +/** + * Alert Evaluator + * Evaluates alert policies against current server metrics and synthetic monitor results + */ + +const db = require('./db'); +const fs = require('fs').promises; +const path = require('path'); + +/** + * Evaluate server metric alerts + */ +async function evaluateServerMetricAlerts() { + try { + const policies = await db.getEnabledAlertPolicies(); + const serverMetricPolicies = policies.filter(p => p.type === 'server_metric'); + + if (serverMetricPolicies.length === 0) { + return; + } + + // Get latest metrics for all servers + const latestMetrics = await db.getLatestMetrics(); + const servers = await db.getServers(); + + for (const policy of serverMetricPolicies) { + const serversToCheck = policy.server_id + ? servers.filter(s => s.server_id === policy.server_id) + : servers; + + for (const server of serversToCheck) { + const metrics = latestMetrics[server.server_id]; + if (!metrics) { + // Check for server_not_reporting + if (policy.metric_type === 'server_not_reporting') { + const lastSeen = new Date(server.last_seen); + const now = new Date(); + const minutesSinceLastSeen = (now - lastSeen) / (1000 * 60); + + if (minutesSinceLastSeen >= policy.threshold) { + await triggerAlert(policy, server.server_id, + `Server ${server.server_id} has not reported metrics for ${Math.round(minutesSinceLastSeen)} minutes`); + } else { + await resolveAlertIfExists(policy, server.server_id); + } + } + continue; + } + + // Evaluate based on metric type + let shouldAlert = false; + let message = ''; + + switch (policy.metric_type) { + case 'cpu_high': + const cpuUsage = metrics.cpu?.usage || 0; + shouldAlert = cpuUsage >= policy.threshold; + if (shouldAlert) { + message = `CPU usage is ${cpuUsage.toFixed(1)}% (threshold: ${policy.threshold}%)`; + } + break; + + case 'ram_high': + const memPercent = metrics.memory?.percent || 0; + shouldAlert = memPercent >= policy.threshold; + if (shouldAlert) { + message = `RAM usage is ${memPercent.toFixed(1)}% (threshold: ${policy.threshold}%)`; + } + break; + + case 'disk_used': + const diskPercent = metrics.disk?.percent || 0; + shouldAlert = diskPercent >= policy.threshold; + if (shouldAlert) { + message = `Disk usage is ${diskPercent.toFixed(1)}% (threshold: ${policy.threshold}%)`; + } + break; + + case 'server_not_reporting': + const lastSeen = new Date(server.last_seen); + const now = new Date(); + const minutesSinceLastSeen = (now - lastSeen) / (1000 * 60); + shouldAlert = minutesSinceLastSeen >= policy.threshold; + if (shouldAlert) { + message = `Server has not reported metrics for ${Math.round(minutesSinceLastSeen)} minutes`; + } + break; + + case 'client_out_of_date': + const clientVersion = await db.getClientVersion(server.server_id); + if (clientVersion) { + // Get latest client version (same logic as /api/servers/:serverId/info) + let latestVersion = null; + try { + const possiblePaths = [ + path.join(__dirname, '../../../../clients/ubuntu/client.py'), + path.join(__dirname, '../../../clients/ubuntu/client.py'), + path.join(process.cwd(), 'clients/ubuntu/client.py'), + '/app/clients/ubuntu/client.py' + ]; + + for (const p of possiblePaths) { + try { + const stats = await fs.stat(p); + const mtime = new Date(stats.mtime); + latestVersion = mtime.toISOString().slice(0, 16).replace('T', '-').replace(':', '-'); + break; + } catch (e) { + continue; + } + } + + if (latestVersion && clientVersion < latestVersion) { + shouldAlert = true; + message = `Client version ${clientVersion} is out of date (latest: ${latestVersion})`; + } + } catch (e) { + // If we can't check, don't alert + shouldAlert = false; + } + } + break; + } + + if (shouldAlert) { + await triggerAlert(policy, server.server_id, message); + } else { + await resolveAlertIfExists(policy, server.server_id); + } + } + } + } catch (error) { + console.error('[Alert Evaluator] Error evaluating server metric alerts:', { + message: error.message, + stack: error.stack + }); + } +} + +/** + * Evaluate synthetic monitor alerts + */ +async function evaluateSyntheticMonitorAlerts() { + try { + const policies = await db.getEnabledAlertPolicies(); + const monitorPolicies = policies.filter(p => p.type === 'synthetic_monitor'); + + if (monitorPolicies.length === 0) { + return; + } + + // Get all monitors with their last results + const monitors = await db.getSyntheticMonitors(); + + for (const policy of monitorPolicies) { + const monitorsToCheck = policy.monitor_id + ? monitors.filter(m => m.id === policy.monitor_id) + : monitors; + + for (const monitor of monitorsToCheck) { + if (!monitor.last_result) { + continue; // No results yet + } + + // Check if monitor failed + if (monitor.last_result.status === 'failed') { + await triggerAlert(policy, `Monitor ${monitor.id}`, + `Synthetic monitor "${monitor.name}" failed: ${monitor.last_result.message || 'Check failed'}`); + } else { + // Monitor is healthy, resolve any active alerts + await resolveAlertIfExists(policy, `Monitor ${monitor.id}`); + } + } + } + } catch (error) { + console.error('[Alert Evaluator] Error evaluating synthetic monitor alerts:', { + message: error.message, + stack: error.stack + }); + } +} + +/** + * Trigger an alert if one doesn't already exist + */ +async function triggerAlert(policy, target, message) { + try { + // Check if alert already exists + const existingAlert = await db.getActiveAlert(policy.id, target); + + if (existingAlert) { + // Alert already exists, don't create duplicate + return; + } + + // Create new alert + await db.createAlert({ + policy_id: policy.id, + policy_name: policy.name, + target: target, + message: message, + status: 'active' + }); + } catch (error) { + console.error('[Alert Evaluator] Error triggering alert:', { + message: error.message, + stack: error.stack, + policyId: policy.id, + policyName: policy.name, + target, + alertMessage: message + }); + } +} + +/** + * Resolve alert if it exists + */ +async function resolveAlertIfExists(policy, target) { + try { + const existingAlert = await db.getActiveAlert(policy.id, target); + + if (existingAlert) { + await db.resolveAlert({ + alert_id: existingAlert.id + }); + } + } catch (error) { + console.error('[Alert Evaluator] Error resolving alert:', { + message: error.message, + stack: error.stack, + policyId: policy.id, + policyName: policy.name, + target, + alertId: existingAlert?.id + }); + } +} + +/** + * Run alert evaluation + */ +async function evaluateAlerts() { + try { + await evaluateServerMetricAlerts(); + await evaluateSyntheticMonitorAlerts(); + } catch (error) { + console.error('[Alert Evaluator] Error in alert evaluation:', { + message: error.message, + stack: error.stack + }); + } +} + +/** + * Start the alert evaluator + */ +function startAlertEvaluator() { + // Run evaluation immediately on startup + evaluateAlerts(); + + // Then run evaluation every 60 seconds + setInterval(evaluateAlerts, 60000); +} + +module.exports = { + evaluateAlerts, + evaluateServerMetricAlerts, + evaluateSyntheticMonitorAlerts, + startAlertEvaluator +}; diff --git a/server/backend/src/db.js b/server/backend/src/db.js new file mode 100644 index 0000000..3a2bccb --- /dev/null +++ b/server/backend/src/db.js @@ -0,0 +1,2016 @@ +const { Pool } = require('pg'); +require('dotenv').config(); + +// Create connection pool +const pool = new Pool({ + host: process.env.DB_HOST || 'localhost', + port: process.env.DB_PORT || 5432, + database: process.env.DB_NAME || 'oculog', + user: process.env.DB_USER || 'oculog', + password: process.env.DB_PASSWORD || 'oculog_password', + max: 20, + idleTimeoutMillis: 30000, + connectionTimeoutMillis: 2000, +}); + +// Test connection +pool.on('error', (err) => { + console.error('[Database] Unexpected error on idle client:', { + message: err.message, + code: err.code, + stack: err.stack + }); + process.exit(-1); +}); + +// Cache for column existence checks (columns don't change during runtime) +const columnCache = { + swap: null, + processCount: null, + loadAvg: null, + uptime: null +}; + +/** + * Save metrics to database + */ +async function saveMetrics(serverId, metrics) { + const { + cpu, + memory, + swap, + disk, + network, + process_count, + load_avg, + uptime_seconds, + timestamp + } = metrics; + + // Extract disks array if present, otherwise use empty array + const disksArray = disk?.disks || (Array.isArray(disk) ? disk : null); + + // Check if new columns exist (use cached values) + const hasSwap = await columnExists('swap_total', 'swap'); + const hasProcessCount = await columnExists('process_count', 'processCount'); + const hasLoadAvg = await columnExists('load_avg_1min', 'loadAvg'); + const hasUptime = await columnExists('uptime_seconds', 'uptime'); + + // Build INSERT query dynamically based on column existence + let columns = [ + 'server_id', + 'timestamp', + 'cpu_usage', + 'cpu_cores', + 'memory_total', + 'memory_used', + 'memory_available', + 'memory_percent', + 'disk_total', + 'disk_used', + 'disk_free', + 'disk_percent', + 'network_rx', + 'network_tx', + 'network_rx_total', + 'network_tx_total', + 'disks' + ]; + + let values = [ + serverId, + timestamp || new Date(), + cpu?.usage || null, + cpu?.cores || null, + memory?.total || null, + memory?.used || null, + memory?.available || null, + memory?.percent || null, + disk?.total || null, + disk?.used || null, + disk?.free || null, + disk?.percent || null, + network?.rx || null, + network?.tx || null, + network?.rx_total || null, + network?.tx_total || null, + disksArray ? JSON.stringify(disksArray) : null + ]; + + // Add new columns if they exist + if (hasSwap) { + columns.push('swap_total', 'swap_used', 'swap_free', 'swap_percent'); + values.push( + swap?.total || null, + swap?.used || null, + swap?.free || null, + swap?.percent || null + ); + } + + if (hasProcessCount) { + columns.push('process_count'); + values.push(process_count || null); + } + + if (hasLoadAvg) { + columns.push('load_avg_1min', 'load_avg_5min', 'load_avg_15min'); + values.push( + load_avg?.['1min'] || null, + load_avg?.['5min'] || null, + load_avg?.['15min'] || null + ); + } + + if (hasUptime) { + columns.push('uptime_seconds'); + values.push(uptime_seconds || null); + } + + // Build placeholders for VALUES clause + const placeholders = values.map((_, index) => `$${index + 1}`).join(', '); + + const query = ` + INSERT INTO metrics (${columns.join(', ')}) + VALUES (${placeholders}) + RETURNING id + `; + + try { + const result = await pool.query(query, values); + return result.rows[0]; + } catch (error) { + console.error('[saveMetrics] Error saving metrics:', { + message: error.message, + code: error.code, + detail: error.detail, + hint: error.hint, + stack: error.stack, + serverId, + query, + values: values.map((v, i) => ({ index: i, value: typeof v === 'string' && v.length > 100 ? v.substring(0, 100) + '...' : v })) + }); + throw error; + } +} + +/** + * Get all servers + */ +async function getServers() { + const query = 'SELECT server_id, hostname, first_seen, last_seen, total_metrics_count FROM servers ORDER BY last_seen DESC'; + try { + const result = await pool.query(query); + return result.rows; + } catch (error) { + console.error('Error fetching servers:', error); + throw error; + } +} + +/** + * Update server info + */ +async function updateServerInfo(serverId, serverInfo) { + const query = ` + UPDATE servers + SET server_info = $1 + WHERE server_id = $2 + `; + + try { + await pool.query(query, [JSON.stringify(serverInfo), serverId]); + } catch (error) { + console.error('Error updating server info:', error); + throw error; + } +} + +/** + * Update client version for a server + */ +async function updateClientVersion(serverId, clientVersion) { + const query = ` + UPDATE servers + SET client_version = $1 + WHERE server_id = $2 + `; + + try { + await pool.query(query, [clientVersion, serverId]); + } catch (error) { + console.error('Error updating client version:', error); + throw error; + } +} + +/** + * Get client version for a server + */ +async function getClientVersion(serverId) { + const query = ` + SELECT client_version + FROM servers + WHERE server_id = $1 + `; + + try { + const result = await pool.query(query, [serverId]); + if (result.rows.length === 0) { + return null; + } + return result.rows[0].client_version; + } catch (error) { + console.error('Error fetching client version:', error); + throw error; + } +} + +/** + * Get server info for a specific server + */ +async function getServerInfo(serverId) { + const query = ` + SELECT server_info + FROM servers + WHERE server_id = $1 + `; + + try { + const result = await pool.query(query, [serverId]); + if (result.rows.length === 0) { + return null; + } + + const serverInfo = result.rows[0].server_info; + // PostgreSQL JSONB is automatically parsed by pg library + // But handle both cases: already parsed object or string + if (typeof serverInfo === 'string') { + try { + return JSON.parse(serverInfo); + } catch (e) { + return serverInfo; + } + } + return serverInfo; + } catch (error) { + console.error('Error fetching server info:', error); + throw error; + } +} + +/** + * Check if a column exists in the metrics table (with caching) + */ +async function columnExists(columnName, cacheKey) { + // Check cache first + if (cacheKey && columnCache[cacheKey] !== null) { + return columnCache[cacheKey]; + } + + try { + const result = await pool.query(` + SELECT EXISTS ( + SELECT 1 + FROM information_schema.columns + WHERE table_name = 'metrics' AND column_name = $1 + ) + `, [columnName]); + const exists = result.rows[0].exists; + + // Cache the result + if (cacheKey) { + columnCache[cacheKey] = exists; + } + + return exists; + } catch (error) { + console.error(`Error checking if column ${columnName} exists:`, error); + return false; + } +} + +/** + * Get metrics for a specific server with optional filters + */ +async function getServerMetrics(serverId, options = {}) { + const { + limit = 1000, + offset = 0, + startTime, + endTime + } = options; + + // Check if new columns exist (with caching) + const hasSwap = await columnExists('swap_total', 'swap'); + const hasProcessCount = await columnExists('process_count', 'processCount'); + const hasLoadAvg = await columnExists('load_avg_1min', 'loadAvg'); + const hasUptime = await columnExists('uptime_seconds', 'uptime'); + + // Build SELECT clause dynamically based on column existence + let selectClause = ` + id, + server_id, + timestamp, + cpu_usage, + cpu_cores, + memory_total, + memory_used, + memory_available, + memory_percent, + disk_total, + disk_used, + disk_free, + disk_percent, + network_rx, + network_tx, + network_rx_total, + network_tx_total, + disks + `; + + if (hasSwap) { + selectClause += `, + swap_total, + swap_used, + swap_free, + swap_percent`; + } + + if (hasProcessCount) { + selectClause += `, + process_count`; + } + + if (hasLoadAvg) { + selectClause += `, + load_avg_1min, + load_avg_5min, + load_avg_15min`; + } + + if (hasUptime) { + selectClause += `, + uptime_seconds`; + } + + let query = ` + SELECT ${selectClause} + FROM metrics + WHERE server_id = $1 + `; + + const values = [serverId]; + let paramIndex = 2; + + if (startTime) { + query += ` AND timestamp >= $${paramIndex}`; + values.push(startTime); + paramIndex++; + } + + if (endTime) { + query += ` AND timestamp <= $${paramIndex}`; + values.push(endTime); + paramIndex++; + } + + query += ` ORDER BY timestamp DESC LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`; + values.push(limit, offset); + + try { + const result = await pool.query(query, values); + return result.rows.map(row => { + const result = { + timestamp: row.timestamp, + cpu: { + usage: row.cpu_usage, + cores: row.cpu_cores + }, + memory: { + total: row.memory_total, + used: row.memory_used, + available: row.memory_available, + percent: row.memory_percent + }, + disk: { + total: row.disk_total, + used: row.disk_used, + free: row.disk_free, + percent: row.disk_percent, + // PostgreSQL JSONB is automatically parsed by pg library + // But handle both cases: already parsed object/array or string + ...(row.disks !== null && row.disks !== undefined && { + disks: (typeof row.disks === 'string' ? JSON.parse(row.disks) : row.disks) + }) + }, + network: { + rx: row.network_rx, + tx: row.network_tx, + rx_total: row.network_rx_total, + tx_total: row.network_tx_total + } + }; + + // Add new fields only if they exist + if (hasSwap) { + result.swap = { + total: row.swap_total, + used: row.swap_used, + free: row.swap_free, + percent: row.swap_percent + }; + } + + if (hasProcessCount) { + result.process_count = row.process_count; + } + + if (hasLoadAvg) { + result.load_avg = { + '1min': row.load_avg_1min, + '5min': row.load_avg_5min, + '15min': row.load_avg_15min + }; + } + + if (hasUptime) { + result.uptime_seconds = row.uptime_seconds; + } + + return result; + }); + } catch (error) { + console.error('[getServerMetrics] Error fetching server metrics:', { + message: error.message, + code: error.code, + stack: error.stack, + serverId, + options + }); + throw error; + } +} + +/** + * Get latest metrics for all servers + */ +async function getLatestMetrics() { + // Check if new columns exist (use cached values) + const hasSwap = await columnExists('swap_total', 'swap'); + const hasProcessCount = await columnExists('process_count', 'processCount'); + const hasLoadAvg = await columnExists('load_avg_1min', 'loadAvg'); + const hasUptime = await columnExists('uptime_seconds', 'uptime'); + + // Build SELECT clause dynamically + let selectClause = ` + m.server_id, + m.timestamp, + m.cpu_usage, + m.cpu_cores, + m.memory_total, + m.memory_used, + m.memory_available, + m.memory_percent, + m.disk_total, + m.disk_used, + m.disk_free, + m.disk_percent, + m.network_rx, + m.network_tx, + m.network_rx_total, + m.network_tx_total, + m.disks, + s.client_version + `; + + if (hasSwap) { + selectClause += `, + m.swap_total, + m.swap_used, + m.swap_free, + m.swap_percent`; + } + + if (hasProcessCount) { + selectClause += `, + m.process_count`; + } + + if (hasLoadAvg) { + selectClause += `, + m.load_avg_1min, + m.load_avg_5min, + m.load_avg_15min`; + } + + if (hasUptime) { + selectClause += `, + m.uptime_seconds`; + } + + const query = ` + SELECT DISTINCT ON (m.server_id) + ${selectClause} + FROM metrics m + LEFT JOIN servers s ON m.server_id = s.server_id + ORDER BY m.server_id, m.timestamp DESC + `; + + try { + const result = await pool.query(query); + const metrics = {}; + + result.rows.forEach(row => { + const metric = { + timestamp: row.timestamp, + cpu: { + usage: row.cpu_usage, + cores: row.cpu_cores + }, + memory: { + total: row.memory_total, + used: row.memory_used, + available: row.memory_available, + percent: row.memory_percent + }, + disk: { + total: row.disk_total, + used: row.disk_used, + free: row.disk_free, + percent: row.disk_percent, + // PostgreSQL JSONB is automatically parsed by pg library + // But handle both cases: already parsed object/array or string + ...(row.disks !== null && row.disks !== undefined && { + disks: (typeof row.disks === 'string' ? JSON.parse(row.disks) : row.disks) + }) + }, + network: { + rx: row.network_rx, + tx: row.network_tx, + rx_total: row.network_rx_total, + tx_total: row.network_tx_total + }, + clientVersion: row.client_version + }; + + // Add new fields only if they exist + if (hasSwap) { + metric.swap = { + total: row.swap_total, + used: row.swap_used, + free: row.swap_free, + percent: row.swap_percent + }; + } + + if (hasProcessCount) { + metric.process_count = row.process_count; + } + + if (hasLoadAvg) { + metric.load_avg = { + '1min': row.load_avg_1min, + '5min': row.load_avg_5min, + '15min': row.load_avg_15min + }; + } + + if (hasUptime) { + metric.uptime_seconds = row.uptime_seconds; + } + + metrics[row.server_id] = metric; + }); + + return metrics; + } catch (error) { + console.error('Error fetching latest metrics:', error); + throw error; + } +} + +/** + * Get metrics statistics for a server (min, max, avg) + */ +async function getServerStats(serverId, startTime, endTime) { + let query = ` + SELECT + COUNT(*) as count, + MIN(cpu_usage) as min_cpu, + MAX(cpu_usage) as max_cpu, + AVG(cpu_usage) as avg_cpu, + MIN(memory_percent) as min_memory, + MAX(memory_percent) as max_memory, + AVG(memory_percent) as avg_memory, + MIN(disk_percent) as min_disk, + MAX(disk_percent) as max_disk, + AVG(disk_percent) as avg_disk, + SUM(network_rx) as total_rx, + SUM(network_tx) as total_tx + FROM metrics + WHERE server_id = $1 + `; + + const values = [serverId]; + let paramIndex = 2; + + if (startTime) { + query += ` AND timestamp >= $${paramIndex}`; + values.push(startTime); + paramIndex++; + } + + if (endTime) { + query += ` AND timestamp <= $${paramIndex}`; + values.push(endTime); + paramIndex++; + } + + try { + const result = await pool.query(query, values); + return result.rows[0]; + } catch (error) { + console.error('Error fetching server stats:', error); + throw error; + } +} + +/** + * Clean up old metrics (optional - for data retention) + */ +async function cleanupOldMetrics(daysToKeep = 30) { + const query = ` + DELETE FROM metrics + WHERE timestamp < NOW() - INTERVAL '${daysToKeep} days' + `; + + try { + const result = await pool.query(query); + return result.rowCount; + } catch (error) { + console.error('Error cleaning up old metrics:', error); + throw error; + } +} + +const crypto = require('crypto'); + +/** + * Generate a new API key + */ +function generateApiKey() { + return crypto.randomBytes(32).toString('hex'); +} + +/** + * Hash an API key for storage + */ +function hashApiKey(apiKey) { + return crypto.createHash('sha256').update(apiKey).digest('hex'); +} + +/** + * Create a new API key + */ +async function createApiKey(serverId, name) { + const apiKey = generateApiKey(); + const keyHash = hashApiKey(apiKey); + + const query = ` + INSERT INTO api_keys (key_hash, server_id, name, is_active) + VALUES ($1, $2, $3, TRUE) + RETURNING id, created_at + `; + + try { + const result = await pool.query(query, [keyHash, serverId, name]); + return { + id: result.rows[0].id, + apiKey, // Return the plain key (only shown once) + keyHash, + serverId, + name, + created_at: result.rows[0].created_at + }; + } catch (error) { + console.error('Error creating API key:', error); + throw error; + } +} + +/** + * Validate an API key + */ +async function validateApiKey(apiKey) { + if (!apiKey) { + return null; + } + + const keyHash = hashApiKey(apiKey); + + const query = ` + UPDATE api_keys + SET last_used = NOW() + WHERE key_hash = $1 AND is_active = TRUE + RETURNING id, server_id, name + `; + + try { + const result = await pool.query(query, [keyHash]); + if (result.rows.length === 0) { + return null; + } + return result.rows[0]; + } catch (error) { + console.error('Error validating API key:', error); + return null; + } +} + +/** + * Get API keys for a server + */ +async function getApiKeys(serverId) { + const query = ` + SELECT id, server_id, name, created_at, last_used, is_active + FROM api_keys + WHERE server_id = $1 + ORDER BY created_at DESC + `; + + try { + const result = await pool.query(query, [serverId]); + return result.rows; + } catch (error) { + console.error('Error fetching API keys:', error); + throw error; + } +} + +/** + * Revoke an API key + */ +async function revokeApiKey(keyHash) { + const query = ` + UPDATE api_keys + SET is_active = FALSE + WHERE key_hash = $1 + RETURNING id + `; + + try { + const result = await pool.query(query, [keyHash]); + return result.rows.length > 0; + } catch (error) { + console.error('Error revoking API key:', error); + throw error; + } +} + +/** + * Synthetic Monitors Functions + */ + +/** + * Get all synthetic monitors + */ +async function getSyntheticMonitors() { + const query = ` + SELECT + sm.*, + ( + SELECT jsonb_build_object( + 'status', mr.status, + 'response_time', mr.response_time, + 'message', mr.message, + 'timestamp', mr.timestamp + ) + FROM monitor_results mr + WHERE mr.monitor_id = sm.id + ORDER BY mr.timestamp DESC + LIMIT 1 + ) as last_result + FROM synthetic_monitors sm + ORDER BY sm.created_at DESC + `; + + try { + const result = await pool.query(query); + return result.rows.map(row => ({ + ...row, + last_result: row.last_result || null + })); + } catch (error) { + console.error('Error fetching synthetic monitors:', error); + throw error; + } +} + +/** + * Get a single synthetic monitor by ID + */ +async function getSyntheticMonitor(id) { + const query = ` + SELECT + sm.*, + ( + SELECT jsonb_build_object( + 'status', mr.status, + 'response_time', mr.response_time, + 'message', mr.message, + 'timestamp', mr.timestamp + ) + FROM monitor_results mr + WHERE mr.monitor_id = sm.id + ORDER BY mr.timestamp DESC + LIMIT 1 + ) as last_result + FROM synthetic_monitors sm + WHERE sm.id = $1 + `; + + try { + const result = await pool.query(query, [id]); + if (result.rows.length === 0) { + return null; + } + return { + ...result.rows[0], + last_result: result.rows[0].last_result || null + }; + } catch (error) { + console.error('Error fetching synthetic monitor:', error); + throw error; + } +} + +/** + * Create a new synthetic monitor + */ +async function createSyntheticMonitor(monitorData) { + const { + name, + type, + target, + expected_status, + port, + interval, + enabled + } = monitorData; + + const query = ` + INSERT INTO synthetic_monitors (name, type, target, expected_status, port, interval, enabled) + VALUES ($1, $2, $3, $4, $5, $6, $7) + RETURNING * + `; + + try { + const result = await pool.query(query, [ + name, + type, + target, + expected_status || null, + port || null, + interval || 60, + enabled !== false + ]); + return result.rows[0]; + } catch (error) { + console.error('Error creating synthetic monitor:', error); + throw error; + } +} + +/** + * Update a synthetic monitor + */ +async function updateSyntheticMonitor(id, monitorData) { + const { + name, + type, + target, + expected_status, + port, + interval, + enabled + } = monitorData; + + const query = ` + UPDATE synthetic_monitors + SET + name = COALESCE($1, name), + type = COALESCE($2, type), + target = COALESCE($3, target), + expected_status = $4, + port = $5, + interval = COALESCE($6, interval), + enabled = COALESCE($7, enabled) + WHERE id = $8 + RETURNING * + `; + + try { + const result = await pool.query(query, [ + name, + type, + target, + expected_status, + port, + interval, + enabled, + id + ]); + if (result.rows.length === 0) { + return null; + } + return result.rows[0]; + } catch (error) { + console.error('Error updating synthetic monitor:', error); + throw error; + } +} + +/** + * Delete a synthetic monitor + */ +async function deleteSyntheticMonitor(id) { + const query = 'DELETE FROM synthetic_monitors WHERE id = $1 RETURNING id'; + + try { + const result = await pool.query(query, [id]); + return result.rows.length > 0; + } catch (error) { + console.error('Error deleting synthetic monitor:', error); + throw error; + } +} + +/** + * Get enabled monitors that need to be checked + */ +async function getEnabledMonitors() { + const query = ` + SELECT * FROM synthetic_monitors + WHERE enabled = TRUE + ORDER BY updated_at ASC + `; + + try { + const result = await pool.query(query); + return result.rows; + } catch (error) { + console.error('Error fetching enabled monitors:', error); + throw error; + } +} + +/** + * Save monitor check result + */ +async function saveMonitorResult(monitorId, result) { + const { + status, + response_time, + message + } = result; + + const query = ` + INSERT INTO monitor_results (monitor_id, status, response_time, message) + VALUES ($1, $2, $3, $4) + RETURNING * + `; + + try { + const result = await pool.query(query, [ + monitorId, + status, + response_time || null, + message || null + ]); + return result.rows[0]; + } catch (error) { + console.error('Error saving monitor result:', error); + throw error; + } +} + +/** + * Get monitor results for a specific monitor + */ +async function getMonitorResults(monitorId, options = {}) { + const { + limit = 100, + startTime, + endTime + } = options; + + let query = ` + SELECT * FROM monitor_results + WHERE monitor_id = $1 + `; + + const values = [monitorId]; + let paramIndex = 2; + + if (startTime) { + query += ` AND timestamp >= $${paramIndex}`; + values.push(startTime); + paramIndex++; + } + + if (endTime) { + query += ` AND timestamp <= $${paramIndex}`; + values.push(endTime); + paramIndex++; + } + + query += ` ORDER BY timestamp DESC LIMIT $${paramIndex}`; + values.push(limit); + + try { + const result = await pool.query(query, values); + return result.rows; + } catch (error) { + console.error('Error fetching monitor results:', error); + throw error; + } +} + +/** + * Alert Policies Functions + */ + +/** + * Get all alert policies + */ +async function getAlertPolicies() { + const query = ` + SELECT * FROM alert_policies + ORDER BY created_at DESC + `; + + try { + const result = await pool.query(query); + return result.rows; + } catch (error) { + console.error('Error fetching alert policies:', error); + throw error; + } +} + +/** + * Get enabled alert policies + */ +async function getEnabledAlertPolicies() { + const query = ` + SELECT * FROM alert_policies + WHERE enabled = TRUE + ORDER BY created_at DESC + `; + + try { + const result = await pool.query(query); + return result.rows; + } catch (error) { + console.error('Error fetching enabled alert policies:', error); + throw error; + } +} + +/** + * Get a single alert policy by ID + */ +async function getAlertPolicy(id) { + const query = 'SELECT * FROM alert_policies WHERE id = $1'; + + try { + const result = await pool.query(query, [id]); + if (result.rows.length === 0) { + return null; + } + return result.rows[0]; + } catch (error) { + console.error('Error fetching alert policy:', error); + throw error; + } +} + +/** + * Create a new alert policy + */ +async function createAlertPolicy(policyData) { + const { + name, + type, + metric_type, + monitor_id, + threshold, + server_id, + enabled + } = policyData; + + const query = ` + INSERT INTO alert_policies (name, type, metric_type, monitor_id, threshold, server_id, enabled) + VALUES ($1, $2, $3, $4, $5, $6, $7) + RETURNING * + `; + + try { + const result = await pool.query(query, [ + name, + type, + metric_type || null, + monitor_id || null, + threshold || null, + server_id || null, + enabled !== false + ]); + return result.rows[0]; + } catch (error) { + console.error('Error creating alert policy:', error); + throw error; + } +} + +/** + * Update an alert policy + */ +async function updateAlertPolicy(id, policyData) { + const { + name, + type, + metric_type, + monitor_id, + threshold, + server_id, + enabled + } = policyData; + + const query = ` + UPDATE alert_policies + SET + name = COALESCE($1, name), + type = COALESCE($2, type), + metric_type = $3, + monitor_id = $4, + threshold = $5, + server_id = $6, + enabled = COALESCE($7, enabled) + WHERE id = $8 + RETURNING * + `; + + try { + const result = await pool.query(query, [ + name, + type, + metric_type, + monitor_id, + threshold, + server_id, + enabled, + id + ]); + if (result.rows.length === 0) { + return null; + } + return result.rows[0]; + } catch (error) { + console.error('Error updating alert policy:', error); + throw error; + } +} + +/** + * Delete an alert policy + */ +async function deleteAlertPolicy(id) { + const query = 'DELETE FROM alert_policies WHERE id = $1 RETURNING id'; + + try { + const result = await pool.query(query, [id]); + return result.rows.length > 0; + } catch (error) { + console.error('Error deleting alert policy:', error); + throw error; + } +} + +/** + * Alerts Functions + */ + +/** + * Get all alerts (with optional filters) + */ +async function getAlerts(options = {}) { + const { + status, + policy_id, + limit = 1000 + } = options; + + let query = 'SELECT * FROM alerts WHERE 1=1'; + const values = []; + let paramIndex = 1; + + if (status) { + query += ` AND status = $${paramIndex}`; + values.push(status); + paramIndex++; + } + + if (policy_id) { + query += ` AND policy_id = $${paramIndex}`; + values.push(policy_id); + paramIndex++; + } + + query += ` ORDER BY triggered_at DESC LIMIT $${paramIndex}`; + values.push(limit); + + try { + const result = await pool.query(query, values); + return result.rows; + } catch (error) { + console.error('Error fetching alerts:', error); + throw error; + } +} + +/** + * Create a new alert + */ +async function createAlert(alertData) { + const { + policy_id, + policy_name, + target, + message, + status = 'active' + } = alertData; + + const query = ` + INSERT INTO alerts (policy_id, policy_name, target, message, status) + VALUES ($1, $2, $3, $4, $5) + RETURNING * + `; + + try { + const result = await pool.query(query, [ + policy_id, + policy_name, + target || null, + message, + status + ]); + return result.rows[0]; + } catch (error) { + console.error('Error creating alert:', error); + throw error; + } +} + +/** + * Resolve an alert (or all alerts for a policy/target) + */ +async function resolveAlert(options) { + const { + alert_id, + policy_id, + target + } = options; + + let query = 'UPDATE alerts SET status = $1, resolved_at = NOW() WHERE status = $2'; + const values = ['resolved', 'active']; + let paramIndex = 3; + + if (alert_id) { + query += ` AND id = $${paramIndex}`; + values.push(alert_id); + paramIndex++; + } + + if (policy_id && target) { + query += ` AND policy_id = $${paramIndex} AND target = $${paramIndex + 1}`; + values.push(policy_id, target); + } else if (policy_id) { + query += ` AND policy_id = $${paramIndex}`; + values.push(policy_id); + } else if (target) { + query += ` AND target = $${paramIndex}`; + values.push(target); + } + + query += ' RETURNING id'; + + try { + const result = await pool.query(query, values); + return result.rows; + } catch (error) { + console.error('Error resolving alert:', error); + throw error; + } +} + +/** + * Check if an active alert already exists for a policy/target combination + */ +async function getActiveAlert(policy_id, target) { + const query = ` + SELECT * FROM alerts + WHERE policy_id = $1 AND target = $2 AND status = 'active' + ORDER BY triggered_at DESC + LIMIT 1 + `; + + try { + const result = await pool.query(query, [policy_id, target]); + if (result.rows.length === 0) { + return null; + } + return result.rows[0]; + } catch (error) { + console.error('Error checking for active alert:', error); + throw error; + } +} + +/** + * Vulnerability Functions + */ + +/** + * Get cached vulnerability data for a package + */ +async function getCachedVulnerabilities(packageName, packageVersion, ecosystem = 'Ubuntu') { + const query = ` + SELECT vulnerabilities, cached_at, expires_at + FROM vulnerability_cache + WHERE package_name = $1 AND package_version = $2 AND ecosystem = $3 + AND expires_at > NOW() + `; + + try { + const result = await pool.query(query, [packageName, packageVersion, ecosystem]); + if (result.rows.length > 0) { + // PostgreSQL JSONB is automatically parsed by pg library + // But handle both cases: already parsed array or string + const vulns = result.rows[0].vulnerabilities; + if (typeof vulns === 'string') { + try { + return JSON.parse(vulns); + } catch (e) { + return null; + } + } + return vulns; + } + return null; + } catch (error) { + console.error('[getCachedVulnerabilities] Error:', { + message: error.message, + stack: error.stack, + packageName, + packageVersion + }); + return null; + } +} + +/** + * Cache vulnerability data for a package + */ +async function cacheVulnerabilities(packageName, packageVersion, ecosystem, vulnerabilities, cacheHours = 24) { + const expiresAt = new Date(); + expiresAt.setHours(expiresAt.getHours() + cacheHours); + + const query = ` + INSERT INTO vulnerability_cache (package_name, package_version, ecosystem, vulnerabilities, expires_at) + VALUES ($1, $2, $3, $4, $5) + ON CONFLICT (package_name, package_version, ecosystem) + DO UPDATE SET + vulnerabilities = EXCLUDED.vulnerabilities, + cached_at = NOW(), + expires_at = EXCLUDED.expires_at + `; + + try { + await pool.query(query, [packageName, packageVersion, ecosystem, JSON.stringify(vulnerabilities), expiresAt]); + } catch (error) { + console.error('[cacheVulnerabilities] Error:', { + message: error.message, + stack: error.stack, + packageName, + packageVersion + }); + throw error; + } +} + +/** + * Create or update a vulnerability record + */ +async function upsertVulnerability(vulnData) { + // Ensure cve_id is not null - use osv_id as fallback if needed + const cveId = vulnData.cve_id || vulnData.osv_id || null; + if (!cveId) { + console.warn('[upsertVulnerability] Skipping vulnerability without CVE ID or OSV ID:', { + package_name: vulnData.package_name, + ecosystem: vulnData.ecosystem + }); + return null; + } + + const query = ` + INSERT INTO vulnerabilities ( + cve_id, package_name, ecosystem, severity, summary, description, + fixed_version, affected_version_range, published_at, modified_at + ) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) + ON CONFLICT (cve_id, package_name, ecosystem) + DO UPDATE SET + severity = COALESCE(EXCLUDED.severity, vulnerabilities.severity), + summary = COALESCE(EXCLUDED.summary, vulnerabilities.summary), + description = COALESCE(EXCLUDED.description, vulnerabilities.description), + fixed_version = COALESCE(EXCLUDED.fixed_version, vulnerabilities.fixed_version), + affected_version_range = COALESCE(EXCLUDED.affected_version_range, vulnerabilities.affected_version_range), + modified_at = EXCLUDED.modified_at, + last_seen = NOW() + RETURNING id + `; + + try { + const result = await pool.query(query, [ + cveId, + vulnData.package_name, + vulnData.ecosystem, + vulnData.severity, + vulnData.summary, + vulnData.description, + vulnData.fixed_version, + vulnData.affected_version_range, + vulnData.published_at, + vulnData.modified_at + ]); + return result.rows[0].id; + } catch (error) { + console.error('[upsertVulnerability] Error:', { + message: error.message, + stack: error.stack, + vulnData: { + cve_id: cveId, + package_name: vulnData.package_name, + ecosystem: vulnData.ecosystem, + severity: vulnData.severity + } + }); + throw error; + } +} + +/** + * Link a vulnerability to a server + */ +async function linkServerVulnerability(vulnerabilityId, serverId, installedVersion) { + const query = ` + INSERT INTO server_vulnerabilities (vulnerability_id, server_id, installed_version, status) + VALUES ($1, $2, $3, 'new') + ON CONFLICT (vulnerability_id, server_id) + DO UPDATE SET + installed_version = EXCLUDED.installed_version, + last_seen = NOW(), + status = CASE + WHEN server_vulnerabilities.status = 'new' THEN 'new' + ELSE 'ongoing' + END + RETURNING id, status + `; + + try { + const result = await pool.query(query, [vulnerabilityId, serverId, installedVersion]); + return result.rows[0]; + } catch (error) { + console.error('[linkServerVulnerability] Error:', { + message: error.message, + stack: error.stack, + vulnerabilityId, + serverId + }); + throw error; + } +} + +/** + * Mark vulnerability as fixed for a server + */ +async function markVulnerabilityFixed(vulnerabilityId, serverId) { + const query = ` + UPDATE server_vulnerabilities + SET status = 'fixed', last_seen = NOW() + WHERE vulnerability_id = $1 AND server_id = $2 + RETURNING id + `; + + try { + const result = await pool.query(query, [vulnerabilityId, serverId]); + return result.rows.length > 0; + } catch (error) { + console.error('[markVulnerabilityFixed] Error:', { + message: error.message, + stack: error.stack, + vulnerabilityId, + serverId + }); + throw error; + } +} + +/** + * Process vulnerability scan results from a server + */ +async function processVulnerabilityScan(serverId, packages) { + // This will be called after OSV queries are done + // packages should be array of {name, version, vulnerabilities: []} + + const client = await pool.connect(); + try { + await client.query('BEGIN'); + + // Track which vulnerabilities we've seen in this scan by (cve_id, package_name, ecosystem) + // This prevents duplicates even if vulnerability IDs differ + const seenVulnKeys = new Set(); + const seenVulnDbIds = new Set(); + + for (const pkg of packages) { + if (!pkg.vulnerabilities || pkg.vulnerabilities.length === 0) { + continue; + } + + for (const vuln of pkg.vulnerabilities) { + // Skip if we've already processed this vulnerability in this scan + // Use normalized CVE ID + package + ecosystem as unique key + const vulnKey = `${vuln.cve_id || 'NO-CVE'}-${pkg.name}-${vuln.ecosystem || 'Ubuntu'}`; + if (seenVulnKeys.has(vulnKey)) { + console.log(`[processVulnerabilityScan] Skipping duplicate vulnerability: ${vulnKey}`); + continue; + } + seenVulnKeys.add(vulnKey); + + // Upsert vulnerability + const vulnId = await upsertVulnerability(vuln); + seenVulnDbIds.add(`${vulnId}-${serverId}`); + + // Link to server (always set status to 'new' for new detections) + await linkServerVulnerability(vulnId, serverId, pkg.version); + } + } + + // Delete vulnerabilities that are no longer present + // (package was updated or removed, vulnerability is resolved) + // We delete instead of marking as "fixed" to keep the database clean + // and avoid confusion (e.g., showing "fixed" on first scan) + const allServerVulns = await client.query( + 'SELECT vulnerability_id FROM server_vulnerabilities WHERE server_id = $1', + [serverId] + ); + + let deletedCount = 0; + for (const row of allServerVulns.rows) { + const key = `${row.vulnerability_id}-${serverId}`; + if (!seenVulnDbIds.has(key)) { + // Vulnerability no longer present, delete the server-vulnerability link + await client.query( + 'DELETE FROM server_vulnerabilities WHERE vulnerability_id = $1 AND server_id = $2', + [row.vulnerability_id, serverId] + ); + deletedCount++; + } + } + + if (deletedCount > 0) { + console.log(`[processVulnerabilityScan] Deleted ${deletedCount} resolved vulnerabilities for server ${serverId}`); + } + + await client.query('COMMIT'); + return { success: true }; + } catch (error) { + await client.query('ROLLBACK'); + console.error('[processVulnerabilityScan] Error:', { + message: error.message, + stack: error.stack, + serverId, + packageCount: packages.length + }); + throw error; + } finally { + client.release(); + } +} + +/** + * Get all vulnerabilities with affected servers + */ +async function getAllVulnerabilities(options = {}) { + const { + severity, + status, + serverId, + limit = 1000 + } = options; + + const values = []; + let paramIndex = 1; + let severityFilter = ''; + + if (severity) { + severityFilter = ` WHERE v.severity = $${paramIndex}`; + values.push(severity); + paramIndex++; + } + + let query = ` + WITH cve_packages AS ( + SELECT DISTINCT v.cve_id, v.package_name + FROM vulnerabilities v${severityFilter} + ), + cve_ecosystems AS ( + SELECT DISTINCT v.cve_id, v.ecosystem + FROM vulnerabilities v${severityFilter} + ), + cve_fixes AS ( + SELECT DISTINCT v.cve_id, NULLIF(v.fixed_version, '-') as fixed_version + FROM vulnerabilities v + WHERE v.fixed_version IS NOT NULL AND v.fixed_version != '-'${severityFilter} + ), + cve_base AS ( + SELECT + v.cve_id, + MIN(v.id) as id, + CASE + WHEN MAX(CASE v.severity WHEN 'CRITICAL' THEN 1 ELSE 0 END) = 1 THEN 'CRITICAL' + WHEN MAX(CASE v.severity WHEN 'HIGH' THEN 1 ELSE 0 END) = 1 THEN 'HIGH' + WHEN MAX(CASE v.severity WHEN 'MEDIUM' THEN 1 ELSE 0 END) = 1 THEN 'MEDIUM' + WHEN MAX(CASE v.severity WHEN 'LOW' THEN 1 ELSE 0 END) = 1 THEN 'LOW' + ELSE MAX(v.severity) + END as severity, + MAX(v.summary) as summary, + MAX(v.description) as description, + MIN(v.first_detected) as first_detected, + MAX(v.last_seen) as last_seen + FROM vulnerabilities v${severityFilter} + GROUP BY v.cve_id + ) + SELECT + cb.id, + cb.cve_id, + (SELECT STRING_AGG(package_name, ', ' ORDER BY package_name) FROM cve_packages WHERE cve_id = cb.cve_id) as package_name, + (SELECT STRING_AGG(ecosystem, ', ' ORDER BY ecosystem) FROM cve_ecosystems WHERE cve_id = cb.cve_id) as ecosystem, + cb.severity, + cb.summary, + cb.description, + (SELECT STRING_AGG(fixed_version, ', ' ORDER BY fixed_version) FROM cve_fixes WHERE cve_id = cb.cve_id) as fixed_version, + cb.first_detected, + cb.last_seen, + COUNT(DISTINCT sv.server_id) as affected_server_count, + ARRAY_AGG(DISTINCT sv.server_id) FILTER (WHERE sv.server_id IS NOT NULL) as affected_servers + FROM cve_base cb + LEFT JOIN vulnerabilities v ON cb.cve_id = v.cve_id + LEFT JOIN server_vulnerabilities sv ON v.id = sv.vulnerability_id + WHERE 1=1 + `; + + if (serverId) { + query += ` AND sv.server_id = $${paramIndex}`; + values.push(serverId); + paramIndex++; + } + + if (status) { + query += ` AND sv.status = $${paramIndex}`; + values.push(status); + paramIndex++; + } + + query += ` + GROUP BY cb.id, cb.cve_id, cb.severity, cb.summary, cb.description, cb.first_detected, cb.last_seen + HAVING COUNT(DISTINCT sv.server_id) > 0 + ORDER BY + CASE cb.severity + WHEN 'CRITICAL' THEN 1 + WHEN 'HIGH' THEN 2 + WHEN 'MEDIUM' THEN 3 + WHEN 'LOW' THEN 4 + ELSE 5 + END, + cb.last_seen DESC + LIMIT $${paramIndex} + `; + values.push(limit); + + try { + const result = await pool.query(query, values); + return result.rows.map(row => ({ + ...row, + affected_servers: row.affected_servers || [] + })); + } catch (error) { + console.error('[getAllVulnerabilities] Error:', { + message: error.message, + stack: error.stack, + options + }); + throw error; + } +} + +/** + * Get vulnerabilities for a specific server + */ +async function getServerVulnerabilities(serverId, options = {}) { + const { + severity, + status, + hasFix, + limit = 1000 + } = options; + + let query = ` + SELECT + v.id, + v.cve_id, + v.package_name, + v.ecosystem, + v.severity, + v.summary, + v.description, + v.fixed_version, + sv.installed_version, + sv.status, + sv.first_detected, + sv.last_seen + FROM vulnerabilities v + INNER JOIN server_vulnerabilities sv ON v.id = sv.vulnerability_id + WHERE sv.server_id = $1 + `; + + const values = [serverId]; + let paramIndex = 2; + + if (severity) { + query += ` AND v.severity = $${paramIndex}`; + values.push(severity); + paramIndex++; + } + + if (status) { + query += ` AND sv.status = $${paramIndex}`; + values.push(status); + paramIndex++; + } + + query += ` + ORDER BY + CASE v.severity + WHEN 'CRITICAL' THEN 1 + WHEN 'HIGH' THEN 2 + WHEN 'MEDIUM' THEN 3 + WHEN 'LOW' THEN 4 + ELSE 5 + END, + sv.last_seen DESC + LIMIT $${paramIndex} + `; + values.push(limit); + + try { + const result = await pool.query(query, values); + return result.rows; + } catch (error) { + console.error('[getServerVulnerabilities] Error:', { + message: error.message, + stack: error.stack, + serverId, + options + }); + throw error; + } +} + +/** + * Get vulnerability statistics for a server + */ +async function getServerVulnerabilityStats(serverId) { + const query = ` + SELECT + COUNT(*) as total, + COUNT(*) FILTER (WHERE v.severity = 'CRITICAL') as critical, + COUNT(*) FILTER (WHERE v.severity = 'HIGH') as high, + COUNT(*) FILTER (WHERE v.severity = 'MEDIUM') as medium, + COUNT(*) FILTER (WHERE v.severity = 'LOW') as low, + COUNT(*) FILTER (WHERE sv.status = 'new') as new, + COUNT(*) FILTER (WHERE sv.status = 'ongoing') as ongoing, + COUNT(*) FILTER (WHERE sv.status = 'fixed') as fixed + FROM vulnerabilities v + INNER JOIN server_vulnerabilities sv ON v.id = sv.vulnerability_id + WHERE sv.server_id = $1 + `; + + try { + const result = await pool.query(query, [serverId]); + return result.rows[0] || { + total: 0, + critical: 0, + high: 0, + medium: 0, + low: 0, + new: 0, + ongoing: 0, + fixed: 0 + }; + } catch (error) { + console.error('[getServerVulnerabilityStats] Error:', { + message: error.message, + stack: error.stack, + serverId + }); + throw error; + } +} + +module.exports = { + pool, + columnCache, + saveMetrics, + getServers, + getServerMetrics, + getLatestMetrics, + getServerStats, + cleanupOldMetrics, + generateApiKey, + hashApiKey, + createApiKey, + validateApiKey, + getApiKeys, + revokeApiKey, + updateServerInfo, + getServerInfo, + updateClientVersion, + getClientVersion, + getSyntheticMonitors, + getSyntheticMonitor, + createSyntheticMonitor, + updateSyntheticMonitor, + deleteSyntheticMonitor, + getEnabledMonitors, + saveMonitorResult, + getMonitorResults, + getAlertPolicies, + getEnabledAlertPolicies, + getAlertPolicy, + createAlertPolicy, + updateAlertPolicy, + deleteAlertPolicy, + getAlerts, + createAlert, + resolveAlert, + getActiveAlert, + getCachedVulnerabilities, + cacheVulnerabilities, + upsertVulnerability, + linkServerVulnerability, + markVulnerabilityFixed, + processVulnerabilityScan, + getAllVulnerabilities, + getServerVulnerabilities, + getServerVulnerabilityStats, + cleanupDuplicateVulnerabilities, + clearAllVulnerabilities +}; + +/** + * Clear all vulnerability data (for fresh start) + * Deletes all vulnerabilities, server links, and cache + */ +async function clearAllVulnerabilities() { + const client = await pool.connect(); + try { + await client.query('BEGIN'); + + // Delete vulnerability cache first (independent table) + const cacheResult = await client.query('DELETE FROM vulnerability_cache RETURNING id'); + const cacheDeleted = cacheResult.rowCount; + + // Delete all vulnerabilities (CASCADE will automatically delete server_vulnerabilities) + const vulnResult = await client.query('DELETE FROM vulnerabilities RETURNING id'); + const vulnDeleted = vulnResult.rowCount; + + // Verify server_vulnerabilities is empty (should be due to CASCADE) + const serverVulnCheck = await client.query('SELECT COUNT(*) as count FROM server_vulnerabilities'); + const serverVulnCount = parseInt(serverVulnCheck.rows[0].count); + + if (serverVulnCount > 0) { + // If CASCADE didn't work for some reason, delete manually + await client.query('DELETE FROM server_vulnerabilities'); + } + + await client.query('COMMIT'); + + console.log(`[clearAllVulnerabilities] Cleared all vulnerability data:`, { + vulnerabilitiesDeleted: vulnDeleted, + cacheEntriesDeleted: cacheDeleted, + serverLinksDeleted: serverVulnCount + }); + + return { + vulnerabilitiesDeleted: vulnDeleted, + cacheEntriesDeleted: cacheDeleted, + serverLinksDeleted: serverVulnCount + }; + } catch (error) { + await client.query('ROLLBACK'); + console.error('[clearAllVulnerabilities] Error:', { + message: error.message, + stack: error.stack + }); + throw error; + } finally { + client.release(); + } +} + +/** + * Cleanup duplicate vulnerabilities + * Removes duplicates based on normalized CVE ID + package + ecosystem + * Keeps the most recent record with the most complete data + */ +async function cleanupDuplicateVulnerabilities() { + const client = await pool.connect(); + try { + await client.query('BEGIN'); + + // Find duplicates: same normalized CVE ID, package, but different ecosystem formats + // or same CVE ID but different records + const findDuplicatesQuery = ` + WITH duplicates AS ( + SELECT + id, + cve_id, + package_name, + ecosystem, + severity, + fixed_version, + ROW_NUMBER() OVER ( + PARTITION BY cve_id, package_name + ORDER BY + CASE WHEN severity IS NOT NULL THEN 0 ELSE 1 END, + CASE WHEN fixed_version IS NOT NULL THEN 0 ELSE 1 END, + modified_at DESC + ) as rn + FROM vulnerabilities + WHERE cve_id IS NOT NULL + ) + SELECT id, cve_id, package_name, ecosystem + FROM duplicates + WHERE rn > 1 + `; + + const duplicatesResult = await client.query(findDuplicatesQuery); + const duplicateIds = duplicatesResult.rows.map(r => r.id); + + if (duplicateIds.length === 0) { + await client.query('COMMIT'); + return { duplicatesRemoved: 0 }; + } + + console.log(`[cleanupDuplicateVulnerabilities] Found ${duplicateIds.length} duplicate vulnerabilities to remove`); + + // Delete duplicate server_vulnerability links first (CASCADE should handle this, but be explicit) + await client.query(` + DELETE FROM server_vulnerabilities + WHERE vulnerability_id = ANY($1) + `, [duplicateIds]); + + // Delete duplicate vulnerabilities + await client.query(` + DELETE FROM vulnerabilities + WHERE id = ANY($1) + `, [duplicateIds]); + + await client.query('COMMIT'); + + console.log(`[cleanupDuplicateVulnerabilities] Removed ${duplicateIds.length} duplicate vulnerabilities`); + return { duplicatesRemoved: duplicateIds.length }; + } catch (error) { + await client.query('ROLLBACK'); + console.error('[cleanupDuplicateVulnerabilities] Error:', { + message: error.message, + stack: error.stack + }); + throw error; + } finally { + client.release(); + } +} + diff --git a/server/backend/src/index.js b/server/backend/src/index.js new file mode 100644 index 0000000..71fca2a --- /dev/null +++ b/server/backend/src/index.js @@ -0,0 +1,1067 @@ +const express = require('express'); +const cors = require('cors'); +const bodyParser = require('body-parser'); +const fs = require('fs').promises; +const path = require('path'); +require('dotenv').config(); +const db = require('./db'); +const { authenticateApiKey } = require('./middleware/auth'); +const { runMigrations } = require('./migrate'); +const { startMonitorRunner } = require('./monitorRunner'); +const { startAlertEvaluator } = require('./alertEvaluator'); +const osvClient = require('./osvClient'); + +const app = express(); +const PORT = process.env.PORT || 3001; + +// Run migrations on startup +runMigrations(); + +// Middleware +app.use(cors({ + origin: process.env.CORS_ORIGIN || 'http://localhost:3000', + credentials: true +})); +// Default body parser with standard limit +app.use(bodyParser.json({ limit: '10mb' })); +app.use(bodyParser.urlencoded({ extended: true, limit: '10mb' })); + +// Special body parser for vulnerability scan endpoint (larger limit) +const vulnerabilityScanParser = bodyParser.json({ limit: '50mb' }); + +// Routes +app.get('/health', (req, res) => { + res.json({ status: 'ok', timestamp: new Date().toISOString() }); +}); + +// Get all servers +app.get('/api/servers', async (req, res) => { + try { + const servers = await db.getServers(); + res.json({ servers: servers.map(s => s.server_id) }); + } catch (error) { + console.error('[GET /api/servers] Error fetching servers:', { + message: error.message, + stack: error.stack + }); + res.status(500).json({ error: 'Failed to fetch servers' }); + } +}); + +// Get server info for a specific server +app.get('/api/servers/:serverId/info', async (req, res) => { + try { + const { serverId } = req.params; + const serverInfo = await db.getServerInfo(serverId); + const clientVersion = await db.getClientVersion(serverId); + + // Get latest client version for comparison (same logic as /api/client-version/latest) + let latestVersion = null; + try { + const possiblePaths = [ + path.join(__dirname, '../../../../clients/ubuntu/client.py'), + path.join(__dirname, '../../../clients/ubuntu/client.py'), + path.join(process.cwd(), 'clients/ubuntu/client.py'), + '/app/clients/ubuntu/client.py' + ]; + + for (const p of possiblePaths) { + try { + const stats = await fs.stat(p); + const mtime = new Date(stats.mtime); + latestVersion = mtime.toISOString().slice(0, 16).replace('T', '-').replace(':', '-'); + break; + } catch (e) { + continue; + } + } + } catch (e) { + // Ignore errors getting latest version + } + + if (!serverInfo && !clientVersion) { + return res.status(404).json({ error: 'Server info not found' }); + } + + res.json({ + serverId, + serverInfo: serverInfo || {}, + clientVersion, + latestVersion, + isOutdated: clientVersion && latestVersion ? clientVersion < latestVersion : false + }); + } catch (error) { + console.error(`[GET /api/servers/${req.params.serverId}/info] Error fetching server info:`, { + message: error.message, + stack: error.stack, + serverId: req.params.serverId + }); + res.status(500).json({ error: 'Failed to fetch server info' }); + } +}); + +// Get metrics for a specific server +app.get('/api/servers/:serverId/metrics', async (req, res) => { + try { + const { serverId } = req.params; + const { limit, offset, startTime, endTime } = req.query; + + const options = { + limit: limit ? parseInt(limit) : 1000, + offset: offset ? parseInt(offset) : 0, + startTime: startTime ? new Date(startTime) : null, + endTime: endTime ? new Date(endTime) : null + }; + + const metrics = await db.getServerMetrics(serverId, options); + + if (metrics.length === 0) { + return res.status(404).json({ error: 'No metrics found for this server' }); + } + + res.json({ serverId, metrics }); + } catch (error) { + console.error(`[GET /api/servers/${req.params.serverId}/metrics] Error fetching metrics:`, { + message: error.message, + stack: error.stack, + serverId: req.params.serverId, + query: req.query + }); + res.status(500).json({ error: 'Failed to fetch metrics' }); + } +}); + +// Post metrics from client (requires API key) +app.post('/api/servers/:serverId/metrics', authenticateApiKey, async (req, res) => { + try { + const { serverId } = req.params; + const { disk, cpu, memory, swap, network, process_count, load_avg, uptime_seconds, timestamp, server_info } = req.body; + + // Verify the API key is authorized for this server + if (req.apiKeyInfo.server_id && req.apiKeyInfo.server_id !== serverId) { + return res.status(403).json({ error: 'API key not authorized for this server' }); + } + + if (!disk || !cpu || !memory || !network) { + return res.status(400).json({ error: 'Missing required metrics' }); + } + + const metrics = { + timestamp: timestamp || new Date().toISOString(), + disk, + cpu, + memory, + swap, + network, + process_count, + load_avg, + uptime_seconds + }; + + await db.saveMetrics(serverId, metrics); + + // Update server_info if provided + if (server_info) { + await db.updateServerInfo(serverId, server_info); + } + + // Update client_version if provided + if (req.body.client_version) { + await db.updateClientVersion(serverId, req.body.client_version); + } + + res.json({ success: true, message: 'Metrics received' }); + } catch (error) { + console.error(`[POST /api/servers/${serverId}/metrics] Error saving metrics:`, { + message: error.message, + code: error.code, + detail: error.detail, + hint: error.hint, + stack: error.stack, + serverId, + body: req.body + }); + res.status(500).json({ + error: 'Failed to save metrics', + message: error.message, + detail: error.detail + }); + } +}); + +// Get latest metrics for all servers +app.get('/api/metrics/latest', async (req, res) => { + try { + const metrics = await db.getLatestMetrics(); + res.json({ metrics }); + } catch (error) { + console.error('[GET /api/metrics/latest] Error fetching latest metrics:', { + message: error.message, + stack: error.stack + }); + res.status(500).json({ error: 'Failed to fetch latest metrics' }); + } +}); + +// Get statistics for a server +app.get('/api/servers/:serverId/stats', async (req, res) => { + try { + const { serverId } = req.params; + const { startTime, endTime } = req.query; + + const stats = await db.getServerStats( + serverId, + startTime ? new Date(startTime) : null, + endTime ? new Date(endTime) : null + ); + + if (!stats || stats.count === '0') { + return res.status(404).json({ error: 'No statistics found for this server' }); + } + + res.json({ serverId, stats }); + } catch (error) { + console.error(`[GET /api/servers/${req.params.serverId}/stats] Error fetching stats:`, { + message: error.message, + stack: error.stack, + serverId: req.params.serverId, + query: req.query + }); + res.status(500).json({ error: 'Failed to fetch statistics' }); + } +}); + +// API Key management endpoints +app.post('/api/keys', async (req, res) => { + try { + const { serverId, name } = req.body; + + if (!serverId) { + return res.status(400).json({ error: 'serverId is required' }); + } + + const keyData = await db.createApiKey(serverId, name || `Key for ${serverId}`); + + res.json({ + success: true, + apiKey: keyData.apiKey, // Only returned once + serverId: keyData.serverId, + name: keyData.name, + created_at: keyData.created_at + }); + } catch (error) { + console.error('[POST /api/keys] Error creating API key:', { + message: error.message, + stack: error.stack, + body: req.body + }); + res.status(500).json({ error: 'Failed to create API key' }); + } +}); + +app.get('/api/keys/:serverId', async (req, res) => { + try { + const { serverId } = req.params; + const keys = await db.getApiKeys(serverId); + res.json({ keys }); + } catch (error) { + console.error(`[GET /api/keys/${req.params.serverId}] Error fetching API keys:`, { + message: error.message, + stack: error.stack, + serverId: req.params.serverId + }); + res.status(500).json({ error: 'Failed to fetch API keys' }); + } +}); + +// Helper function to generate install script +async function generateInstallScript(serverId, serverUrl, req) { + // Use provided serverUrl or default to request origin + const finalServerUrl = serverUrl || `${req.protocol}://${req.get('host').replace(':3000', ':3001')}`; + + // Create API key for this server (or get existing one) + let keyData; + try { + // Try to get existing keys first + const existingKeys = await db.getApiKeys(serverId); + if (existingKeys && existingKeys.length > 0) { + // Use existing key (we'll need to return the plain key, but we only have the hash) + // For simplicity, create a new key + keyData = await db.createApiKey(serverId, `Auto-generated for ${serverId}`); + } else { + keyData = await db.createApiKey(serverId, `Auto-generated for ${serverId}`); + } + } catch (error) { + // If server doesn't exist yet, create the key anyway + keyData = await db.createApiKey(serverId, `Auto-generated for ${serverId}`); + } + + // Create a pre-configured install script + // Use String.raw to avoid template string interpolation issues with ${PYTHON_BIN} + const pythonBinVar = '${PYTHON_BIN}'; + const installScript = `#!/bin/bash +set -e + +echo "Installing Oculog Client..." + +# Create config +mkdir -p /etc/oculog +cat > /etc/oculog/client.conf << 'EOF' +${JSON.stringify({ + server_url: finalServerUrl, + server_id: serverId, + api_key: keyData.apiKey, + interval: 30 +}, null, 2)} +EOF +chmod 600 /etc/oculog/client.conf + +# Install Python dependencies using system-managed approach +echo "Installing Python dependencies..." + +# Try to install via apt first (for newer Ubuntu versions) +if apt-cache show python3-psutil >/dev/null 2>&1 && apt-cache show python3-requests >/dev/null 2>&1; then + echo "Installing via apt (system-managed packages)..." + apt-get update + apt-get install -y python3-psutil python3-requests || { + echo "Apt packages not available, using virtual environment..." + USE_VENV=1 + } +else + echo "System packages not available, using virtual environment..." + USE_VENV=1 +fi + +# If apt packages aren't available, use a virtual environment +if [ "$USE_VENV" = "1" ]; then + echo "Setting up virtual environment..." + apt-get update + apt-get install -y python3 python3-venv python3-pip || true + + # Create virtual environment + python3 -m venv /opt/oculog/venv + + # Install packages in virtual environment + /opt/oculog/venv/bin/pip install --quiet --upgrade pip + /opt/oculog/venv/bin/pip install --quiet psutil==5.9.6 requests==2.31.0 + + PYTHON_BIN="/opt/oculog/venv/bin/python3" +else + PYTHON_BIN="/usr/bin/python3" +fi + +# Create necessary directories +mkdir -p /opt/oculog +mkdir -p /var/log/oculog +mkdir -p /var/run/oculog + +# Download and install client script +curl -s "${finalServerUrl.replace('/api', '')}/api/client-script" > /opt/oculog/client.py +chmod +x /opt/oculog/client.py + +# Update shebang in client script to use correct Python +sed -i "1s|.*|#!${pythonBinVar}|" /opt/oculog/client.py + +ln -sf /opt/oculog/client.py /usr/local/bin/oculog-client + +# Install systemd service +cat > /etc/systemd/system/oculog-client.service << EOFSERVICE +[Unit] +Description=Oculog Client Agent +After=network.target + +[Service] +Type=simple +User=root +ExecStart=${pythonBinVar} /opt/oculog/client.py +Restart=always +RestartSec=10 +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=multi-user.target +EOFSERVICE + +systemctl daemon-reload +systemctl enable oculog-client.service +systemctl start oculog-client.service + +echo "Oculog client installed successfully!" +echo "Server ID: ${serverId}" +echo "Configuration: /etc/oculog/client.conf" +`; + + return installScript; +} + +// Download client package endpoint (POST - for web UI) +app.post('/api/download-client', async (req, res) => { + try { + const { serverId, serverUrl } = req.body; + + if (!serverId) { + return res.status(400).json({ error: 'serverId is required' }); + } + + const installScript = await generateInstallScript(serverId, serverUrl, req); + + res.setHeader('Content-Type', 'application/x-sh'); + res.setHeader('Content-Disposition', `attachment; filename="oculog-client-install-${serverId}.sh"`); + res.send(installScript); + } catch (error) { + console.error('Error generating client download:', error); + res.status(500).json({ error: 'Failed to generate client package' }); + } +}); + +// Download client package endpoint (GET - for curl + bash) +// Usage: curl -s http://server:3001/api/download-client/SERVER_ID?serverUrl=http://server:3001 | bash +app.get('/api/download-client/:serverId', async (req, res) => { + try { + const { serverId } = req.params; + const { serverUrl } = req.query; + + if (!serverId) { + return res.status(400).json({ error: 'serverId is required' }); + } + + const installScript = await generateInstallScript(serverId, serverUrl, req); + + res.setHeader('Content-Type', 'application/x-sh'); + res.send(installScript); + } catch (error) { + console.error(`[GET /api/download-client/${req.params.serverId}] Error generating client download:`, { + message: error.message, + stack: error.stack, + serverId: req.params.serverId, + query: req.query + }); + res.status(500).json({ error: 'Failed to generate client package' }); + } +}); + +// Serve client script +app.get('/api/client-script', async (req, res) => { + try { + // Try multiple possible paths + const possiblePaths = [ + path.join(__dirname, '../../../../clients/ubuntu/client.py'), + path.join(__dirname, '../../../clients/ubuntu/client.py'), + path.join(process.cwd(), 'clients/ubuntu/client.py'), + '/app/clients/ubuntu/client.py' + ]; + + let script = null; + for (const scriptPath of possiblePaths) { + try { + script = await fs.readFile(scriptPath, 'utf8'); + break; + } catch (e) { + // Try next path + continue; + } + } + + if (!script) { + throw new Error('Client script not found'); + } + + // Inject build timestamp as version (format: YYYY-MM-DD-HH-MM) + // Use the source file's modification time so all clients from same source have same version + let buildTimestamp = new Date().toISOString().slice(0, 16).replace('T', '-').replace(':', '-'); + try { + // Try to use the file's modification time + for (const scriptPath of possiblePaths) { + try { + const stats = await fs.stat(scriptPath); + const mtime = new Date(stats.mtime); + buildTimestamp = mtime.toISOString().slice(0, 16).replace('T', '-').replace(':', '-'); + break; + } catch (e) { + continue; + } + } + } catch (e) { + // Fallback to current time if can't get file stats + } + + // Replace CLIENT_VERSION_BUILD_TIMESTAMP = None with the actual build timestamp + script = script.replace( + /CLIENT_VERSION_BUILD_TIMESTAMP = None\s*# Will be injected by server/g, + `CLIENT_VERSION_BUILD_TIMESTAMP = "${buildTimestamp}" # Build timestamp injected by server` + ); + + res.setHeader('Content-Type', 'text/plain'); + res.send(script); + } catch (error) { + console.error('[GET /api/client-script] Error serving client script:', { + message: error.message, + stack: error.stack + }); + res.status(500).json({ error: 'Failed to serve client script' }); + } +}); + +// Synthetic Monitors API endpoints +app.get('/api/synthetic-monitors', async (req, res) => { + try { + const monitors = await db.getSyntheticMonitors(); + res.json({ monitors }); + } catch (error) { + console.error('[GET /api/synthetic-monitors] Error fetching synthetic monitors:', { + message: error.message, + stack: error.stack + }); + res.status(500).json({ error: 'Failed to fetch synthetic monitors' }); + } +}); + +app.get('/api/synthetic-monitors/:id', async (req, res) => { + try { + const { id } = req.params; + const monitor = await db.getSyntheticMonitor(id); + if (!monitor) { + return res.status(404).json({ error: 'Monitor not found' }); + } + res.json({ monitor }); + } catch (error) { + console.error(`[GET /api/synthetic-monitors/${req.params.id}] Error fetching synthetic monitor:`, { + message: error.message, + stack: error.stack, + monitorId: req.params.id + }); + res.status(500).json({ error: 'Failed to fetch synthetic monitor' }); + } +}); + +app.post('/api/synthetic-monitors', async (req, res) => { + try { + const monitor = await db.createSyntheticMonitor(req.body); + res.json({ monitor }); + } catch (error) { + console.error('[POST /api/synthetic-monitors] Error creating synthetic monitor:', { + message: error.message, + stack: error.stack, + body: req.body + }); + res.status(500).json({ error: 'Failed to create synthetic monitor' }); + } +}); + +app.put('/api/synthetic-monitors/:id', async (req, res) => { + try { + const { id } = req.params; + const monitor = await db.updateSyntheticMonitor(id, req.body); + if (!monitor) { + return res.status(404).json({ error: 'Monitor not found' }); + } + res.json({ monitor }); + } catch (error) { + console.error(`[PUT /api/synthetic-monitors/${req.params.id}] Error updating synthetic monitor:`, { + message: error.message, + stack: error.stack, + monitorId: req.params.id, + body: req.body + }); + res.status(500).json({ error: 'Failed to update synthetic monitor' }); + } +}); + +app.delete('/api/synthetic-monitors/:id', async (req, res) => { + try { + const { id } = req.params; + const deleted = await db.deleteSyntheticMonitor(id); + if (!deleted) { + return res.status(404).json({ error: 'Monitor not found' }); + } + res.json({ success: true }); + } catch (error) { + console.error(`[DELETE /api/synthetic-monitors/${req.params.id}] Error deleting synthetic monitor:`, { + message: error.message, + stack: error.stack, + monitorId: req.params.id + }); + res.status(500).json({ error: 'Failed to delete synthetic monitor' }); + } +}); + +app.get('/api/synthetic-monitors/:id/results', async (req, res) => { + try { + const { id } = req.params; + const { limit, startTime, endTime } = req.query; + const results = await db.getMonitorResults(id, { + limit: limit ? parseInt(limit) : 100, + startTime: startTime ? new Date(startTime) : null, + endTime: endTime ? new Date(endTime) : null + }); + res.json({ results }); + } catch (error) { + console.error(`[GET /api/synthetic-monitors/${req.params.id}/results] Error fetching monitor results:`, { + message: error.message, + stack: error.stack, + monitorId: req.params.id, + query: req.query + }); + res.status(500).json({ error: 'Failed to fetch monitor results' }); + } +}); + +// Alert Policies API endpoints +app.get('/api/alert-policies', async (req, res) => { + try { + const policies = await db.getAlertPolicies(); + res.json({ policies }); + } catch (error) { + console.error('[GET /api/alert-policies] Error fetching alert policies:', { + message: error.message, + stack: error.stack + }); + res.status(500).json({ error: 'Failed to fetch alert policies' }); + } +}); + +app.get('/api/alert-policies/:id', async (req, res) => { + try { + const { id } = req.params; + const policy = await db.getAlertPolicy(id); + if (!policy) { + return res.status(404).json({ error: 'Alert policy not found' }); + } + res.json({ policy }); + } catch (error) { + console.error(`[GET /api/alert-policies/${req.params.id}] Error fetching alert policy:`, { + message: error.message, + stack: error.stack, + policyId: req.params.id + }); + res.status(500).json({ error: 'Failed to fetch alert policy' }); + } +}); + +app.post('/api/alert-policies', async (req, res) => { + try { + const policy = await db.createAlertPolicy(req.body); + res.json({ policy }); + } catch (error) { + console.error('[POST /api/alert-policies] Error creating alert policy:', { + message: error.message, + stack: error.stack, + body: req.body + }); + res.status(500).json({ error: 'Failed to create alert policy' }); + } +}); + +app.put('/api/alert-policies/:id', async (req, res) => { + try { + const { id } = req.params; + const policy = await db.updateAlertPolicy(id, req.body); + if (!policy) { + return res.status(404).json({ error: 'Alert policy not found' }); + } + res.json({ policy }); + } catch (error) { + console.error(`[PUT /api/alert-policies/${req.params.id}] Error updating alert policy:`, { + message: error.message, + stack: error.stack, + policyId: req.params.id, + body: req.body + }); + res.status(500).json({ error: 'Failed to update alert policy' }); + } +}); + +app.delete('/api/alert-policies/:id', async (req, res) => { + try { + const { id } = req.params; + const deleted = await db.deleteAlertPolicy(id); + if (!deleted) { + return res.status(404).json({ error: 'Alert policy not found' }); + } + res.json({ success: true }); + } catch (error) { + console.error(`[DELETE /api/alert-policies/${req.params.id}] Error deleting alert policy:`, { + message: error.message, + stack: error.stack, + policyId: req.params.id + }); + res.status(500).json({ error: 'Failed to delete alert policy' }); + } +}); + +// Alerts API endpoints +app.get('/api/alerts', async (req, res) => { + try { + const { status, policy_id, limit } = req.query; + const alerts = await db.getAlerts({ + status: status || null, + policy_id: policy_id ? parseInt(policy_id) : null, + limit: limit ? parseInt(limit) : 1000 + }); + res.json({ alerts }); + } catch (error) { + console.error('[GET /api/alerts] Error fetching alerts:', { + message: error.message, + stack: error.stack, + query: req.query + }); + res.status(500).json({ error: 'Failed to fetch alerts' }); + } +}); + +// Helper function to construct Ubuntu ecosystem string from version +function getUbuntuEcosystem(osVersion) { + if (!osVersion) { + // Default fallback - try common LTS version + return 'Ubuntu:22.04:LTS'; + } + + // Known LTS versions (04 and 06 releases are typically LTS) + const ltsVersions = ['20.04', '22.04', '24.04']; + const isLTS = ltsVersions.includes(osVersion); + + if (isLTS) { + return `Ubuntu:${osVersion}:LTS`; + } else { + return `Ubuntu:${osVersion}`; + } +} + +// Vulnerability scanning endpoints +app.post('/api/servers/:serverId/vulnerabilities/scan', vulnerabilityScanParser, authenticateApiKey, async (req, res) => { + try { + const { serverId } = req.params; + const { packages, os_version, batch_info } = req.body; + + if (!packages || !Array.isArray(packages)) { + return res.status(400).json({ error: 'packages array is required' }); + } + + // Verify API key is authorized for this server + if (req.apiKeyInfo.server_id && req.apiKeyInfo.server_id !== serverId) { + return res.status(403).json({ error: 'API key not authorized for this server' }); + } + + // Construct ecosystem string from OS version (default to Ubuntu 22.04 LTS if not provided) + const ecosystem = getUbuntuEcosystem(os_version); + console.log(`[POST /api/servers/:serverId/vulnerabilities/scan] Using ecosystem: ${ecosystem} for server ${serverId} (OS version: ${os_version || 'not provided'})`); + + // Check cache for each package, collect uncached ones + // NOTE: We're skipping cache for now to ensure we get full vulnerability details + // Cache will be repopulated with complete data after this scan + const uncachedPackages = []; + const cachedResults = []; + + for (const pkg of packages) { + if (!pkg.name || !pkg.version) { + continue; // Skip invalid entries + } + + // Temporarily skip cache to force fresh queries with full details + // This ensures we get severity, fixed_version, and proper CVE IDs + // TODO: Re-enable cache after confirming data quality + /* + const cached = await db.getCachedVulnerabilities(pkg.name, pkg.version, ecosystem); + if (cached) { + cachedResults.push({ + name: pkg.name, + version: pkg.version, + vulnerabilities: cached + }); + } else { + */ + uncachedPackages.push({ + name: pkg.name, + version: pkg.version, + ecosystem: ecosystem + }); + //} + } + + // Query OSV for uncached packages (in batches if needed) + const batchSize = 100; // OSV can handle large batches, but let's be conservative + const osvResults = []; + + for (let i = 0; i < uncachedPackages.length; i += batchSize) { + const batch = uncachedPackages.slice(i, i + batchSize); + try { + const batchResults = await osvClient.queryBatch(batch); + osvResults.push(...batchResults); + + // Cache results + for (const result of batchResults) { + await db.cacheVulnerabilities( + result.package.name, + result.package.version, + ecosystem, + result.vulnerabilities + ); + } + } catch (error) { + console.error('[POST /api/servers/:serverId/vulnerabilities/scan] OSV query error:', { + message: error.message, + stack: error.stack, + serverId, + batchSize: batch.length + }); + // Continue with other batches even if one fails + } + } + + // Normalize vulnerabilities + const packagesWithVulns = []; + + // Process OSV results (cache is temporarily disabled to ensure fresh data) + for (const result of osvResults) { + packagesWithVulns.push({ + name: result.package.name, + version: result.package.version, + vulnerabilities: result.vulnerabilities.map(v => + osvClient.normalizeVulnerability(v, result.package.name, ecosystem, result.package.version) + ) + }); + } + + // Process and store vulnerabilities + await db.processVulnerabilityScan(serverId, packagesWithVulns); + + const totalVulns = packagesWithVulns.reduce((sum, p) => sum + p.vulnerabilities.length, 0); + const vulnsWithSeverity = packagesWithVulns.reduce((sum, p) => + sum + p.vulnerabilities.filter(v => v.severity).length, 0 + ); + const vulnsWithFixedVersion = packagesWithVulns.reduce((sum, p) => + sum + p.vulnerabilities.filter(v => v.fixed_version).length, 0 + ); + + console.log(`[POST /api/servers/:serverId/vulnerabilities/scan] Scan complete:`, { + serverId, + scanned: packages.length, + queried: uncachedPackages.length, + totalVulns, + vulnsWithSeverity, + vulnsWithFixedVersion, + batchInfo: batch_info || null + }); + + res.json({ + success: true, + scanned: packages.length, + cached: 0, // Cache temporarily disabled + queried: uncachedPackages.length, + vulnerabilities_found: totalVulns, + vulns_with_severity: vulnsWithSeverity, + vulns_with_fixed_version: vulnsWithFixedVersion, + batch_info: batch_info || null + }); + } catch (error) { + console.error(`[POST /api/servers/${req.params.serverId}/vulnerabilities/scan] Error:`, { + message: error.message, + stack: error.stack, + serverId: req.params.serverId, + packageCount: req.body.packages?.length + }); + res.status(500).json({ error: 'Failed to process vulnerability scan' }); + } +}); + +app.get('/api/security/vulnerabilities', async (req, res) => { + try { + const { severity, status, serverId, limit } = req.query; + const vulnerabilities = await db.getAllVulnerabilities({ + severity: severity || null, + status: status || null, + serverId: serverId || null, + limit: limit ? parseInt(limit) : 1000 + }); + res.json({ vulnerabilities }); + } catch (error) { + console.error('[GET /api/security/vulnerabilities] Error:', { + message: error.message, + stack: error.stack, + query: req.query + }); + res.status(500).json({ error: 'Failed to fetch vulnerabilities' }); + } +}); + +app.get('/api/servers/:serverId/vulnerabilities', async (req, res) => { + try { + const { serverId } = req.params; + const { severity, status, hasFix, limit } = req.query; + const vulnerabilities = await db.getServerVulnerabilities(serverId, { + severity: severity || null, + status: status || null, + hasFix: hasFix !== undefined ? hasFix : undefined, + limit: limit ? parseInt(limit) : 1000 + }); + res.json({ vulnerabilities }); + } catch (error) { + console.error(`[GET /api/servers/${req.params.serverId}/vulnerabilities] Error:`, { + message: error.message, + stack: error.stack, + serverId: req.params.serverId, + query: req.query + }); + res.status(500).json({ error: 'Failed to fetch server vulnerabilities' }); + } +}); + +app.get('/api/servers/:serverId/vulnerabilities/stats', async (req, res) => { + try { + const { serverId } = req.params; + const stats = await db.getServerVulnerabilityStats(serverId); + res.json({ stats }); + } catch (error) { + console.error(`[GET /api/servers/${req.params.serverId}/vulnerabilities/stats] Error:`, { + message: error.message, + stack: error.stack, + serverId: req.params.serverId + }); + res.status(500).json({ error: 'Failed to fetch vulnerability stats' }); + } +}); + +// Cleanup endpoint to remove duplicate vulnerabilities +app.post('/api/security/vulnerabilities/cleanup', async (req, res) => { + try { + const result = await db.cleanupDuplicateVulnerabilities(); + res.json({ + success: true, + duplicates_removed: result.duplicatesRemoved, + message: `Removed ${result.duplicatesRemoved} duplicate vulnerability records` + }); + } catch (error) { + console.error('[POST /api/security/vulnerabilities/cleanup] Error:', { + message: error.message, + stack: error.stack + }); + res.status(500).json({ error: 'Failed to cleanup duplicates' }); + } +}); + +// Clear all vulnerabilities endpoint (for fresh start) +app.post('/api/security/vulnerabilities/clear-all', async (req, res) => { + try { + const result = await db.clearAllVulnerabilities(); + res.json({ + success: true, + vulnerabilities_deleted: result.vulnerabilitiesDeleted, + cache_entries_deleted: result.cacheEntriesDeleted, + server_links_deleted: result.serverLinksDeleted, + message: `Cleared all vulnerability data: ${result.vulnerabilitiesDeleted} vulnerabilities, ${result.cacheEntriesDeleted} cache entries, ${result.serverLinksDeleted} server links` + }); + } catch (error) { + console.error('[POST /api/security/vulnerabilities/clear-all] Error:', { + message: error.message, + stack: error.stack + }); + res.status(500).json({ error: 'Failed to clear vulnerabilities' }); + } +}); + +// Get latest client version +// Debug endpoint to check database column status +app.get('/api/debug/columns', async (req, res) => { + try { + const columns = ['swap_total', 'swap_used', 'process_count', 'load_avg_1min', 'load_avg_5min', 'load_avg_15min', 'uptime_seconds']; + const results = {}; + + for (const col of columns) { + const result = await db.pool.query(` + SELECT EXISTS ( + SELECT 1 + FROM information_schema.columns + WHERE table_name = 'metrics' AND column_name = $1 + ) + `, [col]); + results[col] = result.rows[0].exists; + } + + res.json({ + columns: results, + cache: db.columnCache, + note: 'If columns exist but cache shows false, restart the backend to clear cache' + }); + } catch (error) { + console.error('[GET /api/debug/columns] Error checking columns:', { + message: error.message, + stack: error.stack + }); + res.status(500).json({ error: 'Failed to check columns', details: error.message }); + } +}); + +app.get('/api/client-version/latest', async (req, res) => { + try { + // Get the source client script file modification time + // This represents when the source code was last changed + const possiblePaths = [ + path.join(__dirname, '../../../../clients/ubuntu/client.py'), + path.join(__dirname, '../../../clients/ubuntu/client.py'), + path.join(process.cwd(), 'clients/ubuntu/client.py'), + '/app/clients/ubuntu/client.py' + ]; + + let scriptPath = null; + for (const p of possiblePaths) { + try { + await fs.access(p); + scriptPath = p; + break; + } catch (e) { + continue; + } + } + + if (!scriptPath) { + // If script not found, return current timestamp as fallback + const buildTimestamp = new Date().toISOString().slice(0, 16).replace('T', '-').replace(':', '-'); + return res.json({ version: buildTimestamp }); + } + + // Use file modification time as the "latest version" + // This way clients are only out of date if source code changed + const stats = await fs.stat(scriptPath); + const mtime = new Date(stats.mtime); + const version = mtime.toISOString().slice(0, 16).replace('T', '-').replace(':', '-'); + + res.json({ version }); + } catch (error) { + console.error('[GET /api/client-version/latest] Error getting latest client version:', { + message: error.message, + stack: error.stack + }); + // Fallback to current timestamp + const buildTimestamp = new Date().toISOString().slice(0, 16).replace('T', '-').replace(':', '-'); + res.json({ version: buildTimestamp }); + } +}); + +// Start server after migrations +async function startServer() { + try { + // Run migrations before starting server + await runMigrations(); + + app.listen(PORT, () => { + console.log(`Oculog Backend API running on port ${PORT}`); + }); + + // Start the synthetic monitor runner + startMonitorRunner(); + + // Start the alert evaluator + startAlertEvaluator(); + } catch (error) { + console.error('[Server Startup] Failed to start server:', { + message: error.message, + stack: error.stack, + port: PORT + }); + process.exit(1); + } +} + +startServer(); + diff --git a/server/backend/src/middleware/auth.js b/server/backend/src/middleware/auth.js new file mode 100644 index 0000000..fd7c0e6 --- /dev/null +++ b/server/backend/src/middleware/auth.js @@ -0,0 +1,27 @@ +const db = require('../db'); + +/** + * Middleware to authenticate API key + */ +async function authenticateApiKey(req, res, next) { + const apiKey = req.headers['x-api-key']; + + if (!apiKey) { + return res.status(401).json({ error: 'API key required' }); + } + + const keyInfo = await db.validateApiKey(apiKey); + + if (!keyInfo) { + return res.status(403).json({ error: 'Invalid or inactive API key' }); + } + + // Attach key info to request for use in routes + req.apiKeyInfo = keyInfo; + next(); +} + +module.exports = { + authenticateApiKey +}; + diff --git a/server/backend/src/migrate-cli.js b/server/backend/src/migrate-cli.js new file mode 100644 index 0000000..2d9e80b --- /dev/null +++ b/server/backend/src/migrate-cli.js @@ -0,0 +1,28 @@ +#!/usr/bin/env node +/** + * Standalone migration runner + * Run this script manually to execute database migrations + * + * Usage: + * node src/migrate-cli.js + * npm run migrate + */ + +require('dotenv').config(); +const { runMigrations } = require('./migrate'); + +async function main() { + console.log('Running database migrations manually...\n'); + + try { + await runMigrations(); + console.log('\n✓ Migrations completed successfully'); + process.exit(0); + } catch (error) { + console.error('\n✗ Migration failed:', error); + process.exit(1); + } +} + +main(); + diff --git a/server/backend/src/migrate.js b/server/backend/src/migrate.js new file mode 100644 index 0000000..3bac747 --- /dev/null +++ b/server/backend/src/migrate.js @@ -0,0 +1,419 @@ +/** + * Database migration runner + * Runs migrations on startup to ensure database schema is up to date + */ + +const db = require('./db'); + +async function runMigrations() { + try { + // Check if disks column exists + const checkColumnQuery = ` + SELECT column_name + FROM information_schema.columns + WHERE table_name = 'metrics' AND column_name = 'disks' + `; + + const result = await db.pool.query(checkColumnQuery); + + if (result.rows.length === 0) { + try { + // Add the disks column + await db.pool.query(` + ALTER TABLE metrics ADD COLUMN disks JSONB + `); + } catch (error) { + // Column might have been added between check and alter + if (error.code !== '42701') { // duplicate column error + throw error; + } + } + + // Create index if it doesn't exist + try { + await db.pool.query(` + CREATE INDEX IF NOT EXISTS idx_metrics_disks ON metrics USING GIN (disks) + `); + } catch (error) { + console.error('[Migration] Warning: Could not create disks index:', { + message: error.message, + code: error.code + }); + } + } + + // Check if server_info column exists + const checkServerInfoQuery = ` + SELECT column_name + FROM information_schema.columns + WHERE table_name = 'servers' AND column_name = 'server_info' + `; + + const serverInfoResult = await db.pool.query(checkServerInfoQuery); + + if (serverInfoResult.rows.length === 0) { + try { + // Add the server_info column + await db.pool.query(` + ALTER TABLE servers ADD COLUMN server_info JSONB + `); + } catch (error) { + // Column might have been added between check and alter + if (error.code !== '42701') { // duplicate column error + throw error; + } + } + + // Create index if it doesn't exist + try { + await db.pool.query(` + CREATE INDEX IF NOT EXISTS idx_servers_server_info ON servers USING GIN (server_info) + `); + } catch (error) { + console.error('[Migration] Warning: Could not create server_info index:', { + message: error.message, + code: error.code + }); + } + } + + // Check if client_version column exists + const checkClientVersionQuery = ` + SELECT column_name + FROM information_schema.columns + WHERE table_name = 'servers' AND column_name = 'client_version' + `; + + const clientVersionResult = await db.pool.query(checkClientVersionQuery); + + if (clientVersionResult.rows.length === 0) { + try { + // Add the client_version column + await db.pool.query(` + ALTER TABLE servers ADD COLUMN client_version VARCHAR(50) + `); + } catch (error) { + // Column might have been added between check and alter + if (error.code !== '42701') { // duplicate column error + throw error; + } + } + } + + // Check and add swap columns if they don't exist + const checkSwapQuery = ` + SELECT column_name + FROM information_schema.columns + WHERE table_name = 'metrics' AND column_name = 'swap_total' + `; + + const swapResult = await db.pool.query(checkSwapQuery); + + if (swapResult.rows.length === 0) { + try { + await db.pool.query(` + ALTER TABLE metrics ADD COLUMN swap_total DECIMAL(10,2); + ALTER TABLE metrics ADD COLUMN swap_used DECIMAL(10,2); + ALTER TABLE metrics ADD COLUMN swap_free DECIMAL(10,2); + ALTER TABLE metrics ADD COLUMN swap_percent DECIMAL(5,2); + `); + } catch (error) { + if (error.code !== '42701') { + throw error; + } + } + } + + // Check and add process_count and uptime_seconds columns if they don't exist + const checkProcessCountQuery = ` + SELECT column_name + FROM information_schema.columns + WHERE table_name = 'metrics' AND column_name = 'process_count' + `; + + const processCountResult = await db.pool.query(checkProcessCountQuery); + + if (processCountResult.rows.length === 0) { + try { + await db.pool.query(` + ALTER TABLE metrics ADD COLUMN process_count INTEGER; + ALTER TABLE metrics ADD COLUMN uptime_seconds DECIMAL(10,2); + `); + } catch (error) { + if (error.code !== '42701') { + throw error; + } + } + } + + // Check and add load_avg columns if they don't exist + const checkLoadAvgQuery = ` + SELECT column_name + FROM information_schema.columns + WHERE table_name = 'metrics' AND column_name = 'load_avg_1min' + `; + + const loadAvgResult = await db.pool.query(checkLoadAvgQuery); + + if (loadAvgResult.rows.length === 0) { + try { + await db.pool.query(` + ALTER TABLE metrics ADD COLUMN load_avg_1min DECIMAL(5,2); + ALTER TABLE metrics ADD COLUMN load_avg_5min DECIMAL(5,2); + ALTER TABLE metrics ADD COLUMN load_avg_15min DECIMAL(5,2); + `); + } catch (error) { + if (error.code !== '42701') { + throw error; + } + } + } + + // Check if synthetic_monitors table exists + const checkSyntheticMonitorsQuery = ` + SELECT table_name + FROM information_schema.tables + WHERE table_name = 'synthetic_monitors' + `; + + const syntheticMonitorsResult = await db.pool.query(checkSyntheticMonitorsQuery); + + if (syntheticMonitorsResult.rows.length === 0) { + try { + // Create synthetic_monitors table + await db.pool.query(` + CREATE TABLE synthetic_monitors ( + id SERIAL PRIMARY KEY, + name VARCHAR(255) NOT NULL, + type VARCHAR(50) NOT NULL CHECK (type IN ('http_status', 'ping', 'port_check')), + target VARCHAR(500) NOT NULL, + expected_status INTEGER, + port INTEGER, + interval INTEGER NOT NULL DEFAULT 60, + enabled BOOLEAN DEFAULT TRUE, + created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), + updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() + ) + `); + + // Create monitor_results table + await db.pool.query(` + CREATE TABLE monitor_results ( + id SERIAL PRIMARY KEY, + monitor_id INTEGER NOT NULL REFERENCES synthetic_monitors(id) ON DELETE CASCADE, + status VARCHAR(20) NOT NULL CHECK (status IN ('success', 'failed')), + response_time INTEGER, + message TEXT, + timestamp TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() + ) + `); + + // Create indexes + await db.pool.query(` + CREATE INDEX idx_monitor_results_monitor_id ON monitor_results(monitor_id); + CREATE INDEX idx_monitor_results_timestamp ON monitor_results(timestamp DESC); + CREATE INDEX idx_synthetic_monitors_enabled ON synthetic_monitors(enabled) WHERE enabled = TRUE + `); + + // Create trigger function for updated_at + await db.pool.query(` + CREATE OR REPLACE FUNCTION update_updated_at_column() + RETURNS TRIGGER AS $$ + BEGIN + NEW.updated_at = NOW(); + RETURN NEW; + END; + $$ LANGUAGE plpgsql + `); + + // Create trigger + await db.pool.query(` + CREATE TRIGGER trigger_update_synthetic_monitors_updated_at + BEFORE UPDATE ON synthetic_monitors + FOR EACH ROW + EXECUTE FUNCTION update_updated_at_column() + `); + + } catch (error) { + console.error('[Migration] Error creating synthetic monitors tables:', { + message: error.message, + code: error.code, + stack: error.stack + }); + throw error; + } + } + + // Check if alert_policies table exists + const checkAlertPoliciesQuery = ` + SELECT table_name + FROM information_schema.tables + WHERE table_name = 'alert_policies' + `; + + const alertPoliciesResult = await db.pool.query(checkAlertPoliciesQuery); + + if (alertPoliciesResult.rows.length === 0) { + try { + // Create alert_policies table + await db.pool.query(` + CREATE TABLE alert_policies ( + id SERIAL PRIMARY KEY, + name VARCHAR(255) NOT NULL, + type VARCHAR(50) NOT NULL CHECK (type IN ('server_metric', 'synthetic_monitor')), + metric_type VARCHAR(50) CHECK (metric_type IN ('cpu_high', 'ram_high', 'disk_used', 'server_not_reporting', 'client_out_of_date')), + monitor_id INTEGER REFERENCES synthetic_monitors(id) ON DELETE CASCADE, + threshold DECIMAL(10,2), + server_id VARCHAR(255), + enabled BOOLEAN DEFAULT TRUE, + created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), + updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() + ) + `); + + // Create alerts table + await db.pool.query(` + CREATE TABLE alerts ( + id SERIAL PRIMARY KEY, + policy_id INTEGER NOT NULL REFERENCES alert_policies(id) ON DELETE CASCADE, + policy_name VARCHAR(255) NOT NULL, + target VARCHAR(255), + message TEXT NOT NULL, + status VARCHAR(20) NOT NULL CHECK (status IN ('active', 'resolved')) DEFAULT 'active', + triggered_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), + resolved_at TIMESTAMP WITH TIME ZONE + ) + `); + + // Create indexes + await db.pool.query(` + CREATE INDEX idx_alerts_policy_id ON alerts(policy_id); + CREATE INDEX idx_alerts_status ON alerts(status); + CREATE INDEX idx_alerts_triggered_at ON alerts(triggered_at DESC); + CREATE INDEX idx_alert_policies_enabled ON alert_policies(enabled) WHERE enabled = TRUE; + CREATE INDEX idx_alert_policies_type ON alert_policies(type) + `); + + // Create trigger function for updated_at (if not exists) + await db.pool.query(` + CREATE OR REPLACE FUNCTION update_alert_policy_updated_at() + RETURNS TRIGGER AS $$ + BEGIN + NEW.updated_at = NOW(); + RETURN NEW; + END; + $$ LANGUAGE plpgsql + `); + + // Create trigger + await db.pool.query(` + CREATE TRIGGER trigger_update_alert_policies_updated_at + BEFORE UPDATE ON alert_policies + FOR EACH ROW + EXECUTE FUNCTION update_alert_policy_updated_at() + `); + + } catch (error) { + console.error('[Migration] Error creating alert policies tables:', { + message: error.message, + code: error.code, + stack: error.stack + }); + throw error; + } + } + + // Check if vulnerabilities table exists + const checkVulnerabilitiesQuery = ` + SELECT table_name + FROM information_schema.tables + WHERE table_name = 'vulnerabilities' + `; + + const vulnerabilitiesResult = await db.pool.query(checkVulnerabilitiesQuery); + + if (vulnerabilitiesResult.rows.length === 0) { + try { + // Create vulnerabilities table (vulnerability-centric) + await db.pool.query(` + CREATE TABLE vulnerabilities ( + id SERIAL PRIMARY KEY, + cve_id VARCHAR(50) NOT NULL, + package_name VARCHAR(255) NOT NULL, + ecosystem VARCHAR(50) NOT NULL DEFAULT 'Ubuntu', + severity VARCHAR(20), + summary TEXT, + description TEXT, + fixed_version VARCHAR(255), + affected_version_range TEXT, + published_at TIMESTAMP WITH TIME ZONE, + modified_at TIMESTAMP WITH TIME ZONE, + first_detected TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), + last_seen TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), + UNIQUE(cve_id, package_name, ecosystem) + ) + `); + + // Create server_vulnerabilities table (many-to-many) + await db.pool.query(` + CREATE TABLE server_vulnerabilities ( + id SERIAL PRIMARY KEY, + vulnerability_id INTEGER NOT NULL REFERENCES vulnerabilities(id) ON DELETE CASCADE, + server_id VARCHAR(255) NOT NULL, + installed_version VARCHAR(255) NOT NULL, + status VARCHAR(20) NOT NULL DEFAULT 'new' CHECK (status IN ('new', 'fixed', 'ongoing')), + first_detected TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), + last_seen TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), + UNIQUE(vulnerability_id, server_id) + ) + `); + + // Create vulnerability_cache table for OSV API results + await db.pool.query(` + CREATE TABLE vulnerability_cache ( + id SERIAL PRIMARY KEY, + package_name VARCHAR(255) NOT NULL, + package_version VARCHAR(255) NOT NULL, + ecosystem VARCHAR(50) NOT NULL DEFAULT 'Ubuntu', + vulnerabilities JSONB, + cached_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), + expires_at TIMESTAMP WITH TIME ZONE NOT NULL, + UNIQUE(package_name, package_version, ecosystem) + ) + `); + + // Create indexes + await db.pool.query(` + CREATE INDEX idx_vulnerabilities_cve_id ON vulnerabilities(cve_id); + CREATE INDEX idx_vulnerabilities_package_name ON vulnerabilities(package_name); + CREATE INDEX idx_vulnerabilities_severity ON vulnerabilities(severity); + CREATE INDEX idx_vulnerabilities_last_seen ON vulnerabilities(last_seen DESC); + CREATE INDEX idx_server_vulnerabilities_server_id ON server_vulnerabilities(server_id); + CREATE INDEX idx_server_vulnerabilities_status ON server_vulnerabilities(status); + CREATE INDEX idx_server_vulnerabilities_vulnerability_id ON server_vulnerabilities(vulnerability_id); + CREATE INDEX idx_vulnerability_cache_expires_at ON vulnerability_cache(expires_at); + CREATE INDEX idx_vulnerability_cache_lookup ON vulnerability_cache(package_name, package_version, ecosystem) + `); + + } catch (error) { + console.error('[Migration] Error creating vulnerabilities tables:', { + message: error.message, + code: error.code, + stack: error.stack + }); + throw error; + } + } + } catch (error) { + console.error('[Migration] Error running migrations:', { + message: error.message, + code: error.code, + stack: error.stack + }); + // Don't throw - allow server to start even if migration fails + // (column might already exist or there might be a permission issue) + } +} + +module.exports = { runMigrations }; + diff --git a/server/backend/src/monitorRunner.js b/server/backend/src/monitorRunner.js new file mode 100644 index 0000000..69a51a0 --- /dev/null +++ b/server/backend/src/monitorRunner.js @@ -0,0 +1,282 @@ +/** + * Synthetic Monitor Runner + * Periodically executes checks for enabled synthetic monitors + */ + +const db = require('./db'); +const http = require('http'); +const https = require('https'); +const { promisify } = require('util'); +const dns = require('dns'); +const net = require('net'); + +const dnsLookup = promisify(dns.lookup); + +/** + * Execute HTTP status check + */ +async function checkHttpStatus(monitor) { + const startTime = Date.now(); + const url = monitor.target; + + return new Promise((resolve) => { + const client = url.startsWith('https') ? https : http; + + const req = client.get(url, { timeout: 10000 }, (res) => { + const responseTime = Date.now() - startTime; + const statusCode = res.statusCode; + const expectedStatus = monitor.expected_status || 200; + + // Consume response to free up resources + res.on('data', () => {}); + res.on('end', () => { + if (statusCode === expectedStatus) { + resolve({ + status: 'success', + response_time: responseTime, + message: `HTTP ${statusCode} (expected ${expectedStatus})` + }); + } else { + resolve({ + status: 'failed', + response_time: responseTime, + message: `HTTP ${statusCode} (expected ${expectedStatus})` + }); + } + }); + }); + + req.on('error', (error) => { + const responseTime = Date.now() - startTime; + resolve({ + status: 'failed', + response_time: responseTime, + message: `Connection error: ${error.message}` + }); + }); + + req.on('timeout', () => { + req.destroy(); + const responseTime = Date.now() - startTime; + resolve({ + status: 'failed', + response_time: responseTime, + message: 'Request timeout' + }); + }); + }); +} + +/** + * Execute ping check (ICMP-like check using DNS lookup + TCP connection) + */ +async function checkPing(monitor) { + const startTime = Date.now(); + const hostname = monitor.target.replace(/^https?:\/\//, '').replace(/\/.*$/, ''); + + try { + // Resolve DNS + const dnsStart = Date.now(); + await dnsLookup(hostname); + const dnsTime = Date.now() - dnsStart; + + // Try to establish a TCP connection to port 80 or 443 + const port = monitor.target.startsWith('https') ? 443 : 80; + const connectStart = Date.now(); + + return new Promise((resolve) => { + const socket = new net.Socket(); + socket.setTimeout(5000); + + socket.on('connect', () => { + socket.destroy(); + const responseTime = Date.now() - startTime; + resolve({ + status: 'success', + response_time: responseTime, + message: `Host reachable (DNS: ${dnsTime}ms, TCP: ${Date.now() - connectStart}ms)` + }); + }); + + socket.on('error', (error) => { + const responseTime = Date.now() - startTime; + resolve({ + status: 'failed', + response_time: responseTime, + message: `Connection failed: ${error.message}` + }); + }); + + socket.on('timeout', () => { + socket.destroy(); + const responseTime = Date.now() - startTime; + resolve({ + status: 'failed', + response_time: responseTime, + message: 'Connection timeout' + }); + }); + + socket.connect(port, hostname); + }); + } catch (error) { + const responseTime = Date.now() - startTime; + return { + status: 'failed', + response_time: responseTime, + message: `DNS lookup failed: ${error.message}` + }; + } +} + +/** + * Execute port check + */ +async function checkPort(monitor) { + const startTime = Date.now(); + const hostname = monitor.target; + const port = monitor.port || 80; + + return new Promise((resolve) => { + const socket = new net.Socket(); + socket.setTimeout(5000); + + socket.on('connect', () => { + socket.destroy(); + const responseTime = Date.now() - startTime; + resolve({ + status: 'success', + response_time: responseTime, + message: `Port ${port} is open` + }); + }); + + socket.on('error', (error) => { + const responseTime = Date.now() - startTime; + resolve({ + status: 'failed', + response_time: responseTime, + message: `Port ${port} is closed or unreachable: ${error.message}` + }); + }); + + socket.on('timeout', () => { + socket.destroy(); + const responseTime = Date.now() - startTime; + resolve({ + status: 'failed', + response_time: responseTime, + message: `Port ${port} connection timeout` + }); + }); + + socket.connect(port, hostname); + }); +} + +/** + * Execute a monitor check based on its type + */ +async function executeMonitorCheck(monitor) { + try { + let result; + + switch (monitor.type) { + case 'http_status': + result = await checkHttpStatus(monitor); + break; + case 'ping': + result = await checkPing(monitor); + break; + case 'port_check': + result = await checkPort(monitor); + break; + default: + result = { + status: 'failed', + message: `Unknown monitor type: ${monitor.type}` + }; + } + + // Save result to database + await db.saveMonitorResult(monitor.id, result); + + // Update monitor's updated_at timestamp to track last check time + await db.pool.query( + 'UPDATE synthetic_monitors SET updated_at = NOW() WHERE id = $1', + [monitor.id] + ); + + return result; + } catch (error) { + console.error(`[Monitor Runner] Error executing check for monitor ${monitor.id}:`, { + message: error.message, + stack: error.stack, + monitorId: monitor.id, + monitorName: monitor.name, + monitorType: monitor.type + }); + await db.saveMonitorResult(monitor.id, { + status: 'failed', + message: `Check execution error: ${error.message}` + }); + return { + status: 'failed', + message: `Check execution error: ${error.message}` + }; + } +} + +/** + * Check if a monitor needs to be executed based on its interval + */ +function shouldExecuteMonitor(monitor) { + const now = new Date(); + const lastCheck = monitor.updated_at ? new Date(monitor.updated_at) : new Date(0); + const intervalMs = (monitor.interval || 60) * 1000; + + return (now - lastCheck) >= intervalMs; +} + +/** + * Run checks for all enabled monitors that need checking + */ +async function runMonitorChecks() { + try { + const monitors = await db.getEnabledMonitors(); + const monitorsToCheck = monitors.filter(shouldExecuteMonitor); + + if (monitorsToCheck.length === 0) { + return; + } + + // Execute checks in parallel (with limit to avoid overwhelming the system) + const batchSize = 10; + for (let i = 0; i < monitorsToCheck.length; i += batchSize) { + const batch = monitorsToCheck.slice(i, i + batchSize); + await Promise.all(batch.map(executeMonitorCheck)); + } + } catch (error) { + console.error('[Monitor Runner] Error running monitor checks:', { + message: error.message, + stack: error.stack + }); + } +} + +/** + * Start the monitor runner + */ +function startMonitorRunner() { + // Run checks immediately on startup + runMonitorChecks(); + + // Then run checks every 30 seconds + setInterval(runMonitorChecks, 30000); +} + +module.exports = { + runMonitorChecks, + startMonitorRunner, + executeMonitorCheck +}; diff --git a/server/backend/src/osvClient.js b/server/backend/src/osvClient.js new file mode 100644 index 0000000..7231b30 --- /dev/null +++ b/server/backend/src/osvClient.js @@ -0,0 +1,504 @@ +/** + * OSV (Open Source Vulnerabilities) API Client + * Queries the OSV API for vulnerability information + */ + +const axios = require('axios'); + +const OSV_API_URL = 'https://api.osv.dev/v1'; + +/** + * Query OSV API for vulnerabilities affecting a package version + * @param {string} packageName - Package name + * @param {string} version - Package version + * @param {string} ecosystem - Ecosystem (e.g., 'Ubuntu', 'Debian') + * @returns {Promise} Array of vulnerability objects + */ +async function queryPackage(packageName, version, ecosystem = 'Ubuntu') { + try { + const response = await axios.post( + `${OSV_API_URL}/query`, + { + package: { + name: packageName, + ecosystem: ecosystem + }, + version: version + }, + { + timeout: 30000 // 30 second timeout + } + ); + + if (response.data && response.data.vulns) { + return response.data.vulns; + } + + return []; + } catch (error) { + if (error.response) { + console.error(`[OSV Client] API error for ${packageName}@${version}:`, { + status: error.response.status, + statusText: error.response.statusText, + data: error.response.data + }); + } else if (error.request) { + console.error(`[OSV Client] Network error for ${packageName}@${version}:`, { + message: error.message + }); + } else { + console.error(`[OSV Client] Error querying ${packageName}@${version}:`, { + message: error.message + }); + } + throw error; + } +} + +/** + * Fetch full vulnerability details by ID + * @param {string} vulnId - OSV vulnerability ID + * @returns {Promise} Full vulnerability object or null + */ +async function getVulnerabilityDetails(vulnId) { + try { + const response = await axios.get( + `${OSV_API_URL}/vulns/${encodeURIComponent(vulnId)}`, + { + timeout: 30000 + } + ); + + return response.data || null; + } catch (error) { + if (error.response && error.response.status === 404) { + console.error(`[OSV Client] Vulnerability not found: ${vulnId}`); + return null; + } + console.error(`[OSV Client] Error fetching vulnerability ${vulnId}:`, { + message: error.message, + status: error.response?.status + }); + return null; + } +} + +/** + * Batch fetch full vulnerability details + * @param {Array} vulnIds - Array of vulnerability IDs + * @returns {Promise} Array of full vulnerability objects + */ +async function batchGetVulnerabilityDetails(vulnIds) { + if (!vulnIds || vulnIds.length === 0) { + return []; + } + + // Fetch in parallel batches to avoid overwhelming the API + const batchSize = 10; + const results = []; + + for (let i = 0; i < vulnIds.length; i += batchSize) { + const batch = vulnIds.slice(i, i + batchSize); + const batchPromises = batch.map(id => getVulnerabilityDetails(id)); + const batchResults = await Promise.all(batchPromises); + results.push(...batchResults.filter(v => v !== null)); + + // Small delay between batches to be respectful to the API + if (i + batchSize < vulnIds.length) { + await new Promise(resolve => setTimeout(resolve, 100)); + } + } + + return results; +} + +/** + * Batch query OSV API for multiple packages + * @param {Array} packages - Array of {name, version, ecosystem} objects + * @returns {Promise} Array of {package, vulnerabilities} objects with full vulnerability details + */ +async function queryBatch(packages) { + if (!packages || packages.length === 0) { + return []; + } + + try { + const queries = packages.map(pkg => ({ + package: { + name: pkg.name, + ecosystem: pkg.ecosystem || 'Ubuntu' + }, + version: pkg.version + })); + + const response = await axios.post( + `${OSV_API_URL}/querybatch`, + { + queries: queries + }, + { + timeout: 60000 // 60 second timeout for batch queries + } + ); + + if (response.data && response.data.results) { + // Collect all unique vulnerability IDs + const vulnIdSet = new Set(); + const packageVulnMap = new Map(); + + response.data.results.forEach((result, index) => { + const vulnIds = (result.vulns || []).map(v => v.id || v).filter(Boolean); + packageVulnMap.set(index, vulnIds); + vulnIds.forEach(id => vulnIdSet.add(id)); + }); + + // Fetch full vulnerability details for all unique IDs + const uniqueVulnIds = Array.from(vulnIdSet); + console.log(`[OSV Client] Fetching full details for ${uniqueVulnIds.length} unique vulnerabilities...`); + const fullVulns = await batchGetVulnerabilityDetails(uniqueVulnIds); + + // Create a map of ID to full vulnerability object + const vulnMap = new Map(); + fullVulns.forEach(vuln => { + if (vuln.id) { + vulnMap.set(vuln.id, vuln); + } + }); + + // Map back to packages with full vulnerability objects + return response.data.results.map((result, index) => { + const vulnIds = packageVulnMap.get(index) || []; + const vulnerabilities = vulnIds + .map(id => vulnMap.get(id)) + .filter(v => v !== undefined); + + return { + package: packages[index], + vulnerabilities: vulnerabilities + }; + }); + } + + return []; + } catch (error) { + if (error.response) { + console.error('[OSV Client] Batch API error:', { + status: error.response.status, + statusText: error.response.statusText, + url: `${OSV_API_URL}/querybatch`, + packageCount: packages.length, + responseData: error.response.data, + sampleQueries: queries.slice(0, 3) // Show first 3 queries for debugging + }); + } else if (error.request) { + console.error('[OSV Client] Batch network error:', { + message: error.message, + url: `${OSV_API_URL}/querybatch`, + packageCount: packages.length + }); + } else { + console.error('[OSV Client] Batch query error:', { + message: error.message, + url: `${OSV_API_URL}/querybatch`, + packageCount: packages.length + }); + } + throw error; + } +} + +/** + * Parse CVSS vector string to extract numeric score + * CVSS vectors are in format: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H + * We'll extract the base score by parsing the vector components + * @param {string} vectorString - CVSS vector string + * @returns {number|null} Numeric CVSS score or null + */ +function parseCvssScore(vectorString) { + if (!vectorString || typeof vectorString !== 'string') { + return null; + } + + // Try to extract numeric score if present (some vectors include score) + const scoreMatch = vectorString.match(/CVSS:\d+\.\d+\/([^/]+)/); + if (!scoreMatch) return null; + + // For now, we'll use a simplified approach: + // Parse the vector components to estimate severity + // C (Confidentiality), I (Integrity), A (Availability) + const components = vectorString.split('/'); + let hasHighImpact = false; + + for (const comp of components) { + if (comp.startsWith('C:') || comp.startsWith('I:') || comp.startsWith('A:')) { + const value = comp.split(':')[1]; + if (value === 'H') { + hasHighImpact = true; + break; + } + } + } + + // This is a simplified estimation - in production, you'd want a full CVSS calculator + // For now, return null and let the Ubuntu priority handle it + return null; +} + +/** + * Parse CVSS vector string to extract base score + * CVSS vectors are in format: CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:H + * We'll parse the vector components to estimate severity + * @param {string} vectorString - CVSS vector string + * @returns {number|null} Estimated CVSS score or null + */ +function parseCvssVector(vectorString) { + if (!vectorString || typeof vectorString !== 'string') { + return null; + } + + // Extract components from vector string + const components = vectorString.split('/'); + let av = null, ac = null, pr = null, ui = null, s = null, c = null, i = null, a = null; + + for (const comp of components) { + if (comp.startsWith('AV:')) av = comp.split(':')[1]; + else if (comp.startsWith('AC:')) ac = comp.split(':')[1]; + else if (comp.startsWith('PR:')) pr = comp.split(':')[1]; + else if (comp.startsWith('UI:')) ui = comp.split(':')[1]; + else if (comp.startsWith('S:')) s = comp.split(':')[1]; + else if (comp.startsWith('C:')) c = comp.split(':')[1]; + else if (comp.startsWith('I:')) i = comp.split(':')[1]; + else if (comp.startsWith('A:')) a = comp.split(':')[1]; + } + + // Simplified scoring based on impact (C, I, A) + // H = High, L = Low, N = None + const impactScore = + (c === 'H' ? 0.66 : c === 'L' ? 0.22 : 0) + + (i === 'H' ? 0.66 : i === 'L' ? 0.22 : 0) + + (a === 'H' ? 0.66 : a === 'L' ? 0.22 : 0); + + // Base score approximation (simplified) + if (impactScore >= 1.8) return 9.0; // Critical + if (impactScore >= 1.2) return 7.0; // High + if (impactScore >= 0.4) return 4.0; // Medium + if (impactScore > 0) return 2.0; // Low + + return null; +} + +/** + * Extract severity from OSV vulnerability object + * @param {Object} vuln - OSV vulnerability object + * @returns {string} Severity level (CRITICAL, HIGH, MEDIUM, LOW) or null + */ +function extractSeverity(vuln) { + // Priority 1: Check Ubuntu-specific priority (most reliable for Ubuntu CVEs) + if (vuln.severity && Array.isArray(vuln.severity)) { + for (const sev of vuln.severity) { + if (sev.type === 'Ubuntu' && sev.score) { + const ubuntuPriority = sev.score.toLowerCase(); + // Map Ubuntu priorities to our severity levels + if (ubuntuPriority === 'critical') return 'CRITICAL'; + if (ubuntuPriority === 'high') return 'HIGH'; + if (ubuntuPriority === 'medium') return 'MEDIUM'; + if (ubuntuPriority === 'low' || ubuntuPriority === 'negligible') return 'LOW'; + } + } + } + + // Priority 2: Parse CVSS vectors from severity array + if (vuln.severity && Array.isArray(vuln.severity)) { + for (const sev of vuln.severity) { + if (sev.type && (sev.type.startsWith('CVSS_V3') || sev.type.startsWith('CVSS_V4')) && sev.score) { + // Parse CVSS vector string to estimate score + const estimatedScore = parseCvssVector(sev.score); + if (estimatedScore !== null) { + if (estimatedScore >= 9.0) return 'CRITICAL'; + if (estimatedScore >= 7.0) return 'HIGH'; + if (estimatedScore >= 4.0) return 'MEDIUM'; + if (estimatedScore > 0) return 'LOW'; + } + } + } + } + + // Priority 3: Check database_specific for Ubuntu severity + if (vuln.database_specific) { + if (vuln.database_specific.severity) { + const sev = vuln.database_specific.severity.toLowerCase(); + if (sev === 'critical') return 'CRITICAL'; + if (sev === 'high') return 'HIGH'; + if (sev === 'medium') return 'MEDIUM'; + if (sev === 'low' || sev === 'negligible') return 'LOW'; + } + // Check for numeric CVSS score in database_specific + if (vuln.database_specific.cvss_score !== undefined) { + const score = parseFloat(vuln.database_specific.cvss_score); + if (score >= 9.0) return 'CRITICAL'; + if (score >= 7.0) return 'HIGH'; + if (score >= 4.0) return 'MEDIUM'; + if (score > 0) return 'LOW'; + } + } + + return null; +} + +/** + * Extract CVE ID from OSV vulnerability object + * OSV vulnerabilities have the actual CVE ID in the "upstream" array + * @param {Object} vuln - OSV vulnerability object + * @returns {string|null} Standard CVE ID or null + */ +function extractCveId(vuln) { + if (!vuln) return null; + + // First, try to get CVE from upstream array (most reliable) + if (vuln.upstream && Array.isArray(vuln.upstream)) { + const cveId = vuln.upstream.find(id => id.startsWith('CVE-')); + if (cveId) { + return cveId; + } + } + + // Fallback: try to extract from OSV ID + const osvId = vuln.id || ''; + + // Handle Ubuntu-specific format: UBUNTU-CVE-2022-49737 -> CVE-2022-49737 + if (osvId.startsWith('UBUNTU-CVE-')) { + return osvId.replace('UBUNTU-CVE-', 'CVE-'); + } + + // Handle standard CVE format + if (osvId.startsWith('CVE-')) { + return osvId; + } + + // For other formats (GHSA, etc.), return as-is but note it's not a CVE + return osvId; +} + +/** + * Normalize OSV vulnerability to our format + * @param {Object} vuln - OSV vulnerability object + * @param {string} packageName - Package name + * @param {string} ecosystem - Ecosystem + * @param {string} installedVersion - Installed package version (optional) + * @returns {Object} Normalized vulnerability object + */ +function normalizeVulnerability(vuln, packageName, ecosystem, installedVersion = null) { + // Extract proper CVE ID from vulnerability object (checks upstream array first) + const cveId = extractCveId(vuln); + + return { + cve_id: cveId, // Store the normalized CVE ID + osv_id: vuln.id, // Keep original OSV ID for reference + package_name: packageName, + ecosystem: ecosystem, + severity: extractSeverity(vuln), + summary: vuln.summary || null, + description: vuln.details || vuln.summary || null, + fixed_version: extractFixedVersion(vuln, ecosystem, installedVersion), + affected_version_range: JSON.stringify(vuln.affected || []), + published_at: vuln.published ? new Date(vuln.published) : null, + modified_at: vuln.modified ? new Date(vuln.modified) : null + }; +} + +/** + * Extract fixed version from OSV vulnerability + * @param {Object} vuln - OSV vulnerability object + * @param {string} ecosystem - Ecosystem (e.g., 'Ubuntu:24.04:LTS') + * @param {string} installedVersion - Installed package version + * @returns {string|null} Fixed version or null + */ +function extractFixedVersion(vuln, ecosystem = null, installedVersion = null) { + if (!vuln.affected || vuln.affected.length === 0) { + return null; + } + + // Find the affected entry that matches our ecosystem + let matchingAffected = null; + for (const affected of vuln.affected) { + if (affected.package && affected.package.ecosystem) { + const affectedEco = affected.package.ecosystem; + // Match ecosystem (e.g., "Ubuntu:24.04:LTS") + if (ecosystem && affectedEco === ecosystem) { + matchingAffected = affected; + break; + } + // Also check if ecosystem starts with our base (for fallback) + if (ecosystem && affectedEco.startsWith(ecosystem.split(':')[0])) { + if (!matchingAffected) { + matchingAffected = affected; + } + } + } + } + + // If no exact match, use first affected entry + if (!matchingAffected && vuln.affected.length > 0) { + matchingAffected = vuln.affected[0]; + } + + if (!matchingAffected) { + return null; + } + + // Check ranges for fixed events + if (matchingAffected.ranges && matchingAffected.ranges.length > 0) { + for (const range of matchingAffected.ranges) { + if (range.type === 'ECOSYSTEM' && range.events) { + // Look for fixed events (most recent fixed version) + let fixedVersion = null; + for (const event of range.events) { + if (event.fixed) { + fixedVersion = event.fixed; + } + } + if (fixedVersion) { + return fixedVersion; + } + } + } + } + + // For Ubuntu, check if installed version is in the affected versions list + // If it is, and there are newer versions, the newest version might be the fix + if (matchingAffected.versions && Array.isArray(matchingAffected.versions) && installedVersion) { + const versions = matchingAffected.versions; + const installedIndex = versions.indexOf(installedVersion); + + // If installed version is in the list and not the last one, return the last version as potential fix + // Note: This is a heuristic - Ubuntu might not have fixed it yet + if (installedIndex >= 0 && installedIndex < versions.length - 1) { + // Check if there's a newer version (potential fix) + const lastVersion = versions[versions.length - 1]; + // Only return if it's clearly newer (simple string comparison might not work for all version formats) + // For now, return null - we need better version comparison + // return lastVersion; + } + } + + // Check database_specific for Ubuntu-specific fixed version info + if (matchingAffected.database_specific && matchingAffected.database_specific.fixed_version) { + return matchingAffected.database_specific.fixed_version; + } + + if (vuln.database_specific && vuln.database_specific.fixed_version) { + return vuln.database_specific.fixed_version; + } + + return null; +} + +module.exports = { + queryPackage, + queryBatch, + getVulnerabilityDetails, + batchGetVulnerabilityDetails, + normalizeVulnerability, + extractSeverity, + extractCveId +}; diff --git a/server/backend/src/packageBuilder.js b/server/backend/src/packageBuilder.js new file mode 100644 index 0000000..eb17dfb --- /dev/null +++ b/server/backend/src/packageBuilder.js @@ -0,0 +1,90 @@ +const { exec } = require('child_process'); +const fs = require('fs').promises; +const path = require('path'); +const { promisify } = require('util'); +const execAsync = promisify(exec); + +/** + * Build a debian package with embedded configuration + */ +async function buildDebPackage(serverUrl, serverId, apiKey, outputDir) { + const clientDir = path.join(__dirname, '../../../../clients/ubuntu'); + const buildDir = path.join(outputDir, 'build'); + const packageDir = path.join(buildDir, 'oculog-client'); + + try { + // Create build directory + await fs.mkdir(buildDir, { recursive: true }); + await fs.mkdir(packageDir, { recursive: true }); + + // Copy client files + await execAsync(`cp -r ${clientDir}/* ${packageDir}/`, { cwd: clientDir }); + + // Create embedded config file + const config = { + server_url: serverUrl, + server_id: serverId, + api_key: apiKey, + interval: 30 + }; + + const configPath = path.join(packageDir, 'client.conf'); + await fs.writeFile(configPath, JSON.stringify(config, null, 2)); + + // Update postinst to copy the embedded config + const postinstPath = path.join(packageDir, 'debian/postinst'); + let postinst = await fs.readFile(postinstPath, 'utf8'); + postinst = postinst.replace( + 'echo "Please configure /etc/oculog/client.conf before starting the service."', + `# Copy embedded configuration +if [ -f /opt/oculog/client.conf ]; then + cp /opt/oculog/client.conf /etc/oculog/client.conf + chmod 600 /etc/oculog/client.conf + echo "Configuration installed from package." +fi + +# Enable and start service +systemctl daemon-reload +systemctl enable oculog-client.service 2>/dev/null || true +systemctl start oculog-client.service 2>/dev/null || true + +echo "Oculog client installed and started successfully!"` + ); + await fs.writeFile(postinstPath, postinst); + + // Update debian/rules to include config file + const rulesPath = path.join(packageDir, 'debian/rules'); + let rules = await fs.readFile(rulesPath, 'utf8'); + if (!rules.includes('client.conf')) { + rules = rules.replace( + 'install -m 644 oculog-client.service', + `install -m 644 client.conf $(CURDIR)/debian/oculog-client/opt/oculog/ +\tinstall -m 644 oculog-client.service` + ); + } + await fs.writeFile(rulesPath, rules); + + // Build the package + const { stdout, stderr } = await execAsync( + 'dpkg-buildpackage -b -us -uc', + { cwd: packageDir } + ); + + // Find the generated .deb file + const debFiles = await fs.readdir(buildDir); + const debFile = debFiles.find(f => f.endsWith('.deb')); + + if (!debFile) { + throw new Error('Failed to build debian package'); + } + + return path.join(buildDir, debFile); + } catch (error) { + console.error('Error building deb package:', error); + throw error; + } +} + +module.exports = { + buildDebPackage +}; diff --git a/server/frontend/.dockerignore b/server/frontend/.dockerignore new file mode 100644 index 0000000..055d873 --- /dev/null +++ b/server/frontend/.dockerignore @@ -0,0 +1,8 @@ +node_modules +npm-debug.log +.env +.git +.gitignore +README.md +build + diff --git a/server/frontend/Dockerfile b/server/frontend/Dockerfile new file mode 100644 index 0000000..0cce581 --- /dev/null +++ b/server/frontend/Dockerfile @@ -0,0 +1,19 @@ +FROM node:18-alpine + +WORKDIR /app + +# Copy package files +COPY package*.json ./ + +# Install dependencies +RUN npm install + +# Copy application code +COPY . . + +# Expose port +EXPOSE 3000 + +# Start the development server +CMD ["npm", "start"] + diff --git a/server/frontend/package-lock.json b/server/frontend/package-lock.json new file mode 100644 index 0000000..13262cf --- /dev/null +++ b/server/frontend/package-lock.json @@ -0,0 +1,17491 @@ +{ + "name": "oculog-frontend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "oculog-frontend", + "version": "1.0.0", + "dependencies": { + "axios": "^1.6.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-scripts": "5.0.1", + "recharts": "^2.10.3" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "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==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.5.tgz", + "integrity": "sha512-fcdRcWahONYo+JRnJg1/AekOacGvKx12Gu0qXJXFi2WBqQA1i7+O5PaxRB7kxE/Op94dExnCiiar6T09pvdHpA==", + "license": "MIT", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/eslint-parser/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "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==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", + "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", + "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-decorators": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", + "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", + "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", + "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", + "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-flow": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", + "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", + "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.5.tgz", + "integrity": "sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", + "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", + "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.5", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.4", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.28.5", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.4", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.4", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "license": "MIT" + }, + "node_modules/@csstools/normalize.css": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", + "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==", + "license": "CC0-1.0" + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "license": "CC0-1.0", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.10" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "license": "MIT", + "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==", + "license": "MIT", + "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/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "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==", + "license": "Apache-2.0", + "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==", + "deprecated": "Use @eslint/object-schema instead", + "license": "BSD-3-Clause" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/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==", + "license": "MIT" + }, + "node_modules/@jest/transform/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "license": "MIT", + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.17.tgz", + "integrity": "sha512-tXDyE1/jzFsHXjhRZQ3hMl0IVhYe5qula43LDWIhVfjp9G/nT5OQY5AORVOrkEGAUltBJOfOWeETbmhm6kHhuQ==", + "license": "MIT", + "dependencies": { + "ansi-html": "^0.0.9", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^4.2.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <5.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x || 5.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "license": "MIT", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "license": "MIT" + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.15.0.tgz", + "integrity": "sha512-ojSshQPKwVvSMR8yT2L/QtUkV5SXi/IfDiJ4/8d6UbTPjiHVmxZzUAzGD8Tzks1b9+qQkZa0isUOvYObedITaw==", + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "license": "Apache-2.0", + "dependencies": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "license": "MIT", + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "license": "ISC", + "engines": { + "node": ">=10.13.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==", + "license": "MIT", + "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.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "8.56.12", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", + "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", + "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", + "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.17", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", + "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "license": "MIT" + }, + "node_modules/@types/q": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "license": "MIT" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "16.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.11.tgz", + "integrity": "sha512-sbtvk8wDN+JvEdabmZExoW/HNr1cB7D/j4LT08rMiuikfA7m/JNJg7ATQcgzs34zHnoScDkY0ZRSl29Fkmk36g==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", + "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "license": "BSD-3-Clause" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.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==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.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==", + "license": "MIT", + "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/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", + "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz", + "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "is-string": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.23", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", + "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001760", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", + "integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "license": "MIT", + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-loader": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz", + "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.4", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.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==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-named-asset-import": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + "license": "MIT", + "peerDependencies": { + "@babel/core": "^7.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", + "license": "MIT" + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-react-app": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.1.0.tgz", + "integrity": "sha512-f9B1xMdnkCIqe+2dHrJsoQFRz7reChaAHE/65SdaykPklQqhme2WaC08oD3is77x9ff98/9EazAKFDZv5rFEQg==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.11", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", + "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/bfj": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + "license": "MIT", + "dependencies": { + "bluebird": "^3.7.2", + "check-types": "^11.2.3", + "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "license": "BSD-2-Clause" + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001762", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", + "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", + "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" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "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/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/check-types": { + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==", + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/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==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "license": "MIT" + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "license": "MIT", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/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==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/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==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/coa/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==", + "license": "MIT" + }, + "node_modules/coa/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==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/coa/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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "license": "MIT" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/core-js": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz", + "integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.47.0.tgz", + "integrity": "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.47.0.tgz", + "integrity": "sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "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.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-blank-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-has-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "license": "MIT", + "dependencies": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "license": "CC0-1.0", + "bin": { + "css-prefers-color-scheme": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssdb": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "CC0-1.0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "license": "MIT", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "license": "MIT", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" + }, + "node_modules/csso/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "license": "BSD-2-Clause" + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT" + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.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==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", + "license": "MIT", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "license": "BSD-2-Clause" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", + "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.1", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@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-config-react-app": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-flowtype": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "license": "BSD-3-Clause", + "dependencies": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@babel/plugin-syntax-flow": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.9", + "eslint": "^8.1.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/experimental-utils": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "license": "MIT", + "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/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "license": "MIT", + "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/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-testing-library": { + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", + "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^5.58.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "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==", + "license": "BSD-2-Clause", + "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==", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "license": "MIT", + "dependencies": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/eslint/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==", + "license": "Python-2.0" + }, + "node_modules/eslint/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==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/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==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "BSD-2-Clause", + "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/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "license": "BSD-3-Clause", + "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==", + "license": "BSD-2-Clause", + "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==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/fast-equals": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.0.tgz", + "integrity": "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "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.8" + }, + "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==", + "license": "ISC", + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "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.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", + "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==", + "license": "Unlicense" + }, + "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==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "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==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "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/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "license": "MIT" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "license": "(Apache-2.0 OR MPL-1.1)" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.5.tgz", + "integrity": "sha512-4xynFbKNNk+WlzXeQQ+6YYsH2g7mpfPszQZUi3ovKlj+pDmngQ7vRXjrrmGROabmKwyQkcgcX5hqfOwHbFmK5g==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "license": "MIT", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "license": "ISC" + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "license": "MIT", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "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==", + "license": "MIT", + "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==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "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==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/ipaddr.js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", + "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "license": "MIT" + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "license": "MIT", + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watch-typeahead": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "license": "MIT", + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "license": "MIT", + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "license": "MIT", + "dependencies": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz", + "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", + "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "license": "MIT", + "dependencies": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + } + }, + "node_modules/jsonpath/node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/launch-editor": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.12.0.tgz", + "integrity": "sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", + "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-forge": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", + "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.23", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", + "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.9.tgz", + "integrity": "sha512-mt8YM6XwsTTovI+kdZdHSxoyF2DI59up034orlC9NfweclcWOt7CVascNNLp6U+bjFVCVCIh9PwS76tDM/rH8g==", + "license": "MIT", + "dependencies": { + "array.prototype.reduce": "^1.0.8", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "gopd": "^1.2.0", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-browser-comments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + "license": "CC0-1.0", + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "browserslist": ">=4", + "postcss": ">=8" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-custom-properties": { + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-flexbugs-fixes": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-normalize": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", + "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/normalize.css": "*", + "postcss-browser-comments": "^4", + "sanitize.css": "*" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "browserslist": ">= 4", + "postcss": ">= 8" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "license": "MIT", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-preset-env": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", + "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.5", + "postcss-image-set-function": "^4.0.7", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.1", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.2.0", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.4", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/postcss-svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" + }, + "node_modules/postcss-svgo/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "license": "MIT", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "license": "MIT", + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-app-polyfill": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", + "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", + "license": "MIT", + "dependencies": { + "core-js": "^3.19.2", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.9", + "whatwg-fetch": "^3.6.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/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==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/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==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/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==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/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==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-error-overlay": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.1.0.tgz", + "integrity": "sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-scripts": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", + "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.1", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.1", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + }, + "bin": { + "react-scripts": "bin/react-scripts.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/react-smooth": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", + "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", + "license": "MIT", + "dependencies": { + "fast-equals": "^5.0.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.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==", + "license": "BSD-3-Clause", + "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/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recharts": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.4.tgz", + "integrity": "sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw==", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.21", + "react-is": "^18.3.1", + "react-smooth": "^4.0.4", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "license": "MIT", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, + "node_modules/recharts/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT" + }, + "node_modules/regex-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", + "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "license": "MIT", + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=8.9" + }, + "peerDependencies": { + "rework": "1.0.1", + "rework-visit": "1.0.0" + }, + "peerDependenciesMeta": { + "rework": { + "optional": true + }, + "rework-visit": { + "optional": true + } + } + }, + "node_modules/resolve-url-loader/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==", + "license": "MIT" + }, + "node_modules/resolve-url-loader/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "license": "ISC" + }, + "node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "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==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sanitize.css": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", + "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==", + "license": "CC0-1.0" + }, + "node_modules/sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "license": "MIT", + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "license": "ISC" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", + "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "license": "MIT" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "license": "MIT" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "license": "MIT" + }, + "node_modules/static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "license": "MIT", + "dependencies": { + "escodegen": "^1.8.1" + } + }, + "node_modules/static-eval/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/static-eval/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/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==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/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==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/svgo/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==", + "license": "MIT" + }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "license": "BSD-2-Clause" + }, + "node_modules/svgo/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==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svgo/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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/svgo/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/tailwindcss/node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/tailwindcss/node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.44.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", + "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", + "license": "MIT" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "license": "BSD-3-Clause" + }, + "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==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "license": "MIT" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "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==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", + "license": "MIT" + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "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==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "license": "ISC", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/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==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/victory-vendor": { + "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "license": "MIT", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.0.tgz", + "integrity": "sha512-e6vZvY6xboSwLz2GD36c16+O/2Z6fKvIf4pOXptw2rY9MVwE/TXc6RGqxD3I3x0a28lwBY7DE+76uTPSsBrrCA==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "5.104.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", + "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.4", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.3.1", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-manifest-plugin": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", + "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", + "license": "MIT", + "dependencies": { + "tapable": "^2.0.0", + "webpack-sources": "^2.2.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "peerDependencies": { + "webpack": "^4.44.2 || ^5.47.0" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "license": "MIT" + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "license": "MIT" + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "license": "MIT", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-background-sync": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", + "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", + "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-build": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", + "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", + "license": "MIT", + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "6.6.0", + "workbox-broadcast-update": "6.6.0", + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-google-analytics": "6.6.0", + "workbox-navigation-preload": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-range-requests": "6.6.0", + "workbox-recipes": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0", + "workbox-streams": "6.6.0", + "workbox-sw": "6.6.0", + "workbox-window": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "license": "MIT", + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/workbox-build/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "deprecated": "The work that was done in this beta branch won't be included in future versions", + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-build/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/workbox-build/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "license": "BSD-2-Clause" + }, + "node_modules/workbox-build/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", + "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", + "deprecated": "workbox-background-sync@6.6.0", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-core": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==", + "license": "MIT" + }, + "node_modules/workbox-expiration": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", + "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-google-analytics": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", + "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", + "license": "MIT", + "dependencies": { + "workbox-background-sync": "6.6.0", + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", + "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-precaching": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", + "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-range-requests": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", + "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-recipes": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", + "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", + "license": "MIT", + "dependencies": { + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-routing": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", + "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-strategies": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", + "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-streams": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", + "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0" + } + }, + "node_modules/workbox-sw": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", + "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==", + "license": "MIT" + }, + "node_modules/workbox-webpack-plugin": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", + "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.9.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/workbox-window": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", + "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", + "license": "MIT", + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.6.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "license": "Apache-2.0" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/server/frontend/package.json b/server/frontend/package.json new file mode 100644 index 0000000..dffbe98 --- /dev/null +++ b/server/frontend/package.json @@ -0,0 +1,37 @@ +{ + "name": "oculog-frontend", + "version": "1.0.0", + "description": "Frontend dashboard for Oculog metrics observability platform", + "private": true, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-scripts": "5.0.1", + "axios": "^1.6.0", + "recharts": "^2.10.3" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": [ + "react-app" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} + diff --git a/server/frontend/public/index.html b/server/frontend/public/index.html new file mode 100644 index 0000000..5178321 --- /dev/null +++ b/server/frontend/public/index.html @@ -0,0 +1,89 @@ + + + + + + + + + + Oculog - Server Metrics Dashboard + + + +
+ + + + diff --git a/server/frontend/public/oculog-logo.png b/server/frontend/public/oculog-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e5e3cc93235101041cc3af232c8e961b5f3f6b79 GIT binary patch literal 546106 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

)|Piq&M~Z|eOV(w5z=0!1QcWtDgm<6s{F&( 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≺p@CC*g}8_IX>=8c5@Kw!KY!=iM1a0ETH%%U6Np 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 z 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 { + fetchServers(); + if (activeView === 'servers-metrics') { + const interval = setInterval(() => { + fetchServers(); + if (selectedServer) { + fetchMetrics(selectedServer, timeRange); + } else { + fetchLatestMetrics(); + } + }, 5000); // Refresh every 5 seconds + + return () => clearInterval(interval); + } + }, [selectedServer, timeRange, activeView]); + + const fetchServers = async () => { + try { + const response = await axios.get(`${API_URL}/api/servers`); + const sortedServers = [...response.data.servers].sort((a, b) => + a.localeCompare(b, undefined, { sensitivity: 'base' }) + ); + setServers(sortedServers); + setLoading(false); + setError(null); + } catch (err) { + setError('Failed to fetch servers'); + setLoading(false); + console.error('Error fetching servers:', err); + } + }; + + const calculateStartTime = (range) => { + const now = new Date(); + let startTime = new Date(now); + + switch (range) { + case '5m': + startTime.setTime(now.getTime() - (5 * 60 * 1000)); + break; + case '15m': + startTime.setTime(now.getTime() - (15 * 60 * 1000)); + break; + case '30m': + startTime.setTime(now.getTime() - (30 * 60 * 1000)); + break; + case '1h': + startTime.setTime(now.getTime() - (60 * 60 * 1000)); + break; + case '3h': + startTime.setTime(now.getTime() - (3 * 60 * 60 * 1000)); + break; + case '6h': + startTime.setTime(now.getTime() - (6 * 60 * 60 * 1000)); + break; + case '12h': + startTime.setTime(now.getTime() - (12 * 60 * 60 * 1000)); + break; + case '1d': + startTime.setTime(now.getTime() - (24 * 60 * 60 * 1000)); + break; + case '3d': + startTime.setTime(now.getTime() - (3 * 24 * 60 * 60 * 1000)); + break; + case '1w': + startTime.setTime(now.getTime() - (7 * 24 * 60 * 60 * 1000)); + break; + case '2w': + startTime.setTime(now.getTime() - (14 * 24 * 60 * 60 * 1000)); + break; + case '1mo': + // Approximate 30 days + startTime.setTime(now.getTime() - (30 * 24 * 60 * 60 * 1000)); + break; + default: + startTime.setTime(now.getTime() - (60 * 60 * 1000)); // Default to 1 hour + } + + return startTime.toISOString(); + }; + + const calculateLimit = (range) => { + // Calculate approximate number of data points needed + // Assuming metrics are collected every 30 seconds + const pointsPerHour = 120; // 3600 seconds / 30 seconds + + switch (range) { + case '5m': + return 10; // 5 minutes / 30 seconds = ~10 points + case '15m': + return 30; // 15 minutes / 30 seconds = 30 points + case '30m': + return 60; // 30 minutes / 30 seconds = 60 points + case '1h': + return pointsPerHour; // 120 + case '3h': + return pointsPerHour * 3; // 360 + case '6h': + return pointsPerHour * 6; // 720 + case '12h': + return pointsPerHour * 12; // 1440 + case '1d': + return pointsPerHour * 24; // 2880 + case '3d': + return pointsPerHour * 72; // 8640 + case '1w': + return pointsPerHour * 168; // 20160 + case '2w': + return pointsPerHour * 336; // 40320 + case '1mo': + return pointsPerHour * 720; // 86400 (30 days) + default: + return 1000; + } + }; + + const fetchMetrics = async (serverId, range = '3h') => { + try { + const startTime = calculateStartTime(range); + const limit = calculateLimit(range); + const response = await axios.get(`${API_URL}/api/servers/${serverId}/metrics`, { + params: { + startTime: startTime, + limit: limit + } + }); + setMetrics({ [serverId]: response.data.metrics }); + setError(null); + } catch (err) { + setError(`Failed to fetch metrics for ${serverId}`); + console.error('Error fetching metrics:', err); + } + }; + + const fetchLatestMetrics = async () => { + try { + const response = await axios.get(`${API_URL}/api/metrics/latest`); + setMetrics(response.data.metrics); + setError(null); + } catch (err) { + setError('Failed to fetch latest metrics'); + console.error('Error fetching latest metrics:', err); + } + }; + + const handleServerSelect = (serverId) => { + setSelectedServer(serverId); + fetchMetrics(serverId, timeRange); + }; + + const handleTimeRangeChange = (newRange) => { + setTimeRange(newRange); + if (selectedServer) { + fetchMetrics(selectedServer, newRange); + } + }; + + const handleViewAll = () => { + setSelectedServer(null); + fetchLatestMetrics(); + }; + + if (loading) { + return ( +
+
Loading...
+
+ ); + } + + return ( +
+ + + {error &&
{error}
} + + {showDownload && ( +
setShowDownload(false)}> +
e.stopPropagation()}> + + setShowDownload(false)} /> +
+
+ )} + + {activeView === 'servers-metrics' && ( +
+ + + +
+ )} + + {activeView === 'synthetic-monitors' && ( +
+ +
+ )} + + {activeView === 'alerting' && ( +
+ +
+ )} + + {activeView === 'security' && ( +
+ +
+ )} + + {activeView === 'wiki' && ( +
+ +
+ )} +
+ ); +} + +export default App; + diff --git a/server/frontend/src/components/Alerting.css b/server/frontend/src/components/Alerting.css new file mode 100644 index 0000000..d689561 --- /dev/null +++ b/server/frontend/src/components/Alerting.css @@ -0,0 +1,399 @@ +.alerting { + padding: 2rem; + max-width: 1400px; + margin: 0 auto; +} + +.alerting-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 2rem; +} + +.alerting-header h2 { + margin: 0; + color: #f1f5f9; + font-size: 1.875rem; +} + +.add-policy-button { + background: #fc2922; + border: none; + border-radius: 6px; + padding: 0.75rem 1.5rem; + color: white; + font-size: 0.875rem; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; +} + +.add-policy-button:hover { + background: #e0241e; + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(252, 41, 34, 0.4); +} + +.alerting-tabs { + display: flex; + gap: 0.5rem; + margin-bottom: 2rem; + border-bottom: 1px solid rgba(148, 163, 184, 0.2); +} + +.alerting-tabs .tab-button { + background: transparent; + border: none; + border-bottom: 2px solid transparent; + padding: 0.75rem 1.5rem; + color: #94a3b8; + font-size: 0.875rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s; +} + +.alerting-tabs .tab-button:hover { + color: #f1f5f9; + border-bottom-color: rgba(252, 41, 34, 0.5); +} + +.alerting-tabs .tab-button.active { + color: #fc2922; + border-bottom-color: #fc2922; +} + +.error-message { + background: #ef4444; + color: white; + padding: 1rem; + border-radius: 6px; + margin-bottom: 1rem; +} + +.no-policies, +.no-alerts { + text-align: center; + padding: 4rem 2rem; + color: #94a3b8; +} + +.no-policies p, +.no-alerts p { + font-size: 1.125rem; + margin-bottom: 1.5rem; +} + +.policies-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); + gap: 1.5rem; +} + +.policy-card { + background: rgba(30, 41, 59, 0.8); + border: 1px solid rgba(252, 41, 34, 0.2); + border-radius: 8px; + padding: 1.5rem; + transition: all 0.2s; +} + +.policy-card:hover { + border-color: rgba(252, 41, 34, 0.4); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); +} + +.policy-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 1rem; +} + +.policy-title { + flex: 1; +} + +.policy-title h3 { + margin: 0 0 0.5rem 0; + color: #f1f5f9; + font-size: 1.125rem; +} + +.status-badge { + display: inline-block; + padding: 0.25rem 0.75rem; + border-radius: 12px; + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; +} + +.status-badge.enabled { + background: rgba(16, 185, 129, 0.2); + color: #10b981; +} + +.status-badge.disabled { + background: rgba(148, 163, 184, 0.2); + color: #94a3b8; +} + +.policy-actions { + display: flex; + gap: 0.5rem; +} + +.toggle-button, +.edit-button, +.delete-button { + background: transparent; + border: 1px solid rgba(148, 163, 184, 0.3); + border-radius: 4px; + padding: 0.375rem 0.625rem; + color: #94a3b8; + cursor: pointer; + transition: all 0.2s; + font-size: 1rem; +} + +.toggle-button:hover { + border-color: #10b981; + color: #10b981; +} + +.edit-button:hover { + border-color: #3b82f6; + color: #3b82f6; +} + +.delete-button:hover { + border-color: #ef4444; + color: #ef4444; +} + +.policy-details { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.detail-row { + display: flex; + justify-content: space-between; + align-items: center; +} + +.detail-label { + color: #94a3b8; + font-size: 0.875rem; +} + +.detail-value { + color: #f1f5f9; + font-size: 0.875rem; + font-weight: 500; + text-align: right; + word-break: break-word; +} + +.alerts-history { + margin-top: 1rem; +} + +.alerts-table-container { + overflow-x: auto; + background: rgba(30, 41, 59, 0.8); + border-radius: 8px; + border: 1px solid rgba(252, 41, 34, 0.2); +} + +.alerts-table { + width: 100%; + border-collapse: collapse; +} + +.alerts-table thead { + background: rgba(15, 23, 42, 0.8); + border-bottom: 1px solid rgba(148, 163, 184, 0.2); +} + +.alerts-table th { + padding: 1rem; + text-align: left; + color: #f1f5f9; + font-size: 0.875rem; + font-weight: 600; + text-transform: uppercase; +} + +.alerts-table td { + padding: 1rem; + color: #94a3b8; + font-size: 0.875rem; + border-bottom: 1px solid rgba(148, 163, 184, 0.1); +} + +.alerts-table tbody tr:hover { + background: rgba(252, 41, 34, 0.05); +} + +.alerts-table tbody tr.alert-active { + background: rgba(239, 68, 68, 0.1); +} + +.alerts-table tbody tr.alert-active td { + color: #f1f5f9; +} + +.alert-badge { + display: inline-block; + padding: 0.25rem 0.75rem; + border-radius: 12px; + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; +} + +.alert-badge.active { + background: rgba(239, 68, 68, 0.2); + color: #ef4444; +} + +.alert-badge.resolved { + background: rgba(16, 185, 129, 0.2); + color: #10b981; +} + +.modal-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.7); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000; +} + +.modal-content { + background: #1e293b; + border: 1px solid rgba(252, 41, 34, 0.3); + border-radius: 8px; + padding: 2rem; + max-width: 500px; + width: 90%; + max-height: 90vh; + overflow-y: auto; +} + +.modal-content h3 { + margin: 0 0 1.5rem 0; + color: #f1f5f9; + font-size: 1.5rem; +} + +.form-group { + margin-bottom: 1.25rem; +} + +.form-group label { + display: block; + color: #f1f5f9; + font-size: 0.875rem; + font-weight: 500; + margin-bottom: 0.5rem; +} + +.form-group input[type="text"], +.form-group input[type="number"], +.form-group select { + width: 100%; + padding: 0.75rem; + background: rgba(15, 23, 42, 0.8); + border: 1px solid rgba(148, 163, 184, 0.3); + border-radius: 6px; + color: #f1f5f9; + font-size: 0.875rem; + box-sizing: border-box; +} + +.form-group input[type="text"]:focus, +.form-group input[type="number"]:focus, +.form-group select:focus { + outline: none; + border-color: #fc2922; +} + +.form-group input[type="checkbox"] { + margin-right: 0.5rem; +} + +.form-actions { + display: flex; + gap: 1rem; + justify-content: flex-end; + margin-top: 2rem; +} + +.form-actions button { + padding: 0.75rem 1.5rem; + border: none; + border-radius: 6px; + font-size: 0.875rem; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; +} + +.form-actions button[type="button"] { + background: transparent; + color: #94a3b8; + border: 1px solid rgba(148, 163, 184, 0.3); +} + +.form-actions button[type="button"]:hover { + background: rgba(148, 163, 184, 0.1); + border-color: rgba(148, 163, 184, 0.5); +} + +.form-actions button[type="submit"] { + background: #fc2922; + color: white; +} + +.form-actions button[type="submit"]:hover { + background: #e0241e; +} + +@media (max-width: 768px) { + .alerting { + padding: 1rem; + } + + .alerting-header { + flex-direction: column; + align-items: stretch; + gap: 1rem; + } + + .policies-grid { + grid-template-columns: 1fr; + } + + .alerts-table-container { + overflow-x: scroll; + } + + .alerts-table { + min-width: 800px; + } + + .modal-content { + width: 95%; + padding: 1.5rem; + } +} diff --git a/server/frontend/src/components/Alerting.js b/server/frontend/src/components/Alerting.js new file mode 100644 index 0000000..de03606 --- /dev/null +++ b/server/frontend/src/components/Alerting.js @@ -0,0 +1,442 @@ +import React, { useState, useEffect } from 'react'; +import axios from 'axios'; +import './Alerting.css'; + +const API_URL = process.env.REACT_APP_API_URL || 'http://localhost:3001'; + +function Alerting() { + const [activeTab, setActiveTab] = useState('policies'); // 'policies' or 'history' + const [policies, setPolicies] = useState([]); + const [alerts, setAlerts] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [showAddModal, setShowAddModal] = useState(false); + const [editingPolicy, setEditingPolicy] = useState(null); + const [formData, setFormData] = useState({ + name: '', + type: 'server_metric', // 'server_metric' or 'synthetic_monitor' + metric_type: 'cpu_high', // cpu_high, ram_high, disk_used, server_not_reporting, client_out_of_date + monitor_id: null, // for synthetic_monitor type + threshold: 80, + server_id: null, // null for all servers, or specific server_id + enabled: true + }); + + useEffect(() => { + fetchPolicies(); + fetchAlerts(); + const interval = setInterval(() => { + fetchPolicies(); + fetchAlerts(); + }, 30000); // Refresh every 30 seconds + return () => clearInterval(interval); + }, []); + + const fetchPolicies = async () => { + try { + const response = await axios.get(`${API_URL}/api/alert-policies`); + setPolicies(response.data.policies || []); + setLoading(false); + setError(null); + } catch (err) { + setError('Failed to fetch alert policies'); + setLoading(false); + console.error('Error fetching policies:', err); + } + }; + + const fetchAlerts = async () => { + try { + const response = await axios.get(`${API_URL}/api/alerts`); + setAlerts(response.data.alerts || []); + } catch (err) { + console.error('Error fetching alerts:', err); + } + }; + + const handleAdd = () => { + setEditingPolicy(null); + setFormData({ + name: '', + type: 'server_metric', + metric_type: 'cpu_high', + monitor_id: null, + threshold: 80, + server_id: null, + enabled: true + }); + setShowAddModal(true); + }; + + const handleEdit = (policy) => { + setEditingPolicy(policy); + setFormData({ + name: policy.name, + type: policy.type, + metric_type: policy.metric_type || 'cpu_high', + monitor_id: policy.monitor_id || null, + threshold: policy.threshold || 80, + server_id: policy.server_id || null, + enabled: policy.enabled !== false + }); + setShowAddModal(true); + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + try { + if (editingPolicy) { + await axios.put(`${API_URL}/api/alert-policies/${editingPolicy.id}`, formData); + } else { + await axios.post(`${API_URL}/api/alert-policies`, formData); + } + setShowAddModal(false); + fetchPolicies(); + } catch (err) { + setError(err.response?.data?.error || 'Failed to save policy'); + console.error('Error saving policy:', err); + } + }; + + const handleDelete = async (id) => { + if (!window.confirm('Are you sure you want to delete this alert policy?')) { + return; + } + try { + await axios.delete(`${API_URL}/api/alert-policies/${id}`); + fetchPolicies(); + } catch (err) { + setError(err.response?.data?.error || 'Failed to delete policy'); + console.error('Error deleting policy:', err); + } + }; + + const handleToggleEnabled = async (policy) => { + try { + await axios.put(`${API_URL}/api/alert-policies/${policy.id}`, { + ...policy, + enabled: !policy.enabled + }); + fetchPolicies(); + } catch (err) { + setError(err.response?.data?.error || 'Failed to update policy'); + console.error('Error updating policy:', err); + } + }; + + const getMetricTypeLabel = (type, metricType) => { + if (type === 'synthetic_monitor') { + return 'Synthetic Monitor Failure'; + } + const labels = { + cpu_high: 'CPU High', + ram_high: 'RAM High', + disk_used: 'Disk Used %', + server_not_reporting: 'Server Not Reporting', + client_out_of_date: 'Client Out of Date' + }; + return labels[metricType] || metricType; + }; + + const getAlertStatusBadge = (alert) => { + if (alert.status === 'active') { + return Active; + } + return Resolved; + }; + + if (loading) { + return ( +
+
Loading...
+
+ ); + } + + return ( +
+
+

Alerting

+ {activeTab === 'policies' && ( + + )} +
+ +
+ + +
+ + {error &&
{error}
} + + {activeTab === 'policies' && ( + <> + {policies.length === 0 ? ( +
+

No alert policies configured

+ +
+ ) : ( +
+ {policies.map((policy) => ( +
+
+
+

{policy.name}

+ + {policy.enabled ? 'Enabled' : 'Disabled'} + +
+
+ + + +
+
+
+
+ Type: + + {policy.type === 'server_metric' ? 'Server Metric' : 'Synthetic Monitor'} + +
+
+ Condition: + + {getMetricTypeLabel(policy.type, policy.metric_type)} + +
+ {policy.type === 'server_metric' && policy.metric_type !== 'server_not_reporting' && policy.metric_type !== 'client_out_of_date' && ( +
+ Threshold: + {policy.threshold}% +
+ )} + {policy.type === 'server_metric' && policy.metric_type === 'server_not_reporting' && ( +
+ Threshold: + {policy.threshold} minutes +
+ )} + {policy.server_id ? ( +
+ Server: + {policy.server_id} +
+ ) : ( +
+ Scope: + All Servers +
+ )} + {policy.type === 'synthetic_monitor' && policy.monitor_id && ( +
+ Monitor ID: + {policy.monitor_id} +
+ )} + {policy.type === 'synthetic_monitor' && !policy.monitor_id && ( +
+ Scope: + All Monitors +
+ )} +
+
+ ))} +
+ )} + + )} + + {activeTab === 'history' && ( +
+ {alerts.length === 0 ? ( +
+

No alerts in history

+
+ ) : ( +
+ + + + + + + + + + + + + {alerts.map((alert) => ( + + + + + + + + + ))} + +
StatusPolicyTargetMessageTriggeredResolved
{getAlertStatusBadge(alert)}{alert.policy_name || 'N/A'}{alert.target || 'N/A'}{alert.message}{new Date(alert.triggered_at).toLocaleString()}{alert.resolved_at ? new Date(alert.resolved_at).toLocaleString() : '-'}
+
+ )} +
+ )} + + {showAddModal && ( +
setShowAddModal(false)}> +
e.stopPropagation()}> +

{editingPolicy ? 'Edit Alert Policy' : 'Add Alert Policy'}

+
+
+ + setFormData({ ...formData, name: e.target.value })} + required + placeholder="e.g., High CPU Alert" + /> +
+
+ + +
+ {formData.type === 'server_metric' && ( + <> +
+ + +
+ {(formData.metric_type === 'cpu_high' || formData.metric_type === 'ram_high' || formData.metric_type === 'disk_used') && ( +
+ + setFormData({ ...formData, threshold: parseInt(e.target.value) })} + required + min="0" + max="100" + /> +
+ )} + {formData.metric_type === 'server_not_reporting' && ( +
+ + setFormData({ ...formData, threshold: parseInt(e.target.value) })} + required + min="1" + /> +
+ )} +
+ + setFormData({ ...formData, server_id: e.target.value || null })} + placeholder="e.g., server-01" + /> +
+ + )} + {formData.type === 'synthetic_monitor' && ( +
+ + setFormData({ ...formData, monitor_id: e.target.value ? parseInt(e.target.value) : null })} + placeholder="e.g., 1" + /> +
+ )} +
+ +
+
+ + +
+
+
+
+ )} +
+ ); +} + +export default Alerting; diff --git a/server/frontend/src/components/ClientDownload.css b/server/frontend/src/components/ClientDownload.css new file mode 100644 index 0000000..8113291 --- /dev/null +++ b/server/frontend/src/components/ClientDownload.css @@ -0,0 +1,217 @@ +.client-download { + padding: 0; +} + +.client-download h2 { + font-size: 1.5rem; + color: #e2e8f0; + margin-bottom: 0.5rem; + font-weight: 600; +} + +.download-description { + color: #94a3b8; + margin-bottom: 1.5rem; + line-height: 1.6; +} + +.download-form { + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +.form-group { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.form-group label { + color: #e2e8f0; + font-weight: 500; + font-size: 0.9rem; +} + +.form-group input { + background: rgba(15, 23, 42, 0.6); + border: 1px solid rgba(148, 163, 184, 0.2); + border-radius: 8px; + padding: 0.75rem 1rem; + color: #e2e8f0; + font-size: 1rem; + transition: all 0.2s; +} + +.form-group input:focus { + outline: none; + border-color: #fc2922; + box-shadow: 0 0 0 3px rgba(252, 41, 34, 0.1); +} + +.form-group small { + color: #64748b; + font-size: 0.85rem; +} + +.download-button { + background: #fc2922; + border: none; + border-radius: 8px; + padding: 1rem 2rem; + color: white; + font-size: 1rem; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; + align-self: flex-start; +} + +.download-button:hover:not(:disabled) { + background: #e0241e; + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(252, 41, 34, 0.4); +} + +.download-button:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +.error-message { + background: rgba(239, 68, 68, 0.2); + border: 1px solid rgba(239, 68, 68, 0.5); + border-radius: 8px; + padding: 1rem; + color: #fca5a5; +} + +.success-message { + background: rgba(34, 197, 94, 0.2); + border: 1px solid rgba(34, 197, 94, 0.5); + border-radius: 8px; + padding: 1rem; + color: #86efac; +} + +.success-message code { + background: rgba(15, 23, 42, 0.6); + padding: 0.25rem 0.5rem; + border-radius: 4px; + font-family: 'Courier New', monospace; + margin-left: 0.5rem; +} + +.installation-instructions { + margin-top: 2rem; + padding-top: 2rem; + border-top: 1px solid rgba(148, 163, 184, 0.1); +} + +.installation-instructions h3 { + color: #e2e8f0; + font-size: 1.1rem; + margin-bottom: 1rem; + font-weight: 600; +} + +.installation-instructions ol { + color: #94a3b8; + line-height: 2; + padding-left: 1.5rem; +} + +.installation-instructions code { + background: rgba(15, 23, 42, 0.8); + border: 1px solid rgba(148, 163, 184, 0.2); + padding: 0.25rem 0.5rem; + border-radius: 4px; + font-family: 'Courier New', monospace; + color: #fc2922; +} + +/* Curl Instructions */ +.curl-instructions { + margin-top: 2rem; + padding-top: 2rem; + border-top: 1px solid rgba(148, 163, 184, 0.1); +} + +.curl-instructions h3 { + color: #e2e8f0; + font-size: 1.1rem; + margin-bottom: 0.75rem; + font-weight: 600; +} + +.curl-description { + color: #94a3b8; + margin-bottom: 1rem; + font-size: 0.9rem; +} + +.curl-command-container { + display: flex; + align-items: center; + gap: 0.75rem; + background: rgba(15, 23, 42, 0.8); + border: 1px solid rgba(148, 163, 184, 0.2); + border-radius: 8px; + padding: 1rem; + margin-bottom: 0.75rem; + position: relative; +} + +.curl-command { + flex: 1; + font-family: 'Courier New', monospace; + color: #fc2922; + font-size: 0.9rem; + word-break: break-all; + line-height: 1.6; + margin: 0; + background: transparent; + border: none; + padding: 0; +} + +.copy-button { + background: rgba(252, 41, 34, 0.2); + border: 1px solid rgba(252, 41, 34, 0.3); + border-radius: 6px; + padding: 0.5rem 0.75rem; + color: #fc2922; + cursor: pointer; + transition: all 0.2s; + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: center; +} + +.copy-button:hover { + background: rgba(252, 41, 34, 0.3); + border-color: rgba(252, 41, 34, 0.5); + transform: translateY(-1px); +} + +.copy-button i { + font-size: 0.9rem; +} + +.curl-note { + color: #64748b; + font-size: 0.85rem; + line-height: 1.5; + margin-top: 0.5rem; +} + +.curl-note code { + background: rgba(15, 23, 42, 0.6); + padding: 0.15rem 0.4rem; + border-radius: 4px; + font-family: 'Courier New', monospace; + color: #fc2922; + font-size: 0.85rem; +} + diff --git a/server/frontend/src/components/ClientDownload.js b/server/frontend/src/components/ClientDownload.js new file mode 100644 index 0000000..5f1d6df --- /dev/null +++ b/server/frontend/src/components/ClientDownload.js @@ -0,0 +1,163 @@ +import React, { useState } from 'react'; +import axios from 'axios'; +import './ClientDownload.css'; + +const API_URL = process.env.REACT_APP_API_URL || 'http://localhost:3001'; + +function ClientDownload({ onClose }) { + const [serverId, setServerId] = useState(''); + const [serverUrl, setServerUrl] = useState(''); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + const [success, setSuccess] = useState(false); + + // Get the base server URL for curl command (where the API is hosted) + const getBaseUrl = () => { + // Use serverUrl if provided, otherwise default to current origin but replace port 3000 with 3001 + if (serverUrl) { + return serverUrl; + } + return window.location.origin.replace(':3000', ':3001'); + }; + + // Generate curl command + const getCurlCommand = () => { + const baseUrl = getBaseUrl(); + // Include serverUrl query parameter if a custom serverUrl was provided + const queryParam = serverUrl ? `?serverUrl=${encodeURIComponent(serverUrl)}` : ''; + return `curl -s ${baseUrl}/api/download-client/${serverId}${queryParam} | bash`; + }; + + const copyCurlCommand = () => { + navigator.clipboard.writeText(getCurlCommand()); + }; + + const handleDownload = async (e) => { + e.preventDefault(); + setLoading(true); + setError(null); + setSuccess(false); + + try { + const response = await axios.post( + `${API_URL}/api/download-client`, + { + serverId: serverId || `server-${Date.now()}`, + serverUrl: serverUrl || window.location.origin.replace(':3000', ':3001') + }, + { + responseType: 'blob' + } + ); + + // Create download link + const url = window.URL.createObjectURL(new Blob([response.data])); + const link = document.createElement('a'); + link.href = url; + link.setAttribute('download', `oculog-client-install.sh`); + document.body.appendChild(link); + link.click(); + link.remove(); + window.URL.revokeObjectURL(url); + + setSuccess(true); + setTimeout(() => { + setSuccess(false); + if (onClose) onClose(); + }, 3000); + } catch (err) { + setError(err.response?.data?.error || 'Failed to generate client package'); + } finally { + setLoading(false); + } + }; + + return ( +
+

Download Client

+

+ Generate a pre-configured client installer for your Ubuntu server. + The installer includes your server URL and API key automatically configured. +

+ +
+
+ + setServerId(e.target.value)} + placeholder="my-ubuntu-server" + required + /> + Unique identifier for this server +
+ +
+ + setServerUrl(e.target.value)} + placeholder="http://your-server-ip:3001" + /> + Leave empty to use current server +
+ + {error &&
{error}
} + {success && ( +
+ Client installer downloaded! Run it on your Ubuntu server with: + sudo bash oculog-client-install.sh +
+ )} + + +
+ + {/* Curl Installation Instructions */} +
+

Quick Install with curl

+

+ Copy and paste this command directly into your Ubuntu server terminal: +

+
+ + {serverId ? getCurlCommand() : 'curl -s SERVER_URL/api/download-client/SERVER_ID?serverUrl=SERVER_URL | bash'} + + {serverId && ( + + )} +
+

+ Fill in the Server ID field above to generate your custom curl command. The command will automatically use your Server URL if provided. +

+
+ +
+

Manual Installation Instructions

+
    +
  1. Download the installer script above
  2. +
  3. Transfer it to your Ubuntu server
  4. +
  5. Make it executable: chmod +x oculog-client-install.sh
  6. +
  7. Run as root: sudo ./oculog-client-install.sh
  8. +
  9. The client will automatically start and begin sending metrics
  10. +
+
+
+ ); +} + +export default ClientDownload; + diff --git a/server/frontend/src/components/ErrorBoundary.js b/server/frontend/src/components/ErrorBoundary.js new file mode 100644 index 0000000..f2cc54e --- /dev/null +++ b/server/frontend/src/components/ErrorBoundary.js @@ -0,0 +1,33 @@ +import React from 'react'; + +class ErrorBoundary extends React.Component { + constructor(props) { + super(props); + this.state = { hasError: false, error: null }; + } + + static getDerivedStateFromError(error) { + // Update state so the next render will show the fallback UI + return { hasError: true, error }; + } + + componentDidCatch(error, errorInfo) { + // Log error to console in development, but don't show it to users + if (process.env.NODE_ENV === 'development') { + console.error('ErrorBoundary caught an error:', error, errorInfo); + } + } + + render() { + if (this.state.hasError) { + // Don't render error UI - just return children or null + // This prevents the error overlay from showing + return this.props.fallback || null; + } + + return this.props.children; + } +} + +export default ErrorBoundary; + diff --git a/server/frontend/src/components/MetricCard.css b/server/frontend/src/components/MetricCard.css new file mode 100644 index 0000000..1f3199e --- /dev/null +++ b/server/frontend/src/components/MetricCard.css @@ -0,0 +1,93 @@ +.metric-card { + background: rgba(15, 23, 42, 0.6); + border: 1px solid rgba(148, 163, 184, 0.1); + border-radius: 10px; + padding: 1.5rem; + transition: all 0.3s; + border-left: 3px solid var(--accent-color, #fc2922); + width: 100%; + box-sizing: border-box; +} + +.metric-card:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); + border-color: var(--accent-color, #fc2922); +} + +@media (max-width: 480px) { + .metric-card { + padding: 1rem; + border-radius: 8px; + } + + .metric-header h3 { + font-size: 0.8rem; + } + + .metric-value { + font-size: 1.75rem; + } + + .metric-value .unit { + font-size: 0.9rem; + } + + .metric-footer { + font-size: 0.75rem; + } +} + +@media (hover: none) and (pointer: coarse) { + .metric-card:hover { + transform: none; + } +} + +.metric-header { + margin-bottom: 1rem; +} + +.metric-header h3 { + font-size: 0.9rem; + color: #94a3b8; + font-weight: 500; + margin-bottom: 0.5rem; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.metric-value { + font-size: 2rem; + font-weight: 700; + color: var(--accent-color, #fc2922); + line-height: 1; +} + +.metric-value .unit { + font-size: 1rem; + color: #94a3b8; + font-weight: 400; +} + +.metric-bar { + width: 100%; + height: 6px; + background: rgba(30, 41, 59, 0.8); + border-radius: 3px; + overflow: hidden; + margin-bottom: 0.5rem; +} + +.metric-bar-fill { + height: 100%; + background: linear-gradient(90deg, var(--accent-color, #fc2922), var(--accent-color, #fc2922)); + border-radius: 3px; + transition: width 0.3s ease; +} + +.metric-footer { + font-size: 0.8rem; + color: #64748b; +} + diff --git a/server/frontend/src/components/MetricCard.js b/server/frontend/src/components/MetricCard.js new file mode 100644 index 0000000..61dca15 --- /dev/null +++ b/server/frontend/src/components/MetricCard.js @@ -0,0 +1,37 @@ +import React from 'react'; +import './MetricCard.css'; + +function MetricCard({ title, value, max, unit, color }) { + // Convert to number if string (PostgreSQL DECIMAL returns as string) + const numValue = typeof value === 'string' ? parseFloat(value) : (value || 0); + const numMax = max ? (typeof max === 'string' ? parseFloat(max) : max) : null; + const percentage = numMax ? (numValue / numMax) * 100 : numValue; + const displayValue = isNaN(numValue) ? '0.00' : numValue.toFixed(2); + + return ( +
+
+

{title}

+
+ {displayValue} {unit} +
+
+ {max && ( +
+
+
+ )} + {max && ( +
+ {isNaN(percentage) ? '0.0' : percentage.toFixed(1)}% of {isNaN(numMax) ? '0.00' : numMax.toFixed(2)} {unit} +
+ )} +
+ ); +} + +export default MetricCard; + diff --git a/server/frontend/src/components/MetricsChart.css b/server/frontend/src/components/MetricsChart.css new file mode 100644 index 0000000..0871096 --- /dev/null +++ b/server/frontend/src/components/MetricsChart.css @@ -0,0 +1,30 @@ +.metrics-chart { + background: rgba(15, 23, 42, 0.4); + border: 1px solid rgba(148, 163, 184, 0.1); + border-radius: 8px; + padding: 1rem; + width: 100%; + box-sizing: border-box; + min-width: 0; + overflow: hidden; +} + +.metrics-chart h3 { + font-size: 1rem; + color: #e2e8f0; + margin-bottom: 1rem; + font-weight: 600; +} + +@media (max-width: 480px) { + .metrics-chart { + padding: 0.75rem; + border-radius: 6px; + } + + .metrics-chart h3 { + font-size: 0.9rem; + margin-bottom: 0.75rem; + } +} + diff --git a/server/frontend/src/components/MetricsChart.js b/server/frontend/src/components/MetricsChart.js new file mode 100644 index 0000000..c59966a --- /dev/null +++ b/server/frontend/src/components/MetricsChart.js @@ -0,0 +1,158 @@ +import React from 'react'; +import { + LineChart, + Line, + XAxis, + YAxis, + CartesianGrid, + Tooltip, + ResponsiveContainer +} from 'recharts'; +import './MetricsChart.css'; + +function MetricsChart({ metrics, metricType, title, color, dataKey, unit, diskMountpoint }) { + if (!metrics || metrics.length === 0) { + return null; + } + + // Prepare data for chart + // Convert string values to numbers (PostgreSQL DECIMAL returns as string) + const toNumber = (val) => { + if (val == null) return 0; + return typeof val === 'string' ? parseFloat(val) || 0 : (val || 0); + }; + + // Backend returns metrics in DESC order (newest first) + // Reverse to show oldest->newest (left->right) for the full time range + const sortedMetrics = [...metrics].reverse(); + + // Check if data spans multiple days for date formatting + let spansMultipleDays = false; + if (sortedMetrics.length > 0) { + const firstTimestamp = new Date(sortedMetrics[0].timestamp); + const lastTimestamp = new Date(sortedMetrics[sortedMetrics.length - 1].timestamp); + const timeDiff = lastTimestamp.getTime() - firstTimestamp.getTime(); + spansMultipleDays = timeDiff > 24 * 60 * 60 * 1000; // More than 24 hours + } + + const chartData = sortedMetrics.map((metric) => { + let value = 0; + switch (metricType) { + case 'cpu': + value = toNumber(metric.cpu?.usage); + break; + case 'memory': + value = toNumber(metric.memory?.used); + break; + case 'swap': + value = toNumber(metric.swap?.used); + break; + case 'swapPercent': + value = toNumber(metric.swap?.percent); + break; + case 'processCount': + value = toNumber(metric.process_count); + break; + case 'loadAvg1min': + value = toNumber(metric.load_avg?.['1min']); + break; + case 'loadAvg5min': + value = toNumber(metric.load_avg?.['5min']); + break; + case 'loadAvg15min': + value = toNumber(metric.load_avg?.['15min']); + break; + case 'disk': + value = toNumber(metric.disk?.used); + break; + case 'networkRx': + value = toNumber(metric.network?.rx); + break; + case 'networkTx': + value = toNumber(metric.network?.tx); + break; + default: + // Handle disk-specific charts (e.g., disk-/mnt/ormentia-backups) + if (metricType.startsWith('disk-') && diskMountpoint) { + const disks = metric.disk?.disks; + if (disks) { + let disksArray = []; + if (Array.isArray(disks)) { + disksArray = disks; + } else if (typeof disks === 'string') { + try { + disksArray = JSON.parse(disks); + } catch (e) { + console.error('Error parsing disks JSON in chart:', e); + disksArray = []; + } + } + const disk = disksArray.find(d => d.mountpoint === diskMountpoint); + value = disk ? toNumber(disk.used) : 0; + } + } else { + value = 0; + } + } + const timestamp = new Date(metric.timestamp); + // Show date and time if data spans multiple days, otherwise just time + const timeLabel = spansMultipleDays + ? timestamp.toLocaleString(undefined, { + month: 'short', + day: 'numeric', + hour: '2-digit', + minute: '2-digit' + }) + : timestamp.toLocaleTimeString(undefined, { + hour: '2-digit', + minute: '2-digit', + second: '2-digit' + }); + + return { + time: timeLabel, + timestamp: timestamp.getTime(), // Keep for sorting if needed + value: value, + }; + }); + + return ( +
+

{title}

+ + + + + + [`${value.toFixed(2)} ${unit}`, title]} + /> + + + +
+ ); +} + +export default MetricsChart; + diff --git a/server/frontend/src/components/MetricsDashboard.css b/server/frontend/src/components/MetricsDashboard.css new file mode 100644 index 0000000..a4ec20c --- /dev/null +++ b/server/frontend/src/components/MetricsDashboard.css @@ -0,0 +1,862 @@ +.metrics-dashboard { + background: rgba(30, 41, 59, 0.6); + border-radius: 12px; + padding: 1.5rem; + backdrop-filter: blur(10px); + border: 1px solid rgba(148, 163, 184, 0.1); + overscroll-behavior-y: none; + width: 100%; + max-width: 100%; + box-sizing: border-box; +} + +.server-detail-layout { + display: flex; + gap: 0; + margin: -2rem; + padding: 0; + border-radius: 12px; + overflow: hidden; + flex-direction: row; + height: 100%; +} + +.server-detail-content { + flex: 1; + padding: 1.5rem; + overflow-x: hidden; + overflow-y: hidden; + overscroll-behavior-y: none; + min-width: 0; + box-sizing: border-box; + display: flex; + flex-direction: column; +} + +.dashboard-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; + padding-bottom: 0.75rem; + border-bottom: 1px solid rgba(148, 163, 184, 0.1); + flex-wrap: wrap; + gap: 0.75rem; +} + +.header-controls { + display: flex; + align-items: center; + gap: 1rem; + flex-wrap: wrap; +} + +.time-range-selector { + display: flex; + align-items: center; + gap: 0.375rem; +} + +.time-range-selector label { + color: #94a3b8; + font-size: 0.8rem; + font-weight: 500; +} + +.time-range-select { + background: rgba(15, 23, 42, 0.8); + border: 1px solid rgba(148, 163, 184, 0.2); + border-radius: 4px; + padding: 0.375rem 0.75rem; + color: #e2e8f0; + font-size: 0.8rem; + cursor: pointer; + transition: all 0.2s; + min-width: 100px; +} + +.time-range-select:hover { + border-color: rgba(148, 163, 184, 0.4); + background: rgba(15, 23, 42, 0.9); +} + +.time-range-select:focus { + outline: none; + border-color: #60a5fa; + box-shadow: 0 0 0 3px rgba(96, 165, 250, 0.1); +} + +.time-range-select option { + background: #1e293b; + color: #e2e8f0; +} + +.tabs-container { + display: flex; + gap: 0.25rem; + margin-bottom: 1.25rem; + border-bottom: 1px solid rgba(148, 163, 184, 0.1); + overflow-x: auto; + overflow-y: hidden; + -webkit-overflow-scrolling: touch; + scrollbar-width: thin; + scrollbar-color: rgba(148, 163, 184, 0.3) transparent; +} + +.tabs-container::-webkit-scrollbar { + height: 4px; +} + +.tabs-container::-webkit-scrollbar-track { + background: transparent; +} + +.tabs-container::-webkit-scrollbar-thumb { + background: rgba(148, 163, 184, 0.3); + border-radius: 2px; +} + +.tab-button { + background: transparent; + border: none; + padding: 0.5rem 1rem; + color: #94a3b8; + font-size: 0.85rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s; + border-bottom: 2px solid transparent; + margin-bottom: -1px; + position: relative; + white-space: nowrap; + flex-shrink: 0; + min-height: 44px; + touch-action: manipulation; +} + +.tab-button:hover { + color: #e2e8f0; + background: rgba(148, 163, 184, 0.05); +} + +.tab-button.active { + color: #60a5fa; + border-bottom-color: #60a5fa; +} + +.tab-content { + flex: 1; + min-height: 400px; + overflow-y: auto; + overflow-x: hidden; + padding-right: 0.5rem; +} + +.tab-panel { + animation: fadeIn 0.2s ease-in; +} + +.client-tab-panel { + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(5px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.dashboard-header h2 { + font-size: 1.1rem; + color: #e2e8f0; + font-weight: 600; +} + +.refresh-indicator { + display: flex; + align-items: center; + gap: 0.375rem; + color: #94a3b8; + font-size: 0.8rem; +} + +.pulse-dot { + width: 6px; + height: 6px; + background: #34d399; + border-radius: 50%; + animation: pulse 2s infinite; +} + +@keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } +} + +.metrics-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 1.5rem; + margin-bottom: 2rem; +} + +@media (max-width: 480px) { + .metrics-grid { + grid-template-columns: 1fr; + gap: 1rem; + margin-bottom: 1.5rem; + } +} + +.servers-overview-table { + overflow-x: auto; +} + +.servers-table { + width: 100%; + border-collapse: collapse; + background: rgba(15, 23, 42, 0.3); + border-radius: 8px; + overflow: hidden; +} + +.servers-table thead { + background: rgba(15, 23, 42, 0.6); +} + +.servers-table th { + padding: 0.75rem 1rem; + text-align: left; + color: #94a3b8; + font-size: 0.85rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + border-bottom: 1px solid rgba(148, 163, 184, 0.1); +} + +.servers-table th:first-child { + padding-left: 1.25rem; +} + +.servers-table th:last-child { + padding-right: 1.25rem; +} + +.servers-table tbody tr { + border-bottom: 1px solid rgba(148, 163, 184, 0.05); + transition: background-color 0.2s; +} + +.servers-table tbody tr:hover { + background: rgba(30, 41, 59, 0.4); +} + +.servers-table tbody tr:last-child { + border-bottom: none; +} + +.servers-table td { + padding: 0.875rem 1rem; + color: #e2e8f0; + font-size: 0.9rem; +} + +.servers-table td:first-child { + padding-left: 1.25rem; +} + +.servers-table td:last-child { + padding-right: 1.25rem; +} + +.server-name-cell { + font-weight: 600; + color: #e2e8f0; +} + +.metric-cell { + color: #cbd5e1; +} + +.table-metric-value { + font-family: 'Courier New', monospace; + font-size: 0.9rem; + color: #cbd5e1; + font-weight: 500; + line-height: 1.4; +} + +.version-cell { + color: #94a3b8; +} + +.version-value { + font-family: 'Courier New', monospace; + font-size: 0.85rem; + color: #94a3b8; +} + +.no-metrics { + padding: 4rem 2rem; + text-align: center; + color: #94a3b8; +} + +.no-metrics p { + font-size: 1.1rem; +} + +.charts-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); + gap: 1.5rem; + margin-top: 2rem; + padding-top: 2rem; + border-top: 1px solid rgba(148, 163, 184, 0.1); +} + +@media (max-width: 480px) { + .charts-grid { + grid-template-columns: 1fr; + gap: 1rem; + margin-top: 1.5rem; + padding-top: 1.5rem; + } +} + +.disks-section { + margin-top: 2rem; + padding-top: 2rem; + border-top: 1px solid rgba(148, 163, 184, 0.1); +} + +.disks-section h3 { + font-size: 1.2rem; + color: #e2e8f0; + margin-bottom: 1.5rem; + font-weight: 600; +} + +.disks-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 1.5rem; +} + +.disk-card { + background: rgba(15, 23, 42, 0.5); + border: 1px solid rgba(148, 163, 184, 0.1); + border-radius: 8px; + padding: 1.5rem; + transition: border-color 0.2s; +} + +.disk-card:hover { + border-color: rgba(148, 163, 184, 0.3); +} + +.disk-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; + padding-bottom: 0.75rem; + border-bottom: 1px solid rgba(148, 163, 184, 0.1); +} + +.disk-mountpoint { + font-weight: 600; + color: #e2e8f0; + font-size: 1rem; +} + +.disk-device { + color: #94a3b8; + font-size: 0.85rem; + font-family: monospace; +} + +.disk-info { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 0.75rem; + margin-bottom: 1rem; +} + +.disk-metric { + display: flex; + justify-content: space-between; + padding: 0.5rem; + background: rgba(30, 41, 59, 0.5); + border-radius: 4px; +} + +.disk-metric .label { + color: #94a3b8; + font-size: 0.85rem; +} + +.disk-metric .value { + color: #e2e8f0; + font-weight: 600; + font-size: 0.85rem; +} + +.disk-metric .value.warning { + color: #ef4444; +} + +.disk-bar { + width: 100%; + height: 8px; + background: rgba(30, 41, 59, 0.8); + border-radius: 4px; + overflow: hidden; + margin-top: 0.5rem; +} + +.disk-bar-fill { + height: 100%; + background: #f472b6; + transition: width 0.3s ease; + border-radius: 4px; +} + +.containers-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + gap: 1rem; +} + +.container-card { + background: rgba(15, 23, 42, 0.5); + border: 1px solid rgba(148, 163, 184, 0.1); + border-radius: 8px; + padding: 1rem; + transition: border-color 0.2s; +} + +.container-card:hover { + border-color: rgba(148, 163, 184, 0.3); +} + +.container-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.75rem; + padding-bottom: 0.75rem; + border-bottom: 1px solid rgba(148, 163, 184, 0.1); +} + +.container-name { + font-weight: 600; + color: #e2e8f0; + font-size: 0.95rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; + margin-right: 0.5rem; +} + +.container-status-badge { + font-size: 0.7rem; + padding: 0.25rem 0.5rem; + border-radius: 4px; + font-weight: 500; + flex-shrink: 0; +} + +.container-status-badge.status-running { + background: rgba(34, 211, 153, 0.2); + color: #34d399; +} + +.container-status-badge.status-stopped { + background: rgba(239, 68, 68, 0.2); + color: #ef4444; +} + +.container-image { + font-size: 0.8rem; + color: #94a3b8; + margin-bottom: 0.5rem; + font-family: 'Courier New', monospace; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.container-id { + font-size: 0.75rem; + color: #64748b; + font-family: 'Courier New', monospace; +} + +.client-info-section { + padding: 1.5rem 0; +} + +.client-info-title { + font-size: 1.2rem; + color: #e2e8f0; + margin-bottom: 1.5rem; + font-weight: 600; + padding-bottom: 0.75rem; + border-bottom: 1px solid rgba(148, 163, 184, 0.1); +} + +.client-info-content { + background: rgba(15, 23, 42, 0.4); + border-radius: 8px; + padding: 1.5rem; + border: 1px solid rgba(148, 163, 184, 0.1); +} + +.client-info-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.75rem 0; + border-bottom: 1px solid rgba(148, 163, 184, 0.05); +} + +.client-info-item:last-child { + border-bottom: none; +} + +.client-info-label { + font-size: 0.9rem; + color: #94a3b8; + font-weight: 500; +} + +.client-info-value { + font-size: 0.95rem; + color: #e2e8f0; + font-weight: 600; + font-family: 'Courier New', monospace; +} + +.client-update-status { + display: flex; + align-items: center; + gap: 0.5rem; + font-size: 0.9rem; + font-weight: 500; + padding: 0.375rem 0.75rem; + border-radius: 6px; +} + +.client-update-status.up-to-date { + color: #22c55e; + background: rgba(34, 197, 94, 0.1); +} + +.client-update-status.outdated { + color: #f59e0b; + background: rgba(245, 158, 11, 0.1); +} + +.client-update-status .status-icon { + font-size: 1rem; +} + +/* Mobile-first responsive breakpoints */ +/* Small phones (up to 480px) */ +@media (max-width: 480px) { + .metrics-dashboard { + padding: 0.75rem; + border-radius: 8px; + } + + .server-detail-layout { + flex-direction: column; + margin: -0.75rem; + border-radius: 8px; + } + + .server-detail-content { + padding: 1rem; + } + + .dashboard-header { + flex-direction: column; + align-items: flex-start; + gap: 0.75rem; + margin-bottom: 0.75rem; + padding-bottom: 0.75rem; + } + + .dashboard-header h2 { + font-size: 1rem; + width: 100%; + } + + .header-controls { + width: 100%; + justify-content: space-between; + gap: 0.5rem; + } + + .time-range-selector { + flex: 1; + min-width: 0; + } + + .time-range-selector label { + font-size: 0.75rem; + } + + .time-range-select { + font-size: 0.75rem; + padding: 0.5rem 0.625rem; + min-width: 0; + flex: 1; + width: 100%; + } + + .refresh-indicator { + font-size: 0.75rem; + } + + .tabs-container { + margin-bottom: 1rem; + gap: 0; + } + + .tab-button { + padding: 0.625rem 0.75rem; + font-size: 0.8rem; + min-height: 44px; + } + + .tab-content { + min-height: 300px; + } + + .disks-grid { + grid-template-columns: 1fr; + gap: 1rem; + } + + .disk-card { + padding: 1rem; + } + + .disk-header { + flex-direction: column; + align-items: flex-start; + gap: 0.5rem; + } + + .disk-info { + grid-template-columns: 1fr; + gap: 0.5rem; + } + + .disk-metric { + padding: 0.375rem; + } + + .containers-grid { + grid-template-columns: 1fr; + gap: 0.75rem; + } + + .container-card { + padding: 0.875rem; + } + + .container-header { + flex-direction: column; + align-items: flex-start; + gap: 0.5rem; + } + + .servers-overview-table { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + margin: 0 -0.75rem; + padding: 0 0.75rem; + } + + .servers-table { + min-width: 600px; + font-size: 0.8rem; + } + + .servers-table th, + .servers-table td { + padding: 0.625rem 0.5rem; + font-size: 0.8rem; + } + + .servers-table th:first-child, + .servers-table td:first-child { + padding-left: 0.75rem; + } + + .servers-table th:last-child, + .servers-table td:last-child { + padding-right: 0.75rem; + } + + .no-metrics { + padding: 2rem 1rem; + } + + .no-metrics p { + font-size: 0.95rem; + } +} + +/* Tablets and small screens (481px to 768px) */ +@media (min-width: 481px) and (max-width: 768px) { + .metrics-dashboard { + padding: 1rem; + } + + .server-detail-layout { + flex-direction: column; + margin: -1rem; + } + + .server-detail-content { + padding: 1.25rem; + } + + .dashboard-header { + gap: 1rem; + } + + .charts-grid { + grid-template-columns: 1fr; + gap: 1.25rem; + } + + .metrics-grid { + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + gap: 1.25rem; + } + + .disks-grid { + grid-template-columns: 1fr; + gap: 1.25rem; + } + + .disk-info { + grid-template-columns: repeat(2, 1fr); + } + + .containers-grid { + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + gap: 1rem; + } + + .servers-overview-table { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + + .servers-table { + min-width: 600px; + } +} + +/* Medium screens (769px to 1024px) */ +@media (min-width: 769px) and (max-width: 1024px) { + .server-detail-layout { + flex-direction: row; + } + + .charts-grid { + grid-template-columns: 1fr; + } + + .metrics-grid { + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + } +} + +/* Large screens (1025px+) */ +@media (min-width: 1025px) { + .server-detail-layout { + flex-direction: row; + } +} + +/* Landscape orientation adjustments for mobile */ +@media (max-width: 768px) and (orientation: landscape) { + .server-detail-layout { + flex-direction: row; + } + + .tabs-container { + overflow-x: auto; + } + + .tab-button { + min-height: 40px; + padding: 0.5rem 0.875rem; + } +} + +/* Touch device optimizations */ +@media (hover: none) and (pointer: coarse) { + .tab-button { + min-height: 44px; + padding: 0.625rem 1rem; + } + + .time-range-select { + min-height: 44px; + padding: 0.5rem 0.75rem; + } + + .disk-card:hover, + .container-card:hover { + transform: none; + } + + .metric-card:hover { + transform: none; + } +} + +/* Scrollbar styling for tab content */ +.tab-content::-webkit-scrollbar { + width: 6px; +} + +.tab-content::-webkit-scrollbar-track { + background: rgba(15, 23, 42, 0.3); +} + +.tab-content::-webkit-scrollbar-thumb { + background: rgba(148, 163, 184, 0.3); + border-radius: 3px; +} + +.tab-content::-webkit-scrollbar-thumb:hover { + background: rgba(148, 163, 184, 0.5); +} + +.tab-content { + scrollbar-width: thin; + scrollbar-color: rgba(148, 163, 184, 0.3) rgba(15, 23, 42, 0.3); +} + diff --git a/server/frontend/src/components/MetricsDashboard.js b/server/frontend/src/components/MetricsDashboard.js new file mode 100644 index 0000000..e09d41a --- /dev/null +++ b/server/frontend/src/components/MetricsDashboard.js @@ -0,0 +1,783 @@ +import React, { useState, useEffect } from 'react'; +import axios from 'axios'; +import './MetricsDashboard.css'; +import './ServerInfoPane.css'; +import MetricCard from './MetricCard'; +import MetricsChart from './MetricsChart'; +import ServerSecurity from './ServerSecurity'; + +const API_URL = process.env.REACT_APP_API_URL || 'http://localhost:3001'; + +function MetricsDashboard({ metrics, selectedServer, timeRange, onTimeRangeChange }) { + const [activeTab, setActiveTab] = useState('client'); + const [serverInfo, setServerInfo] = useState(null); + const [clientVersion, setClientVersion] = useState(null); + const [latestVersion, setLatestVersion] = useState(null); + const [isOutdated, setIsOutdated] = useState(false); + + useEffect(() => { + if (!selectedServer) { + setServerInfo(null); + setClientVersion(null); + setLatestVersion(null); + setIsOutdated(false); + return; + } + + const fetchServerInfo = async () => { + try { + const response = await axios.get(`${API_URL}/api/servers/${selectedServer}/info`); + setServerInfo(response.data.serverInfo); + setClientVersion(response.data.clientVersion); + setLatestVersion(response.data.latestVersion); + setIsOutdated(response.data.isOutdated || false); + } catch (err) { + if (err.response?.status !== 404) { + console.error('Error fetching server info:', err); + } + setServerInfo(null); + setClientVersion(null); + setLatestVersion(null); + setIsOutdated(false); + } + }; + + fetchServerInfo(); + const interval = setInterval(fetchServerInfo, 30000); + return () => clearInterval(interval); + }, [selectedServer]); + + const timeRangeOptions = [ + { value: '5m', label: '5 Minutes' }, + { value: '15m', label: '15 Minutes' }, + { value: '30m', label: '30 Minutes' }, + { value: '1h', label: '1 Hour' }, + { value: '3h', label: '3 Hours' }, + { value: '6h', label: '6 Hours' }, + { value: '12h', label: '12 Hours' }, + { value: '1d', label: '1 Day' }, + { value: '3d', label: '3 Days' }, + { value: '1w', label: '1 Week' }, + { value: '2w', label: '2 Weeks' }, + { value: '1mo', label: '1 Month' } + ]; + + const displayMetrics = selectedServer + ? metrics[selectedServer] || [] + : Object.values(metrics); + + // Get latest metrics - try to find one with disk data if available + let latestMetrics = selectedServer + ? (metrics[selectedServer] || [])[0] + : null; + + // If latest metrics don't have disks, try to find a recent metric that does + if (selectedServer && latestMetrics && !latestMetrics.disk?.disks) { + const serverMetrics = metrics[selectedServer] || []; + const metricWithDisks = serverMetrics.find(m => m.disk?.disks && ( + Array.isArray(m.disk.disks) || (typeof m.disk.disks === 'string' && m.disk.disks.trim() !== '') + )); + if (metricWithDisks) { + // Use the disk data from this metric but keep other data from latest + latestMetrics = { + ...latestMetrics, + disk: { + ...latestMetrics.disk, + disks: metricWithDisks.disk.disks + } + }; + } + } + + const allLatestMetrics = !selectedServer + ? Object.entries(metrics).map(([serverId, metric]) => ({ + serverId, + ...(Array.isArray(metric) ? metric[metric.length - 1] : metric) + })) + : []; + + // Get all disks from latest metrics + // Handle both array format (from backend) and potential string format + const allDisks = latestMetrics?.disk?.disks; + let disksArray = []; + + if (allDisks) { + if (Array.isArray(allDisks)) { + disksArray = allDisks; + } else if (typeof allDisks === 'string' && allDisks.trim() !== '') { + try { + const parsed = JSON.parse(allDisks); + disksArray = Array.isArray(parsed) ? parsed : []; + } catch (e) { + console.error('Error parsing disks JSON:', e); + disksArray = []; + } + } + } + + // Debug logging (can be removed later) + if (latestMetrics && !disksArray.length) { + console.log('No disks found. Latest metrics structure:', { + hasDisk: !!latestMetrics.disk, + hasDisks: !!latestMetrics.disk?.disks, + disksValue: latestMetrics.disk?.disks, + fullLatestMetrics: latestMetrics + }); + } + + return ( +
+
+

+ {selectedServer ? selectedServer : 'All Servers Overview'} +

+
+ {selectedServer && ( +
+ + +
+ )} +
+ + Live +
+
+
+ + {selectedServer ? ( +
+
+ {latestMetrics ? ( + <> + {/* Tab Navigation */} +
+ + + + + + + +
+ + {/* Tab Content */} +
+ {activeTab === 'cpu-memory' && ( +
+
+ + +
+
+ + +
+
+ )} + + {activeTab === 'disks' && ( +
+ {disksArray.length > 0 ? ( + <> +
+
+ {disksArray.map((disk, index) => { + const used = typeof disk.used === 'string' ? parseFloat(disk.used) : (disk.used || 0); + const total = typeof disk.total === 'string' ? parseFloat(disk.total) : (disk.total || 0); + const free = typeof disk.free === 'string' ? parseFloat(disk.free) : (disk.free || 0); + const percent = typeof disk.percent === 'string' ? parseFloat(disk.percent) : (disk.percent || 0); + + return ( +
+
+ {disk.mountpoint} + {disk.device} +
+
+
+ Used: + {used.toFixed(2)} GB +
+
+ Total: + {total.toFixed(2)} GB +
+
+ Free: + {free.toFixed(2)} GB +
+
+ Usage: + 80 ? 'warning' : ''}`}> + {percent.toFixed(1)}% + +
+
+
+
80 ? '#ef4444' : '#f472b6' + }} + /> +
+
+ ); + })} +
+
+
+ {disksArray.map((disk, index) => ( + + ))} +
+ + ) : ( +
+

No disk information available

+ {latestMetrics && ( +
+

Debug info: {latestMetrics.disk ? 'Disk object exists' : 'No disk object'}

+

Disks value: {latestMetrics.disk?.disks ? + (Array.isArray(latestMetrics.disk.disks) ? + `Array with ${latestMetrics.disk.disks.length} items` : + `Type: ${typeof latestMetrics.disk.disks}`) : + 'null/undefined'}

+
+ )} +
+ )} +
+ )} + + {activeTab === 'network' && ( +
+
+ + +
+
+ + +
+
+ )} + + {activeTab === 'system' && ( +
+ {(() => { + // Debug logging + if (latestMetrics) { + const hasValidSwap = latestMetrics.swap && latestMetrics.swap.total != null && latestMetrics.swap.total > 0; + const hasValidProcessCount = latestMetrics.process_count != null; + const hasValidLoadAvg = latestMetrics.load_avg && ( + latestMetrics.load_avg['1min'] != null || + latestMetrics.load_avg['5min'] != null || + latestMetrics.load_avg['15min'] != null + ); + + console.log('[System Tab Debug] Full latestMetrics object:', latestMetrics); + console.log('[System Tab Debug] Summary:', { + hasSwap: !!latestMetrics.swap, + swap: latestMetrics.swap, + hasValidSwap, + hasProcessCount: latestMetrics.process_count !== undefined, + processCount: latestMetrics.process_count, + hasValidProcessCount, + hasLoadAvg: !!latestMetrics.load_avg, + loadAvg: latestMetrics.load_avg, + hasValidLoadAvg, + allKeys: Object.keys(latestMetrics), + willShow: hasValidSwap || hasValidProcessCount || hasValidLoadAvg + }); + + return hasValidSwap || hasValidProcessCount || hasValidLoadAvg; + } else { + console.log('[System Tab Debug] latestMetrics is null/undefined'); + return false; + } + })() ? ( + <> +
+ {latestMetrics.swap && latestMetrics.swap.total != null && latestMetrics.swap.total > 0 && ( + + )} + {latestMetrics.process_count != null && ( + + )} + {latestMetrics.load_avg && ( + <> + {latestMetrics.load_avg['1min'] != null && ( + + )} + {latestMetrics.load_avg['5min'] != null && ( + + )} + {latestMetrics.load_avg['15min'] != null && ( + + )} + + )} +
+
+ {latestMetrics.swap && latestMetrics.swap.total != null && latestMetrics.swap.total > 0 && ( + <> + + + + )} + {latestMetrics.process_count != null && ( + + )} + {latestMetrics.load_avg && ( + <> + {latestMetrics.load_avg['1min'] != null && ( + + )} + {latestMetrics.load_avg['5min'] != null && ( + + )} + {latestMetrics.load_avg['15min'] != null && ( + + )} + + )} +
+ + ) : ( +
+

No system metrics available yet. Metrics will appear here once collected.

+
+ )} +
+ )} + + {activeTab === 'containers' && ( +
+ {serverInfo?.containers && serverInfo.containers.length > 0 ? ( +
+ {serverInfo.containers.map((container, index) => ( +
+
+
{container.names || container.id || 'Unknown'}
+
+ {container.status || 'N/A'} +
+
+
{container.image || 'N/A'}
+ {container.id && ( +
{container.id.substring(0, 12)}
+ )} +
+ ))} +
+ ) : ( +
+

No containers running

+
+ )} +
+ )} + + {activeTab === 'security' && ( +
+ +
+ )} + + {activeTab === 'client' && ( +
+ {/* Client Information */} +
+

Client Information

+ {clientVersion ? ( +
+
+ Client Version: + {clientVersion} +
+ {latestVersion && ( +
+ Latest Version: + {latestVersion} +
+ )} +
+ Update Status: + + {isOutdated ? ( + <> + ⚠️ + Out of Date + + ) : ( + <> + + Up to Date + + )} + +
+
+ ) : ( +
+

No client version information available

+
+ )} +
+ + {/* OS Information */} + {serverInfo && ( + <> +
+

OS Information

+ {serverInfo.os_release ? ( +
+ {serverInfo.os_release.PRETTY_NAME && ( +
+ OS: + {serverInfo.os_release.PRETTY_NAME} +
+ )} + {serverInfo.os_release.VERSION_ID && ( +
+ Version: + {serverInfo.os_release.VERSION_ID} +
+ )} +
+ ) : ( +
No OS information available
+ )} +
+ + {/* Live Status */} +
+

Live Status

+ {serverInfo.live_status ? ( +
+
+ Uptime: + + {(() => { + const { uptime_days, uptime_hours, uptime_minutes } = serverInfo.live_status; + if (uptime_days > 0) { + return `${uptime_days}d ${uptime_hours}h ${uptime_minutes}m`; + } else if (uptime_hours > 0) { + return `${uptime_hours}h ${uptime_minutes}m`; + } else { + return `${uptime_minutes}m`; + } + })()} + +
+
+ Load: + + {serverInfo.live_status.load_average_1min?.toFixed(2) || 'N/A'} / {serverInfo.live_status.load_average_5min?.toFixed(2) || 'N/A'} / {serverInfo.live_status.load_average_15min?.toFixed(2) || 'N/A'} + +
+
+ ) : ( +
No status information available
+ )} +
+ + {/* Top Processes */} +
+

Top Processes

+ {serverInfo.top_processes && serverInfo.top_processes.length > 0 ? ( +
+
+ {serverInfo.top_processes.slice(0, 5).map((proc, index) => ( +
+
{proc.name || 'Unknown'}
+
+ CPU: {proc.cpu_percent?.toFixed(1) || '0.0'}% + Mem: {proc.memory_percent?.toFixed(1) || '0.0'}% +
+
+ ))} +
+
+ ) : ( +
No process information available
+ )} +
+ + {/* Network Information */} +
+

Network Information

+ {serverInfo.ip_info ? ( +
+ {serverInfo.ip_info.public && ( +
+ Public IP: + {serverInfo.ip_info.public} +
+ )} + {serverInfo.ip_info.private && serverInfo.ip_info.private.length > 0 && ( +
+ Private IPs: +
+ {serverInfo.ip_info.private.map((ip, index) => ( +
+ {ip.ip} + ({ip.interface}) +
+ ))} +
+
+ )} + {!serverInfo.ip_info.public && (!serverInfo.ip_info.private || serverInfo.ip_info.private.length === 0) && ( +
No IP information available
+ )} +
+ ) : ( +
No network information available
+ )} +
+ + )} + {!serverInfo && ( +
+

No server information available

+
+ )} +
+ )} +
+ + ) : ( +
+

No metrics available for this server

+
+ )} +
+
+ ) : ( + <> + {allLatestMetrics.length > 0 ? ( + <> +
+ + + + + + + + + + + + {allLatestMetrics.map(({ serverId, cpu, memory, disk, network, clientVersion }) => { + const cpuUsage = cpu?.usage ? (typeof cpu.usage === 'string' ? parseFloat(cpu.usage) : cpu.usage) : 0; + const memUsed = memory?.used ? (typeof memory.used === 'string' ? parseFloat(memory.used) : memory.used) : 0; + const memTotal = memory?.total ? (typeof memory.total === 'string' ? parseFloat(memory.total) : memory.total) : 0; + const diskUsed = disk?.used ? (typeof disk.used === 'string' ? parseFloat(disk.used) : disk.used) : 0; + const diskTotal = disk?.total ? (typeof disk.total === 'string' ? parseFloat(disk.total) : disk.total) : 0; + + return ( + + + + + + + + ); + })} + +
ServerCPUMemoryDiskClient Version
{serverId} + {cpuUsage.toFixed(1)}% + + + {memUsed.toFixed(1)} / {memTotal.toFixed(1)} GB + + + + {diskUsed.toFixed(1)} / {diskTotal.toFixed(1)} GB + + + + {clientVersion || 'N/A'} + +
+
+ + ) : ( +
+

No metrics available. Connect servers to see data.

+
+ )} + + )} +
+ ); +} + +export default MetricsDashboard; diff --git a/server/frontend/src/components/Security.css b/server/frontend/src/components/Security.css new file mode 100644 index 0000000..7017956 --- /dev/null +++ b/server/frontend/src/components/Security.css @@ -0,0 +1,266 @@ +.security { + padding: 2rem; + max-width: 1400px; + margin: 0 auto; +} + +.security-header { + margin-bottom: 2rem; +} + +.security-header h2 { + margin: 0 0 1.5rem 0; + color: #f1f5f9; + font-size: 1.875rem; +} + +.security-summary { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 1rem; + margin-bottom: 2rem; +} + +.summary-card { + background: rgba(30, 41, 59, 0.8); + border: 1px solid rgba(148, 163, 184, 0.2); + border-radius: 8px; + padding: 1.5rem; + text-align: center; +} + +.summary-card.critical { + border-color: rgba(239, 68, 68, 0.3); +} + +.summary-card.high { + border-color: rgba(249, 115, 22, 0.3); +} + +.summary-card.medium { + border-color: rgba(234, 179, 8, 0.3); +} + +.summary-label { + color: #94a3b8; + font-size: 0.875rem; + margin-bottom: 0.5rem; +} + +.summary-value { + color: #f1f5f9; + font-size: 2rem; + font-weight: 700; +} + +.error-message { + background: #ef4444; + color: white; + padding: 1rem; + border-radius: 6px; + margin-bottom: 1rem; +} + +.security-filters { + display: flex; + gap: 1rem; + margin-bottom: 2rem; + flex-wrap: wrap; +} + +.filter-group { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.filter-group label { + color: #f1f5f9; + font-size: 0.875rem; + font-weight: 500; +} + +.filter-group select, +.filter-group input { + padding: 0.5rem 0.75rem; + background: rgba(15, 23, 42, 0.8); + border: 1px solid rgba(148, 163, 184, 0.3); + border-radius: 6px; + color: #f1f5f9; + font-size: 0.875rem; +} + +.filter-group select:focus, +.filter-group input:focus { + outline: none; + border-color: #fc2922; +} + +.filter-group input { + min-width: 250px; +} + +.no-vulnerabilities { + text-align: center; + padding: 4rem 2rem; + color: #94a3b8; +} + +.vulnerabilities-list { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.vulnerability-card { + background: rgba(30, 41, 59, 0.8); + border: 1px solid rgba(252, 41, 34, 0.2); + border-radius: 8px; + overflow: hidden; + transition: all 0.2s; +} + +.vulnerability-card:hover { + border-color: rgba(252, 41, 34, 0.4); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); +} + +.vulnerability-header { + padding: 1.5rem; + display: flex; + justify-content: space-between; + align-items: center; + cursor: pointer; +} + +.vulnerability-title { + display: flex; + align-items: center; + gap: 1rem; + flex: 1; +} + +.vulnerability-title h3 { + margin: 0; + color: #f1f5f9; + font-size: 1.125rem; +} + +.severity-badge { + display: inline-block; + padding: 0.25rem 0.75rem; + border-radius: 12px; + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; +} + +.package-name { + color: #94a3b8; + font-size: 0.875rem; + font-weight: 500; +} + +.vulnerability-meta { + display: flex; + align-items: center; + gap: 1rem; +} + +.affected-servers { + color: #94a3b8; + font-size: 0.875rem; +} + +.expand-icon { + color: #94a3b8; + font-size: 0.75rem; +} + +.vulnerability-details { + padding: 0 1.5rem 1.5rem 1.5rem; + border-top: 1px solid rgba(148, 163, 184, 0.1); + margin-top: 1rem; + padding-top: 1.5rem; +} + +.detail-section { + margin-bottom: 1.5rem; +} + +.detail-section:last-child { + margin-bottom: 0; +} + +.detail-section strong { + display: block; + color: #f1f5f9; + font-size: 0.875rem; + font-weight: 600; + margin-bottom: 0.5rem; +} + +.detail-section p { + color: #cbd5e1; + font-size: 0.875rem; + line-height: 1.6; + margin: 0; +} + +.fixed-version { + color: #10b981; + font-weight: 600; + font-family: monospace; +} + +.servers-list { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + margin-top: 0.5rem; +} + +.server-tag { + display: inline-block; + padding: 0.25rem 0.75rem; + background: rgba(252, 41, 34, 0.1); + border: 1px solid rgba(252, 41, 34, 0.3); + border-radius: 12px; + color: #fc2922; + font-size: 0.75rem; + font-weight: 500; +} + +.cve-link { + color: #3b82f6; + text-decoration: none; + font-size: 0.875rem; + transition: color 0.2s; +} + +.cve-link:hover { + color: #60a5fa; + text-decoration: underline; +} + +@media (max-width: 768px) { + .security { + padding: 1rem; + } + + .security-summary { + grid-template-columns: repeat(2, 1fr); + } + + .vulnerability-header { + flex-direction: column; + align-items: flex-start; + gap: 1rem; + } + + .vulnerability-title { + flex-direction: column; + align-items: flex-start; + gap: 0.5rem; + } +} diff --git a/server/frontend/src/components/Security.js b/server/frontend/src/components/Security.js new file mode 100644 index 0000000..4928965 --- /dev/null +++ b/server/frontend/src/components/Security.js @@ -0,0 +1,224 @@ +import React, { useState, useEffect } from 'react'; +import axios from 'axios'; +import './Security.css'; + +const API_URL = process.env.REACT_APP_API_URL || 'http://localhost:3001'; + +function Security() { + const [vulnerabilities, setVulnerabilities] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [filters, setFilters] = useState({ + severity: '', + search: '' + }); + const [expandedVuln, setExpandedVuln] = useState(null); + + useEffect(() => { + fetchVulnerabilities(); + const interval = setInterval(fetchVulnerabilities, 30000); // Refresh every 30 seconds + return () => clearInterval(interval); + }, []); + + const fetchVulnerabilities = async () => { + try { + const params = {}; + if (filters.severity) { + params.severity = filters.severity; + } + const response = await axios.get(`${API_URL}/api/security/vulnerabilities`, { params }); + setVulnerabilities(response.data.vulnerabilities || []); + setLoading(false); + setError(null); + } catch (err) { + setError('Failed to fetch vulnerabilities'); + setLoading(false); + console.error('Error fetching vulnerabilities:', err); + } + }; + + const getSeverityColor = (severity) => { + switch (severity) { + case 'CRITICAL': + return '#ef4444'; + case 'HIGH': + return '#f97316'; + case 'MEDIUM': + return '#eab308'; + case 'LOW': + return '#3b82f6'; + default: + return '#94a3b8'; + } + }; + + const getSeverityBadge = (severity) => { + return ( + + {severity || 'UNKNOWN'} + + ); + }; + + const filteredVulnerabilities = vulnerabilities.filter(vuln => { + if (filters.severity && vuln.severity !== filters.severity) { + return false; + } + if (filters.search) { + const searchLower = filters.search.toLowerCase(); + return ( + vuln.cve_id?.toLowerCase().includes(searchLower) || + vuln.package_name?.toLowerCase().includes(searchLower) || + vuln.summary?.toLowerCase().includes(searchLower) + ); + } + return true; + }); + + const toggleExpand = (vulnId) => { + setExpandedVuln(expandedVuln === vulnId ? null : vulnId); + }; + + if (loading) { + return ( +
+
Loading vulnerabilities...
+
+ ); + } + + return ( +
+
+

Security Vulnerabilities

+
+
+
Total Vulnerabilities
+
{vulnerabilities.length}
+
+
+
Critical
+
+ {vulnerabilities.filter(v => v.severity === 'CRITICAL').length} +
+
+
+
High
+
+ {vulnerabilities.filter(v => v.severity === 'HIGH').length} +
+
+
+
Medium
+
+ {vulnerabilities.filter(v => v.severity === 'MEDIUM').length} +
+
+
+
+ + {error &&
{error}
} + +
+
+ + +
+
+ + setFilters({ ...filters, search: e.target.value })} + /> +
+
+ + {filteredVulnerabilities.length === 0 ? ( +
+

{vulnerabilities.length === 0 ? 'No vulnerabilities found' : 'No vulnerabilities match filters'}

+
+ ) : ( +
+ {filteredVulnerabilities.map((vuln) => ( +
+
toggleExpand(vuln.id)}> +
+

{vuln.cve_id || 'Unknown CVE'}

+ {getSeverityBadge(vuln.severity)} + {vuln.package_name} +
+
+ + {vuln.affected_server_count || 0} server{vuln.affected_server_count !== 1 ? 's' : ''} + + {expandedVuln === vuln.id ? '▼' : '▶'} +
+
+ + {expandedVuln === vuln.id && ( +
+ {vuln.summary && ( +
+ Summary: +

{vuln.summary}

+
+ )} + {vuln.description && ( +
+ Description: +

{vuln.description}

+
+ )} + {vuln.fixed_version && ( +
+ Fixed Version: + {vuln.fixed_version} +
+ )} + {vuln.affected_servers && vuln.affected_servers.length > 0 && ( +
+ Affected Servers: +
+ {vuln.affected_servers.map((serverId, idx) => ( + {serverId} + ))} +
+
+ )} + {vuln.cve_id && ( + + )} +
+ )} +
+ ))} +
+ )} +
+ ); +} + +export default Security; diff --git a/server/frontend/src/components/SecurityDashboard.css b/server/frontend/src/components/SecurityDashboard.css new file mode 100644 index 0000000..b384c08 --- /dev/null +++ b/server/frontend/src/components/SecurityDashboard.css @@ -0,0 +1,660 @@ +.security-dashboard { + padding: 1rem; + max-width: 1400px; + margin: 0 auto; + color: #e5e7eb; +} + +.dashboard-header { + margin-bottom: 1rem; +} + +.dashboard-header h1 { + font-size: 2rem; + font-weight: 600; + margin-bottom: 0.5rem; + color: #f9fafb; +} + +.dashboard-subtitle { + color: #9ca3af; + font-size: 0.95rem; +} + +/* Metrics Grid */ +.metrics-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 0.75rem; + margin-bottom: 1rem; +} + +.metric-card { + background: #1f2937; + border-radius: 8px; + padding: 0.75rem; + border: 1px solid #374151; + transition: transform 0.2s, box-shadow 0.2s; +} + +.metric-card:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); +} + +.metric-card.risk-score { + border: 2px solid; + border-color: currentColor; +} + +.metric-card.critical { + border-left: 4px solid #ef4444; +} + +.metric-card.high { + border-left: 4px solid #f97316; +} + +.metric-card.fixable { + border-left: 4px solid #10b981; +} + +.metric-card.active { + background: #111827; + border: 2px solid; + box-shadow: 0 4px 12px rgba(252, 41, 34, 0.2); +} + +.metric-card.critical.active { + border-color: #ef4444; +} + +.metric-card.high.active { + border-color: #f97316; +} + +.metric-card.fixable.active { + border-color: #10b981; +} + +.metric-label { + font-size: 0.875rem; + color: #9ca3af; + margin-bottom: 0.25rem; + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.metric-value { + font-size: 2rem; + font-weight: 700; + color: #f9fafb; + margin-bottom: 0.125rem; +} + +.metric-value-large { + font-size: 3rem; + font-weight: 700; + margin-bottom: 0.125rem; +} + +.metric-sublabel { + font-size: 0.75rem; + color: #6b7280; +} + +/* AI Insights Modal */ +.modal-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.75); + backdrop-filter: blur(4px); + display: flex; + align-items: center; + justify-content: center; + z-index: 2000; + padding: 1rem; +} + +.ai-insights-modal { + background: rgba(30, 41, 59, 0.98); + border-radius: 12px; + padding: 1rem; + max-width: 900px; + width: 100%; + max-height: 90vh; + overflow-y: auto; + position: relative; + border: 1px solid rgba(252, 41, 34, 0.3); + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5); +} + +.modal-header { + margin-bottom: 0.75rem; + padding-bottom: 0.5rem; + border-bottom: 1px solid #374151; +} + +.modal-header h2 { + font-size: 1.5rem; + font-weight: 600; + color: #f9fafb; + margin: 0; +} + +.modal-close { + position: absolute; + top: 0.5rem; + right: 0.5rem; + background: transparent; + border: 1px solid rgba(148, 163, 184, 0.3); + border-radius: 6px; + padding: 0.25rem; + color: #94a3b8; + cursor: pointer; + transition: all 0.2s; + display: flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + z-index: 10; +} + +.modal-close:hover { + background: rgba(252, 41, 34, 0.1); + color: #fc2922; + border-color: rgba(252, 41, 34, 0.5); +} + +.modal-close svg { + width: 18px; + height: 18px; +} + +.ai-generate-btn { + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + border: none; + padding: 0.375rem 0.75rem; + border-radius: 6px; + font-weight: 600; + cursor: pointer; + transition: opacity 0.2s, transform 0.2s; +} + +.ai-generate-btn:hover:not(:disabled) { + opacity: 0.9; + transform: translateY(-1px); +} + +.ai-generate-btn:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +.ai-placeholder { + text-align: center; + padding: 2rem 1rem; + color: #6b7280; +} + +.ai-icon { + font-size: 4rem; + margin-bottom: 0.5rem; +} + +.placeholder-subtext { + font-size: 0.875rem; + margin-top: 0.5rem; + color: #4b5563; +} + +/* Insights Content */ +.insights-content { + display: grid; + gap: 0.75rem; +} + +.insight-card { + background: #111827; + border-radius: 8px; + padding: 0.75rem; + border: 1px solid #374151; +} + +.insight-card h3 { + font-size: 1.25rem; + font-weight: 600; + margin-bottom: 0.5rem; + color: #f9fafb; +} + +.insight-description { + color: #9ca3af; + font-size: 0.875rem; + margin-bottom: 0.5rem; +} + +/* Risk Breakdown */ +.risk-breakdown { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.risk-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.375rem; + background: #1f2937; + border-radius: 6px; +} + +.risk-label { + color: #9ca3af; + font-size: 0.875rem; +} + +.risk-value { + font-weight: 600; + font-size: 1.125rem; +} + +/* Priority List */ +.priority-list { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.priority-item { + background: #1f2937; + border-radius: 6px; + padding: 0.5rem; + border-left: 4px solid #f97316; +} + +.priority-header { + display: flex; + align-items: center; + gap: 0.75rem; + margin-bottom: 0.25rem; +} + +.priority-number { + background: #374151; + color: #f9fafb; + width: 24px; + height: 24px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-weight: 600; + font-size: 0.875rem; +} + +.priority-cve { + font-weight: 600; + color: #60a5fa; + font-family: 'Courier New', monospace; +} + +.priority-severity { + font-weight: 600; + font-size: 0.875rem; + margin-left: auto; +} + +.priority-details { + display: flex; + gap: 1rem; + align-items: center; + margin-bottom: 0.25rem; + font-size: 0.875rem; + color: #9ca3af; +} + +.priority-package { + font-weight: 500; + color: #e5e7eb; +} + +.priority-fix-badge { + background: #10b981; + color: white; + padding: 0.25rem 0.5rem; + border-radius: 4px; + font-size: 0.75rem; + font-weight: 600; +} + +.priority-recommendation { + color: #fbbf24; + font-size: 0.875rem; + margin-top: 0.25rem; + padding-left: 0.75rem; +} + +/* Quick Wins */ +.quick-wins-list { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 0.5rem; +} + +.quick-win-item { + background: #1f2937; + border-radius: 6px; + padding: 0.5rem; + border: 1px solid #374151; + border-left: 4px solid #10b981; +} + +.quick-win-header { + display: flex; + gap: 0.75rem; + margin-bottom: 0.375rem; + align-items: center; +} + +.quick-win-cve { + font-family: 'Courier New', monospace; + color: #60a5fa; + font-weight: 600; + font-size: 0.875rem; +} + +.quick-win-package { + color: #9ca3af; + font-size: 0.875rem; +} + +.quick-win-action { + color: #e5e7eb; + font-size: 0.875rem; + margin-bottom: 0.25rem; +} + +.quick-win-action strong { + color: #10b981; + font-weight: 600; +} + +.quick-win-servers { + color: #6b7280; + font-size: 0.75rem; +} + +/* Recommendations */ +.recommendations-list { + display: flex; + flex-direction: column; + gap: 0.375rem; +} + +.recommendation-item { + display: flex; + gap: 1rem; + padding: 0.5rem; + background: #1f2937; + border-radius: 6px; + border-left: 4px solid; +} + +.recommendation-item.critical { + border-color: #ef4444; +} + +.recommendation-item.high { + border-color: #f97316; +} + +.recommendation-item.medium { + border-color: #eab308; +} + +.recommendation-icon { + font-size: 1.5rem; +} + +.recommendation-content { + flex: 1; +} + +.recommendation-text { + color: #e5e7eb; + margin-bottom: 0.125rem; + font-weight: 500; +} + +.recommendation-action { + color: #60a5fa; + font-size: 0.875rem; + cursor: pointer; +} + +.recommendation-action:hover { + text-decoration: underline; +} + +/* Trends */ +.trends-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); + gap: 0.5rem; +} + +.trend-item { + background: #1f2937; + padding: 0.5rem; + border-radius: 6px; + text-align: center; +} + +.trend-label { + color: #9ca3af; + font-size: 0.875rem; + margin-bottom: 0.25rem; +} + +.trend-value { + font-size: 1.5rem; + font-weight: 700; + color: #f9fafb; +} + +.trend-value.positive { + color: #10b981; +} + +/* Critical Vulnerabilities */ +.critical-vulnerabilities-section { + margin-bottom: 1rem; +} + +.critical-vulnerabilities-section h2 { + font-size: 1.5rem; + font-weight: 600; + margin-bottom: 0.5rem; + color: #f9fafb; +} + +.critical-list { + display: flex; + flex-direction: column; + gap: 0.375rem; +} + +.critical-item { + background: #1f2937; + border-radius: 8px; + padding: 0.5rem; + border: 1px solid #374151; + border-left: 4px solid #ef4444; +} + +.critical-header { + display: flex; + align-items: center; + gap: 1rem; + margin-bottom: 0.25rem; +} + +.critical-cve-link { + font-family: 'Courier New', monospace; + color: #60a5fa; + font-weight: 600; + text-decoration: none; + font-size: 1rem; +} + +.critical-cve-link:hover { + text-decoration: underline; +} + +.critical-severity { + font-weight: 600; + font-size: 0.875rem; + margin-left: auto; +} + +.critical-details { + display: flex; + gap: 1rem; + align-items: center; + font-size: 0.875rem; + color: #9ca3af; + margin-bottom: 0.25rem; +} + +.critical-package { + font-weight: 500; + color: #e5e7eb; +} + +.critical-fix { + color: #10b981; + font-weight: 500; +} + +.critical-summary { + color: #d1d5db; + font-size: 0.875rem; + line-height: 1.5; +} + +/* Server Security Overview */ +.server-security-overview { + margin-bottom: 2rem; +} + +.server-security-overview h2 { + font-size: 1.5rem; + font-weight: 600; + margin-bottom: 1rem; + color: #f9fafb; +} + +.server-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + gap: 1rem; +} + +.server-security-card { + background: #1f2937; + border-radius: 8px; + padding: 1.5rem; + border: 1px solid #374151; +} + +.server-security-card h3 { + font-size: 1.125rem; + font-weight: 600; + margin-bottom: 1rem; + color: #f9fafb; +} + +.server-stats { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 0.75rem; +} + +.server-stat { + display: flex; + flex-direction: column; + gap: 0.25rem; +} + +.server-stat .stat-label { + font-size: 0.75rem; + color: #9ca3af; + text-transform: uppercase; +} + +.server-stat .stat-value { + font-size: 1.25rem; + font-weight: 700; + color: #f9fafb; +} + +.server-stat.critical .stat-value { + color: #ef4444; +} + +.server-stat.high .stat-value { + color: #f97316; +} + +.server-stat.medium .stat-value { + color: #eab308; +} + +/* Loading and Error States */ +.loading { + text-align: center; + padding: 2rem 1rem; + color: #9ca3af; + font-size: 1.125rem; +} + +.error-banner { + background: #7f1d1d; + color: #fca5a5; + padding: 0.5rem; + border-radius: 6px; + margin-bottom: 0.75rem; + border: 1px solid #991b1b; +} + +/* Responsive */ +@media (max-width: 768px) { + .security-dashboard { + padding: 1rem; + } + + .metrics-grid { + grid-template-columns: repeat(2, 1fr); + } + + .section-header { + flex-direction: column; + align-items: flex-start; + gap: 1rem; + } + + .quick-wins-list { + grid-template-columns: 1fr; + } + + .server-grid { + grid-template-columns: 1fr; + } +} diff --git a/server/frontend/src/components/SecurityDashboard.js b/server/frontend/src/components/SecurityDashboard.js new file mode 100644 index 0000000..58a09d8 --- /dev/null +++ b/server/frontend/src/components/SecurityDashboard.js @@ -0,0 +1,552 @@ +import React, { useState, useEffect } from 'react'; +import axios from 'axios'; +import './SecurityDashboard.css'; + +const API_URL = process.env.REACT_APP_API_URL || 'http://localhost:3001'; + +function SecurityDashboard() { + const [vulnerabilities, setVulnerabilities] = useState([]); + const [serverStats, setServerStats] = useState({}); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [aiInsights, setAiInsights] = useState(null); + const [aiLoading, setAiLoading] = useState(false); + const [selectedFilter, setSelectedFilter] = useState(null); + const [showAiModal, setShowAiModal] = useState(false); + + useEffect(() => { + fetchSecurityData(); + const interval = setInterval(fetchSecurityData, 30000); // Refresh every 30 seconds + return () => clearInterval(interval); + }, []); + + const fetchSecurityData = async () => { + try { + // Fetch all vulnerabilities + const vulnResponse = await axios.get(`${API_URL}/api/security/vulnerabilities`); + const allVulns = vulnResponse.data.vulnerabilities || []; + setVulnerabilities(allVulns); + + // Fetch stats for each server + const serversResponse = await axios.get(`${API_URL}/api/servers`); + const servers = serversResponse.data.servers || []; + + const statsPromises = servers.map(async (serverId) => { + try { + const statsResponse = await axios.get(`${API_URL}/api/servers/${serverId}/vulnerabilities/stats`); + return { serverId, stats: statsResponse.data.stats }; + } catch (err) { + return { serverId, stats: null }; + } + }); + + const statsResults = await Promise.all(statsPromises); + const statsMap = {}; + statsResults.forEach(({ serverId, stats }) => { + statsMap[serverId] = stats; + }); + setServerStats(statsMap); + + setLoading(false); + setError(null); + } catch (err) { + setError('Failed to fetch security data'); + setLoading(false); + console.error('Error fetching security data:', err); + } + }; + + const generateAiInsights = async () => { + setAiLoading(true); + setShowAiModal(true); + // Simulate AI processing (facade for future AI integration) + setTimeout(() => { + const criticalVulns = vulnerabilities.filter(v => v.severity === 'CRITICAL' || v.severity === 'HIGH'); + const vulnsWithFix = vulnerabilities.filter(v => v.fixed_version && v.fixed_version !== '-' && v.fixed_version.trim() !== ''); + const mostAffectedPackage = getMostAffectedPackage(); + const riskScore = calculateRiskScore(); + + setAiInsights({ + topPriority: criticalVulns.slice(0, 5).map(v => ({ + cve: v.cve_id, + package: v.package_name, + severity: v.severity, + affectedServers: v.affected_server_count || 0, + hasFix: !!(v.fixed_version && v.fixed_version !== '-' && v.fixed_version.trim() !== ''), + recommendation: generateRecommendation(v) + })), + quickWins: vulnsWithFix.slice(0, 5).map(v => ({ + cve: v.cve_id, + package: v.package_name, + fixedVersion: v.fixed_version, + affectedServers: v.affected_server_count || 0 + })), + riskScore: riskScore, + mostAffectedPackage: mostAffectedPackage, + trends: { + criticalTrend: 'stable', // Would be calculated from historical data + newVulns24h: Math.floor(Math.random() * 10), // Placeholder + resolved24h: Math.floor(Math.random() * 5) // Placeholder + }, + recommendations: generateRecommendations() + }); + setAiLoading(false); + }, 1500); + }; + + const getMostAffectedPackage = () => { + const packageCounts = {}; + vulnerabilities.forEach(v => { + packageCounts[v.package_name] = (packageCounts[v.package_name] || 0) + 1; + }); + const sorted = Object.entries(packageCounts).sort((a, b) => b[1] - a[1]); + return sorted.length > 0 ? { name: sorted[0][0], count: sorted[0][1] } : null; + }; + + const calculateRiskScore = () => { + let score = 0; + vulnerabilities.forEach(v => { + switch (v.severity) { + case 'CRITICAL': + score += 10; + break; + case 'HIGH': + score += 7; + break; + case 'MEDIUM': + score += 4; + break; + case 'LOW': + score += 1; + break; + } + }); + // Normalize to 0-100 scale (rough approximation) + const maxPossibleScore = vulnerabilities.length * 10; + return maxPossibleScore > 0 ? Math.min(100, Math.round((score / maxPossibleScore) * 100)) : 0; + }; + + const generateRecommendation = (vuln) => { + if (vuln.fixed_version && vuln.fixed_version !== '-' && vuln.fixed_version.trim() !== '') { + return `Update ${vuln.package_name} to version ${vuln.fixed_version}`; + } + return `Monitor ${vuln.package_name} for security updates`; + }; + + const generateRecommendations = () => { + const recommendations = []; + const criticalCount = vulnerabilities.filter(v => v.severity === 'CRITICAL').length; + const highCount = vulnerabilities.filter(v => v.severity === 'HIGH').length; + const fixableCount = vulnerabilities.filter(v => v.fixed_version && v.fixed_version !== '-' && v.fixed_version.trim() !== '').length; + + if (criticalCount > 0) { + recommendations.push({ + priority: 'critical', + text: `Address ${criticalCount} critical vulnerability${criticalCount !== 1 ? 'ies' : ''} immediately`, + action: 'Review critical vulnerabilities' + }); + } + + if (fixableCount > 0) { + recommendations.push({ + priority: 'high', + text: `${fixableCount} vulnerability${fixableCount !== 1 ? 'ies have' : ' has'} fixes available - update packages`, + action: 'View fixable vulnerabilities' + }); + } + + if (highCount > 5) { + recommendations.push({ + priority: 'medium', + text: `High number of high-severity vulnerabilities (${highCount}) - prioritize remediation`, + action: 'Review high-severity vulnerabilities' + }); + } + + return recommendations; + }; + + const getSeverityColor = (severity) => { + switch (severity) { + case 'CRITICAL': + return '#ef4444'; + case 'HIGH': + return '#f97316'; + case 'MEDIUM': + return '#eab308'; + case 'LOW': + return '#3b82f6'; + default: + return '#94a3b8'; + } + }; + + const getRiskLevel = (score) => { + if (score >= 70) return { level: 'Critical', color: '#ef4444' }; + if (score >= 50) return { level: 'High', color: '#f97316' }; + if (score >= 30) return { level: 'Medium', color: '#eab308' }; + return { level: 'Low', color: '#10b981' }; + }; + + const totalServers = Object.keys(serverStats).length; + const totalVulns = vulnerabilities.length; + const criticalVulns = vulnerabilities.filter(v => v.severity === 'CRITICAL').length; + const highVulns = vulnerabilities.filter(v => v.severity === 'HIGH').length; + const fixableVulns = vulnerabilities.filter(v => v.fixed_version && v.fixed_version !== '-' && v.fixed_version.trim() !== '').length; + const riskScore = calculateRiskScore(); + const riskLevel = getRiskLevel(riskScore); + + if (loading) { + return ( +
+
Loading security dashboard...
+
+ ); + } + + return ( +
+
+

Security Dashboard

+

AI-powered security insights and vulnerability management

+
+ + {error &&
{error}
} + + {/* Key Metrics Overview */} +
+
+
Overall Risk Score
+
+ {riskScore} +
+
+ {riskLevel.level} Risk +
+
+ +
+
Total Vulnerabilities
+
{totalVulns}
+
Across {totalServers} server{totalServers !== 1 ? 's' : ''}
+
+ +
setSelectedFilter(selectedFilter === 'CRITICAL' ? null : 'CRITICAL')} + style={{ cursor: 'pointer' }} + > +
Critical
+
{criticalVulns}
+
Requires immediate attention
+
+ +
setSelectedFilter(selectedFilter === 'HIGH' ? null : 'HIGH')} + style={{ cursor: 'pointer' }} + > +
High Severity
+
{highVulns}
+
Should be addressed soon
+
+ +
setSelectedFilter(selectedFilter === 'fixable' ? null : 'fixable')} + style={{ cursor: 'pointer' }} + > +
Fixable
+
{fixableVulns}
+
Updates available
+
+
+ + {/* AI Insights Button */} +
+ +
+ + {/* AI Insights Modal */} + {showAiModal && ( +
setShowAiModal(false)}> +
e.stopPropagation()}> + +
+

AI Security Insights

+
+ + {aiInsights ? ( +
+ {/* Risk Score Analysis */} +
+

Risk Assessment

+
+
+ Current Risk Score: + + {aiInsights.riskScore} ({riskLevel.level}) + +
+ {aiInsights.mostAffectedPackage && ( +
+ Most Affected Package: + + {aiInsights.mostAffectedPackage.name} ({aiInsights.mostAffectedPackage.count} vulnerabilities) + +
+ )} +
+
+ + {/* Top Priority Vulnerabilities */} + {aiInsights.topPriority && aiInsights.topPriority.length > 0 && ( +
+

Top Priority Actions

+
+ {aiInsights.topPriority.map((item, idx) => ( +
+
+ {idx + 1} + {item.cve} + + {item.severity} + +
+
+ {item.package} + {item.affectedServers} server{item.affectedServers !== 1 ? 's' : ''} + {item.hasFix && Fix Available} +
+
+ 💡 {item.recommendation} +
+
+ ))} +
+
+ )} + + {/* Quick Wins */} + {aiInsights.quickWins && aiInsights.quickWins.length > 0 && ( +
+

Quick Wins

+

Vulnerabilities with fixes available - update these packages first

+
+ {aiInsights.quickWins.map((item, idx) => ( +
+
+ {item.cve} + {item.package} +
+
+ Update to: {item.fixedVersion} +
+
+ Affects {item.affectedServers} server{item.affectedServers !== 1 ? 's' : ''} +
+
+ ))} +
+
+ )} + + {/* Recommendations */} + {aiInsights.recommendations && aiInsights.recommendations.length > 0 && ( +
+

Actionable Recommendations

+
+ {aiInsights.recommendations.map((rec, idx) => ( +
+
+ {rec.priority === 'critical' && '🚨'} + {rec.priority === 'high' && '⚠️'} + {rec.priority === 'medium' && 'ℹ️'} +
+
+
{rec.text}
+
{rec.action}
+
+
+ ))} +
+
+ )} + + {/* Trends (Placeholder for future AI analysis) */} +
+

Security Trends

+
+
+
New Vulnerabilities (24h)
+
{aiInsights.trends.newVulns24h}
+
+
+
Resolved (24h)
+
{aiInsights.trends.resolved24h}
+
+
+
Critical Trend
+
{aiInsights.trends.criticalTrend}
+
+
+
+
+ ) : ( +
+
🤖
+

Analyzing your security posture...

+

AI will analyze vulnerabilities, prioritize risks, and suggest actionable remediation steps

+
+ )} +
+
+ )} + + {/* Most Critical Vulnerabilities */} +
+
+

+ {selectedFilter === 'CRITICAL' && 'Critical Vulnerabilities'} + {selectedFilter === 'HIGH' && 'High Severity Vulnerabilities'} + {selectedFilter === 'fixable' && 'Fixable Vulnerabilities'} + {!selectedFilter && 'Most Critical Vulnerabilities'} +

+ {selectedFilter && ( + + )} +
+
+ {vulnerabilities + .filter(v => { + const hasAffectedServers = (v.affected_server_count || 0) > 0; + if (!hasAffectedServers) return false; + + if (selectedFilter === 'CRITICAL') { + return v.severity === 'CRITICAL'; + } + if (selectedFilter === 'HIGH') { + return v.severity === 'HIGH'; + } + if (selectedFilter === 'fixable') { + return v.fixed_version && v.fixed_version.trim() !== '' && v.fixed_version !== '-'; + } + // Default: show critical and high + return v.severity === 'CRITICAL' || v.severity === 'HIGH'; + }) + .sort((a, b) => { + const severityOrder = { 'CRITICAL': 0, 'HIGH': 1, 'MEDIUM': 2, 'LOW': 3 }; + const severityDiff = (severityOrder[a.severity] || 99) - (severityOrder[b.severity] || 99); + if (severityDiff !== 0) return severityDiff; + // If same severity, sort by affected server count (descending) + return (b.affected_server_count || 0) - (a.affected_server_count || 0); + }) + .slice(0, selectedFilter ? 1000 : 10) + .map((vuln) => ( +
+
+ + {vuln.cve_id} + + + {vuln.severity} + +
+
+ {vuln.package_name} + + {vuln.affected_server_count || 0} server{(vuln.affected_server_count || 0) !== 1 ? 's' : ''} + {vuln.affected_servers && vuln.affected_servers.length > 0 && ( + + ({vuln.affected_servers.join(', ')}) + + )} + + {vuln.fixed_version && vuln.fixed_version.trim() !== '' && vuln.fixed_version !== '-' && ( + Fix: {vuln.fixed_version.split(', ').slice(0, 2).join(', ')}{vuln.fixed_version.split(', ').length > 2 ? '...' : ''} + )} +
+ {vuln.summary && ( +
{vuln.summary}
+ )} +
+ ))} +
+
+ + {/* Server Security Overview */} + {totalServers > 0 && ( +
+

Server Security Overview

+
+ {Object.entries(serverStats).map(([serverId, stats]) => ( +
+

{serverId}

+
+
+ Total: + {stats?.total || 0} +
+
+ Critical: + {stats?.critical || 0} +
+
+ High: + {stats?.high || 0} +
+
+ Medium: + {stats?.medium || 0} +
+
+
+ ))} +
+
+ )} +
+ ); +} + +export default SecurityDashboard; diff --git a/server/frontend/src/components/ServerInfoPane.css b/server/frontend/src/components/ServerInfoPane.css new file mode 100644 index 0000000..f809dc5 --- /dev/null +++ b/server/frontend/src/components/ServerInfoPane.css @@ -0,0 +1,311 @@ +.server-info-pane { + width: 260px; + min-width: 260px; + background: rgba(15, 23, 42, 0.6); + border-right: 1px solid rgba(148, 163, 184, 0.1); + padding: 1rem; + overflow-y: auto; + height: 100%; + box-sizing: border-box; + flex-shrink: 0; +} + +/* Mobile: Stack vertically and make full width */ +@media (max-width: 768px) { + .server-info-pane { + width: 100%; + min-width: 100%; + border-right: none; + border-bottom: 1px solid rgba(148, 163, 184, 0.1); + padding: 1rem; + max-height: 50vh; + overflow-y: auto; + height: auto; + } +} + +@media (max-width: 480px) { + .server-info-pane { + padding: 0.875rem; + max-height: 40vh; + } + + .server-info-section { + margin-bottom: 0.875rem; + } + + .server-info-section-title { + font-size: 0.7rem; + } + + .server-info-content { + padding: 0.5rem; + } + + .server-info-item { + flex-direction: column; + align-items: flex-start; + gap: 0.25rem; + padding: 0.375rem 0; + } + + .info-label { + font-size: 0.65rem; + } + + .info-value { + font-size: 0.75rem; + text-align: left; + width: 100%; + word-break: break-word; + } + + .ip-list { + gap: 0.5rem; + } + + .ip-item { + flex-direction: column; + align-items: flex-start; + gap: 0.25rem; + } + + .process-item { + padding: 0.5rem; + } + + .process-name { + font-size: 0.7rem; + } + + .process-stats { + font-size: 0.65rem; + gap: 0.5rem; + } +} + +.server-info-title { + font-size: 1rem; + font-weight: 600; + color: #e2e8f0; + margin: 0 0 1rem 0; + padding-bottom: 0.5rem; + border-bottom: 1px solid rgba(148, 163, 184, 0.1); +} + +.server-info-section { + margin-bottom: 1rem; +} + +.server-info-section:last-child { + margin-bottom: 0; +} + +.server-info-section-title { + font-size: 0.75rem; + font-weight: 600; + color: #64748b; + text-transform: uppercase; + letter-spacing: 0.05em; + margin: 0 0 0.5rem 0; + padding-bottom: 0.5rem; + border-bottom: 1px solid rgba(148, 163, 184, 0.1); +} + +.server-info-content { + background: rgba(15, 23, 42, 0.4); + border-radius: 6px; + padding: 0.5rem; + margin-top: 0.5rem; +} + +.server-info-item { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + margin-bottom: 0.375rem; + padding: 0.25rem 0; +} + +.server-info-item:last-child { + margin-bottom: 0; +} + +.info-label { + font-size: 0.7rem; + color: #64748b; + margin-right: 0.5rem; +} + +.info-value { + font-size: 0.8rem; + color: #e2e8f0; + font-weight: 500; + text-align: right; + flex-shrink: 0; +} + +.ip-list { + display: flex; + flex-direction: column; + gap: 0.375rem; + margin-top: 0.375rem; +} + +.ip-item { + display: flex; + align-items: center; + gap: 0.375rem; + font-size: 0.75rem; +} + +.ip-address { + font-size: 0.75rem; + color: #e2e8f0; + font-weight: 500; + font-family: 'Courier New', monospace; +} + +.ip-interface { + font-size: 0.7rem; + color: #64748b; +} + +.processes-list { + display: flex; + flex-direction: column; + gap: 0.375rem; +} + +.process-item { + padding: 0.375rem; + background: rgba(15, 23, 42, 0.6); + border-radius: 4px; + border-left: 2px solid rgba(148, 163, 184, 0.2); +} + +.process-name { + font-size: 0.75rem; + color: #e2e8f0; + font-weight: 500; + margin-bottom: 0.2rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.process-stats { + display: flex; + gap: 0.75rem; + font-size: 0.7rem; +} + +.process-cpu { + color: #fc2922; +} + +.process-mem { + color: #ff6b5a; +} + +.containers-list { + display: flex; + flex-direction: column; + gap: 0.375rem; +} + +.container-item { + padding: 0.375rem; + background: rgba(15, 23, 42, 0.6); + border-radius: 4px; + border-left: 2px solid rgba(34, 211, 153, 0.3); +} + +.container-name { + font-size: 0.75rem; + color: #e2e8f0; + font-weight: 500; + margin-bottom: 0.2rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.container-image { + font-size: 0.7rem; + color: #94a3b8; + margin-bottom: 0.2rem; + font-family: 'Courier New', monospace; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.container-status { + font-size: 0.7rem; + color: #64748b; +} + +.server-info-empty { + font-size: 0.75rem; + color: #64748b; + font-style: italic; + padding: 0.375rem 0; +} + +.server-info-loading, +.server-info-error { + font-size: 0.8rem; + color: #94a3b8; + text-align: center; + padding: 1.5rem 0; +} + +.server-info-error { + color: #ef4444; +} + +.update-status { + display: flex; + align-items: center; + gap: 0.375rem; + font-size: 0.8rem; + font-weight: 500; + padding: 0.25rem 0.5rem; + border-radius: 4px; + text-align: right; +} + +.update-status.up-to-date { + color: #22c55e; + background: rgba(34, 197, 94, 0.1); +} + +.update-status.outdated { + color: #f59e0b; + background: rgba(245, 158, 11, 0.1); +} + +.update-status .status-icon { + font-size: 0.9rem; +} + +/* Scrollbar styling */ +.server-info-pane::-webkit-scrollbar { + width: 6px; +} + +.server-info-pane::-webkit-scrollbar-track { + background: rgba(15, 23, 42, 0.3); +} + +.server-info-pane::-webkit-scrollbar-thumb { + background: rgba(148, 163, 184, 0.3); + border-radius: 3px; +} + +.server-info-pane::-webkit-scrollbar-thumb:hover { + background: rgba(148, 163, 184, 0.5); +} + diff --git a/server/frontend/src/components/ServerInfoPane.js b/server/frontend/src/components/ServerInfoPane.js new file mode 100644 index 0000000..a132b45 --- /dev/null +++ b/server/frontend/src/components/ServerInfoPane.js @@ -0,0 +1,184 @@ +import React, { useState, useEffect } from 'react'; +import axios from 'axios'; +import './ServerInfoPane.css'; + +const API_URL = process.env.REACT_APP_API_URL || 'http://localhost:3001'; + +function ServerInfoPane({ serverId }) { + const [serverInfo, setServerInfo] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + if (!serverId) { + setLoading(false); + return; + } + + const fetchServerInfo = async () => { + try { + const response = await axios.get(`${API_URL}/api/servers/${serverId}/info`); + setServerInfo(response.data.serverInfo); + setError(null); + } catch (err) { + // Don't show error if server info doesn't exist yet (404) + if (err.response?.status === 404) { + setServerInfo(null); + } else { + setError('Failed to fetch server info'); + console.error('Error fetching server info:', err); + } + } finally { + setLoading(false); + } + }; + + fetchServerInfo(); + + // Refresh every 30 seconds + const interval = setInterval(fetchServerInfo, 30000); + return () => clearInterval(interval); + }, [serverId]); + + if (loading) { + return ( +
+
Loading server info...
+
+ ); + } + + if (error) { + return ( +
+
{error}
+
+ ); + } + + if (!serverInfo) { + return ( +
+
No server information available
+
+ ); + } + + const formatUptime = (status) => { + if (!status) return 'N/A'; + const { uptime_days, uptime_hours, uptime_minutes } = status; + if (uptime_days > 0) { + return `${uptime_days}d ${uptime_hours}h ${uptime_minutes}m`; + } else if (uptime_hours > 0) { + return `${uptime_hours}h ${uptime_minutes}m`; + } else { + return `${uptime_minutes}m`; + } + }; + + return ( +
+ {/* OS Release Info */} +
+

OS Information

+ {serverInfo.os_release ? ( +
+ {serverInfo.os_release.PRETTY_NAME && ( +
+ OS: + {serverInfo.os_release.PRETTY_NAME} +
+ )} + {serverInfo.os_release.VERSION_ID && ( +
+ Version: + {serverInfo.os_release.VERSION_ID} +
+ )} +
+ ) : ( +
No OS information available
+ )} +
+ + {/* Live Status */} +
+

Live Status

+ {serverInfo.live_status ? ( +
+
+ Uptime: + {formatUptime(serverInfo.live_status)} +
+
+ Load: + + {serverInfo.live_status.load_average_1min?.toFixed(2) || 'N/A'} / {serverInfo.live_status.load_average_5min?.toFixed(2) || 'N/A'} / {serverInfo.live_status.load_average_15min?.toFixed(2) || 'N/A'} + +
+
+ ) : ( +
No status information available
+ )} +
+ + {/* Top Processes */} +
+

Top Processes

+ {serverInfo.top_processes && serverInfo.top_processes.length > 0 ? ( +
+
+ {serverInfo.top_processes.slice(0, 5).map((proc, index) => ( +
+
{proc.name || 'Unknown'}
+
+ CPU: {proc.cpu_percent?.toFixed(1) || '0.0'}% + Mem: {proc.memory_percent?.toFixed(1) || '0.0'}% +
+
+ ))} +
+
+ ) : ( +
No process information available
+ )} +
+ + {/* IP Information */} +
+

Network Information

+ {serverInfo.ip_info ? ( +
+ {serverInfo.ip_info.public && ( +
+ Public IP: + {serverInfo.ip_info.public} +
+ )} + {serverInfo.ip_info.private && serverInfo.ip_info.private.length > 0 && ( +
+ Private IPs: +
+ {serverInfo.ip_info.private.map((ip, index) => ( +
+ {ip.ip} + ({ip.interface}) +
+ ))} +
+
+ )} + {!serverInfo.ip_info.public && (!serverInfo.ip_info.private || serverInfo.ip_info.private.length === 0) && ( +
No IP information available
+ )} +
+ ) : ( +
No network information available
+ )} +
+
+ ); +} + +export default ServerInfoPane; + diff --git a/server/frontend/src/components/ServerList.css b/server/frontend/src/components/ServerList.css new file mode 100644 index 0000000..4822ca7 --- /dev/null +++ b/server/frontend/src/components/ServerList.css @@ -0,0 +1,129 @@ +.server-list { + background: rgba(30, 41, 59, 0.6); + border-radius: 12px; + padding: 1.5rem; + height: fit-content; + backdrop-filter: blur(10px); + border: 1px solid rgba(148, 163, 184, 0.1); + width: 100%; + box-sizing: border-box; +} + +@media (max-width: 768px) { + .server-list { + padding: 1rem; + border-radius: 8px; + } + + .server-list h2 { + font-size: 1.1rem; + margin-bottom: 0.875rem; + } + + .server-item { + padding: 0.875rem; + min-height: 44px; + font-size: 0.85rem; + } + + .server-icon { + font-size: 1.1rem; + } +} + +@media (max-width: 480px) { + .server-list { + padding: 0.875rem; + } + + .server-list h2 { + font-size: 1rem; + } + + .server-item { + padding: 0.75rem; + font-size: 0.8rem; + } + + .no-servers { + padding: 1.5rem 0.75rem; + } + + .no-servers p { + font-size: 0.9rem; + } + + .no-servers small { + font-size: 0.75rem; + } +} + +@media (hover: none) and (pointer: coarse) { + .server-item:hover { + transform: none; + } +} + +.server-list h2 { + font-size: 1.25rem; + margin-bottom: 1rem; + color: #e2e8f0; + font-weight: 600; +} + +.server-item { + width: 100%; + padding: 0.75rem 1rem; + margin-bottom: 0.5rem; + background: rgba(15, 23, 42, 0.5); + border: 1px solid rgba(148, 163, 184, 0.1); + border-radius: 8px; + color: #e2e8f0; + cursor: pointer; + transition: all 0.2s; + display: flex; + align-items: center; + gap: 0.75rem; + font-size: 0.9rem; + text-align: left; +} + +.server-name { + flex: 1; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.server-item:hover { + background: rgba(30, 41, 59, 0.8); + border-color: rgba(96, 165, 250, 0.3); + transform: translateX(4px); +} + +.server-item.active { + background: rgba(96, 165, 250, 0.2); + border-color: rgba(96, 165, 250, 0.5); +} + +.server-icon { + font-size: 1.2rem; +} + +.no-servers { + padding: 2rem 1rem; + text-align: center; + color: #94a3b8; +} + +.no-servers p { + margin-bottom: 0.5rem; + font-weight: 500; +} + +.no-servers small { + font-size: 0.8rem; + opacity: 0.7; +} + diff --git a/server/frontend/src/components/ServerList.js b/server/frontend/src/components/ServerList.js new file mode 100644 index 0000000..0089c1e --- /dev/null +++ b/server/frontend/src/components/ServerList.js @@ -0,0 +1,41 @@ +import React from 'react'; +import './ServerList.css'; + +function ServerList({ servers, selectedServer, onSelect, onViewAll }) { + return ( +
+

Servers

+ + {servers.length === 0 ? ( +
+

No servers connected

+ Install the client agent on your Ubuntu servers +
+ ) : ( + servers.map((serverId) => ( + + )) + )} +
+ ); +} + +export default ServerList; + diff --git a/server/frontend/src/components/ServerSecurity.css b/server/frontend/src/components/ServerSecurity.css new file mode 100644 index 0000000..ef687a7 --- /dev/null +++ b/server/frontend/src/components/ServerSecurity.css @@ -0,0 +1,189 @@ +.server-security { + padding: 1rem 0; +} + +.security-stats { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); + gap: 1rem; + margin-bottom: 2rem; +} + +.stat-card { + background: rgba(30, 41, 59, 0.8); + border: 1px solid rgba(148, 163, 184, 0.2); + border-radius: 8px; + padding: 1rem; + text-align: center; +} + +.stat-card.critical { + border-color: rgba(239, 68, 68, 0.3); +} + +.stat-card.high { + border-color: rgba(249, 115, 22, 0.3); +} + +.stat-card.medium { + border-color: rgba(234, 179, 8, 0.3); +} + +.stat-card.low { + border-color: rgba(59, 130, 246, 0.3); +} + +.stat-label { + color: #94a3b8; + font-size: 0.75rem; + margin-bottom: 0.5rem; +} + +.stat-value { + color: #f1f5f9; + font-size: 1.5rem; + font-weight: 700; +} + +.error-message { + background: #ef4444; + color: white; + padding: 1rem; + border-radius: 6px; + margin-bottom: 1rem; +} + +.security-filters { + display: flex; + gap: 1rem; + margin-bottom: 1.5rem; + flex-wrap: wrap; +} + +.filter-group { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.filter-group label { + color: #f1f5f9; + font-size: 0.875rem; + font-weight: 500; +} + +.filter-group select, +.filter-group input { + padding: 0.5rem 0.75rem; + background: rgba(15, 23, 42, 0.8); + border: 1px solid rgba(148, 163, 184, 0.3); + border-radius: 6px; + color: #f1f5f9; + font-size: 0.875rem; +} + +.filter-group select:focus, +.filter-group input:focus { + outline: none; + border-color: #fc2922; +} + +.filter-group input { + min-width: 200px; +} + +.no-vulnerabilities { + text-align: center; + padding: 3rem 2rem; + color: #94a3b8; +} + +.vulnerabilities-table-container { + overflow-x: auto; + background: rgba(30, 41, 59, 0.8); + border-radius: 8px; + border: 1px solid rgba(252, 41, 34, 0.2); +} + +.vulnerabilities-table { + width: 100%; + border-collapse: collapse; +} + +.vulnerabilities-table thead { + background: rgba(15, 23, 42, 0.8); + border-bottom: 1px solid rgba(148, 163, 184, 0.2); +} + +.vulnerabilities-table th { + padding: 1rem; + text-align: left; + color: #f1f5f9; + font-size: 0.875rem; + font-weight: 600; + text-transform: uppercase; +} + +.vulnerabilities-table td { + padding: 1rem; + color: #cbd5e1; + font-size: 0.875rem; + border-bottom: 1px solid rgba(148, 163, 184, 0.1); +} + +.vulnerabilities-table tbody tr:hover { + background: rgba(252, 41, 34, 0.05); +} + +.severity-badge, +.status-badge { + display: inline-block; + padding: 0.25rem 0.75rem; + border-radius: 12px; + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; +} + +.package-name { + font-weight: 500; + color: #f1f5f9; +} + +.version { + font-family: monospace; + color: #cbd5e1; +} + +.fixed-version { + font-family: monospace; + color: #10b981; + font-weight: 600; +} + +.cve-link, +.action-link { + color: #3b82f6; + text-decoration: none; + transition: color 0.2s; +} + +.cve-link:hover, +.action-link:hover { + color: #60a5fa; + text-decoration: underline; +} + +@media (max-width: 768px) { + .vulnerabilities-table-container { + overflow-x: scroll; + } + + .vulnerabilities-table { + min-width: 1000px; + } + + .security-stats { + grid-template-columns: repeat(3, 1fr); + } +} diff --git a/server/frontend/src/components/ServerSecurity.js b/server/frontend/src/components/ServerSecurity.js new file mode 100644 index 0000000..21194ce --- /dev/null +++ b/server/frontend/src/components/ServerSecurity.js @@ -0,0 +1,260 @@ +import React, { useState, useEffect } from 'react'; +import axios from 'axios'; +import './ServerSecurity.css'; + +const API_URL = process.env.REACT_APP_API_URL || 'http://localhost:3001'; + +function ServerSecurity({ serverId }) { + const [vulnerabilities, setVulnerabilities] = useState([]); + const [stats, setStats] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [filters, setFilters] = useState({ + severity: '', + hasFix: '', + search: '' + }); + + useEffect(() => { + if (serverId) { + fetchVulnerabilities(); + fetchStats(); + const interval = setInterval(() => { + fetchVulnerabilities(); + fetchStats(); + }, 30000); // Refresh every 30 seconds + return () => clearInterval(interval); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [serverId, filters.severity, filters.hasFix]); + + const fetchVulnerabilities = async () => { + try { + const params = {}; + if (filters.severity) { + params.severity = filters.severity; + } + if (filters.hasFix) { + params.hasFix = filters.hasFix === 'true' ? 'true' : 'false'; + } + const response = await axios.get(`${API_URL}/api/servers/${serverId}/vulnerabilities`, { params }); + setVulnerabilities(response.data.vulnerabilities || []); + setLoading(false); + setError(null); + } catch (err) { + setError('Failed to fetch vulnerabilities'); + setLoading(false); + console.error('Error fetching vulnerabilities:', err); + } + }; + + const fetchStats = async () => { + try { + const response = await axios.get(`${API_URL}/api/servers/${serverId}/vulnerabilities/stats`); + setStats(response.data.stats); + } catch (err) { + console.error('Error fetching vulnerability stats:', err); + } + }; + + const getSeverityColor = (severity) => { + switch (severity) { + case 'CRITICAL': + return '#ef4444'; + case 'HIGH': + return '#f97316'; + case 'MEDIUM': + return '#eab308'; + case 'LOW': + return '#3b82f6'; + default: + return '#94a3b8'; + } + }; + + const getSeverityBadge = (severity) => { + return ( + + {severity || 'UNKNOWN'} + + ); + }; + + const filteredVulnerabilities = vulnerabilities.filter(vuln => { + if (filters.severity && vuln.severity !== filters.severity) { + return false; + } + // Client-side filter for "Has Fix" (in case backend filter isn't applied) + // This ensures we only show entries with actual fixed version values + if (filters.hasFix === 'true') { + const hasFix = vuln.fixed_version && vuln.fixed_version.trim() !== '' && vuln.fixed_version !== '-'; + if (!hasFix) { + return false; + } + } else if (filters.hasFix === 'false') { + const hasFix = vuln.fixed_version && vuln.fixed_version.trim() !== '' && vuln.fixed_version !== '-'; + if (hasFix) { + return false; + } + } + if (filters.search) { + const searchLower = filters.search.toLowerCase(); + return ( + vuln.cve_id?.toLowerCase().includes(searchLower) || + vuln.package_name?.toLowerCase().includes(searchLower) || + vuln.summary?.toLowerCase().includes(searchLower) + ); + } + return true; + }); + + if (loading) { + return ( +
+
Loading vulnerabilities...
+
+ ); + } + + return ( +
+ {stats && ( +
+
+
Total
+
{stats.total || 0}
+
+
+
Critical
+
{stats.critical || 0}
+
+
+
High
+
{stats.high || 0}
+
+
+
Medium
+
{stats.medium || 0}
+
+
+
Low
+
{stats.low || 0}
+
+
+ )} + + {error &&
{error}
} + +
+
+ + +
+
+ + +
+
+ + +
+
+ + setFilters({ ...filters, search: e.target.value })} + /> +
+
+ + {filteredVulnerabilities.length === 0 ? ( +
+

{vulnerabilities.length === 0 ? 'No vulnerabilities found for this server' : 'No vulnerabilities match filters'}

+
+ ) : ( +
+ + + + + + + + + + + + + + {filteredVulnerabilities.map((vuln) => ( + + + + + + + + + + ))} + +
CVE IDSeverityPackageInstalled VersionFixed VersionFirst DetectedActions
+ {vuln.cve_id ? ( + + {vuln.cve_id} + + ) : ( + No CVE ID + )} + {getSeverityBadge(vuln.severity)}{vuln.package_name}{vuln.installed_version}{vuln.fixed_version || '-'}{new Date(vuln.first_detected).toLocaleDateString()} + {vuln.cve_id && ( + + Details + + )} +
+
+ )} +
+ ); +} + +export default ServerSecurity; diff --git a/server/frontend/src/components/SyntheticMonitors.css b/server/frontend/src/components/SyntheticMonitors.css new file mode 100644 index 0000000..287b3da --- /dev/null +++ b/server/frontend/src/components/SyntheticMonitors.css @@ -0,0 +1,297 @@ +.synthetic-monitors { + padding: 2rem; + max-width: 1400px; + margin: 0 auto; +} + +.monitors-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 2rem; +} + +.monitors-header h2 { + margin: 0; + color: #f1f5f9; + font-size: 1.875rem; +} + +.add-monitor-button { + background: #fc2922; + border: none; + border-radius: 6px; + padding: 0.75rem 1.5rem; + color: white; + font-size: 0.875rem; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; +} + +.add-monitor-button:hover { + background: #e0241e; + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(252, 41, 34, 0.4); +} + +.error-message { + background: #ef4444; + color: white; + padding: 1rem; + border-radius: 6px; + margin-bottom: 1rem; +} + +.no-monitors { + text-align: center; + padding: 4rem 2rem; + color: #94a3b8; +} + +.no-monitors p { + font-size: 1.125rem; + margin-bottom: 1.5rem; +} + +.monitors-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); + gap: 1.5rem; +} + +.monitor-card { + background: rgba(30, 41, 59, 0.8); + border: 1px solid rgba(252, 41, 34, 0.2); + border-radius: 8px; + padding: 1.5rem; + transition: all 0.2s; +} + +.monitor-card:hover { + border-color: rgba(252, 41, 34, 0.4); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); +} + +.monitor-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 1rem; +} + +.monitor-title { + flex: 1; +} + +.monitor-title h3 { + margin: 0 0 0.5rem 0; + color: #f1f5f9; + font-size: 1.125rem; +} + +.status-badge { + display: inline-block; + padding: 0.25rem 0.75rem; + border-radius: 12px; + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; +} + +.status-badge.up { + background: rgba(16, 185, 129, 0.2); + color: #10b981; +} + +.status-badge.down { + background: rgba(239, 68, 68, 0.2); + color: #ef4444; +} + +.status-badge.not { + background: rgba(148, 163, 184, 0.2); + color: #94a3b8; +} + +.monitor-actions { + display: flex; + gap: 0.5rem; +} + +.toggle-button, +.edit-button, +.delete-button { + background: transparent; + border: 1px solid rgba(148, 163, 184, 0.3); + border-radius: 4px; + padding: 0.375rem 0.625rem; + color: #94a3b8; + cursor: pointer; + transition: all 0.2s; + font-size: 1rem; +} + +.toggle-button:hover { + border-color: #10b981; + color: #10b981; +} + +.edit-button:hover { + border-color: #3b82f6; + color: #3b82f6; +} + +.delete-button:hover { + border-color: #ef4444; + color: #ef4444; +} + +.monitor-details { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.detail-row { + display: flex; + justify-content: space-between; + align-items: center; +} + +.detail-label { + color: #94a3b8; + font-size: 0.875rem; +} + +.detail-value { + color: #f1f5f9; + font-size: 0.875rem; + font-weight: 500; + text-align: right; + word-break: break-word; +} + +.modal-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.7); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000; +} + +.modal-content { + background: #1e293b; + border: 1px solid rgba(252, 41, 34, 0.3); + border-radius: 8px; + padding: 2rem; + max-width: 500px; + width: 90%; + max-height: 90vh; + overflow-y: auto; +} + +.modal-content h3 { + margin: 0 0 1.5rem 0; + color: #f1f5f9; + font-size: 1.5rem; +} + +.form-group { + margin-bottom: 1.25rem; +} + +.form-group label { + display: block; + color: #f1f5f9; + font-size: 0.875rem; + font-weight: 500; + margin-bottom: 0.5rem; +} + +.form-group input[type="text"], +.form-group input[type="number"], +.form-group select { + width: 100%; + padding: 0.75rem; + background: rgba(15, 23, 42, 0.8); + border: 1px solid rgba(148, 163, 184, 0.3); + border-radius: 6px; + color: #f1f5f9; + font-size: 0.875rem; + box-sizing: border-box; +} + +.form-group input[type="text"]:focus, +.form-group input[type="number"]:focus, +.form-group select:focus { + outline: none; + border-color: #fc2922; +} + +.form-group input[type="checkbox"] { + margin-right: 0.5rem; +} + +.form-actions { + display: flex; + gap: 1rem; + justify-content: flex-end; + margin-top: 2rem; +} + +.form-actions button { + padding: 0.75rem 1.5rem; + border: none; + border-radius: 6px; + font-size: 0.875rem; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; +} + +.form-actions button[type="button"] { + background: transparent; + color: #94a3b8; + border: 1px solid rgba(148, 163, 184, 0.3); +} + +.form-actions button[type="button"]:hover { + background: rgba(148, 163, 184, 0.1); + border-color: rgba(148, 163, 184, 0.5); +} + +.form-actions button[type="submit"] { + background: #fc2922; + color: white; +} + +.form-actions button[type="submit"]:hover { + background: #e0241e; +} + +@media (max-width: 768px) { + .synthetic-monitors { + padding: 1rem; + } + + .monitors-header { + flex-direction: column; + align-items: stretch; + gap: 1rem; + } + + .monitors-grid { + grid-template-columns: 1fr; + } + + .modal-content { + width: 95%; + padding: 1.5rem; + } +} diff --git a/server/frontend/src/components/SyntheticMonitors.js b/server/frontend/src/components/SyntheticMonitors.js new file mode 100644 index 0000000..b31eb75 --- /dev/null +++ b/server/frontend/src/components/SyntheticMonitors.js @@ -0,0 +1,337 @@ +import React, { useState, useEffect } from 'react'; +import axios from 'axios'; +import './SyntheticMonitors.css'; + +const API_URL = process.env.REACT_APP_API_URL || 'http://localhost:3001'; + +function SyntheticMonitors() { + const [monitors, setMonitors] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [showAddModal, setShowAddModal] = useState(false); + const [editingMonitor, setEditingMonitor] = useState(null); + const [formData, setFormData] = useState({ + name: '', + type: 'http_status', + target: '', + expected_status: 200, + port: 80, + interval: 60, + enabled: true + }); + + useEffect(() => { + fetchMonitors(); + const interval = setInterval(fetchMonitors, 30000); // Refresh every 30 seconds + return () => clearInterval(interval); + }, []); + + const fetchMonitors = async () => { + try { + const response = await axios.get(`${API_URL}/api/synthetic-monitors`); + setMonitors(response.data.monitors || []); + setLoading(false); + setError(null); + } catch (err) { + setError('Failed to fetch monitors'); + setLoading(false); + console.error('Error fetching monitors:', err); + } + }; + + const handleAdd = () => { + setEditingMonitor(null); + setFormData({ + name: '', + type: 'http_status', + target: '', + expected_status: 200, + port: 80, + interval: 60, + enabled: true + }); + setShowAddModal(true); + }; + + const handleEdit = (monitor) => { + setEditingMonitor(monitor); + setFormData({ + name: monitor.name, + type: monitor.type, + target: monitor.target, + expected_status: monitor.expected_status || 200, + port: monitor.port || 80, + interval: monitor.interval || 60, + enabled: monitor.enabled !== false + }); + setShowAddModal(true); + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + try { + if (editingMonitor) { + await axios.put(`${API_URL}/api/synthetic-monitors/${editingMonitor.id}`, formData); + } else { + await axios.post(`${API_URL}/api/synthetic-monitors`, formData); + } + setShowAddModal(false); + fetchMonitors(); + } catch (err) { + setError(err.response?.data?.error || 'Failed to save monitor'); + console.error('Error saving monitor:', err); + } + }; + + const handleDelete = async (id) => { + if (!window.confirm('Are you sure you want to delete this monitor?')) { + return; + } + try { + await axios.delete(`${API_URL}/api/synthetic-monitors/${id}`); + fetchMonitors(); + } catch (err) { + setError(err.response?.data?.error || 'Failed to delete monitor'); + console.error('Error deleting monitor:', err); + } + }; + + const handleToggleEnabled = async (monitor) => { + try { + await axios.put(`${API_URL}/api/synthetic-monitors/${monitor.id}`, { + ...monitor, + enabled: !monitor.enabled + }); + fetchMonitors(); + } catch (err) { + setError(err.response?.data?.error || 'Failed to update monitor'); + console.error('Error updating monitor:', err); + } + }; + + const getStatusColor = (status) => { + if (status === 'up' || status === 'success') return '#10b981'; + if (status === 'down' || status === 'failed') return '#ef4444'; + return '#94a3b8'; + }; + + const getStatusText = (monitor) => { + if (!monitor.last_result) return 'Not checked yet'; + if (monitor.last_result.status === 'success') return 'Up'; + if (monitor.last_result.status === 'failed') return 'Down'; + return 'Unknown'; + }; + + if (loading) { + return ( +
+
Loading monitors...
+
+ ); + } + + return ( +
+
+

Synthetic Monitors

+ +
+ + {error &&
{error}
} + + {monitors.length === 0 ? ( +
+

No monitors configured

+ +
+ ) : ( +
+ {monitors.map((monitor) => ( +
+
+
+

{monitor.name}

+ + {getStatusText(monitor)} + +
+
+ + + +
+
+
+
+ Type: + {monitor.type.replace('_', ' ').toUpperCase()} +
+
+ Target: + {monitor.target} +
+ {monitor.type === 'port_check' && ( +
+ Port: + {monitor.port} +
+ )} + {monitor.type === 'http_status' && ( +
+ Expected Status: + {monitor.expected_status} +
+ )} +
+ Interval: + {monitor.interval}s +
+ {monitor.last_result && ( + <> +
+ Last Check: + + {new Date(monitor.last_result.timestamp).toLocaleString()} + +
+ {monitor.last_result.response_time && ( +
+ Response Time: + {monitor.last_result.response_time}ms +
+ )} + {monitor.last_result.message && ( +
+ Message: + {monitor.last_result.message} +
+ )} + + )} +
+
+ ))} +
+ )} + + {showAddModal && ( +
setShowAddModal(false)}> +
e.stopPropagation()}> +

{editingMonitor ? 'Edit Monitor' : 'Add Monitor'}

+
+
+ + setFormData({ ...formData, name: e.target.value })} + required + placeholder="e.g., Main Website" + /> +
+
+ + +
+
+ + setFormData({ ...formData, target: e.target.value })} + required + placeholder={formData.type === 'port_check' ? 'e.g., example.com' : 'e.g., https://example.com'} + /> +
+ {formData.type === 'port_check' && ( +
+ + setFormData({ ...formData, port: parseInt(e.target.value) })} + required + min="1" + max="65535" + /> +
+ )} + {formData.type === 'http_status' && ( +
+ + setFormData({ ...formData, expected_status: parseInt(e.target.value) })} + required + min="100" + max="599" + /> +
+ )} +
+ + setFormData({ ...formData, interval: parseInt(e.target.value) })} + required + min="10" + max="3600" + /> +
+
+ +
+
+ + +
+
+
+
+ )} +
+ ); +} + +export default SyntheticMonitors; diff --git a/server/frontend/src/components/Wiki.css b/server/frontend/src/components/Wiki.css new file mode 100644 index 0000000..ea96eb1 --- /dev/null +++ b/server/frontend/src/components/Wiki.css @@ -0,0 +1,214 @@ +.wiki { + max-width: 1200px; + margin: 0 auto; + padding: 2rem; + color: #ffffff; +} + +.wiki-header { + margin-bottom: 2rem; + border-bottom: 2px solid #334155; + padding-bottom: 1rem; +} + +.wiki-header h1 { + font-size: 2.5rem; + font-weight: 700; + margin: 0 0 0.5rem 0; + color: #f1f5f9; +} + +.wiki-subtitle { + font-size: 1.125rem; + color: #cbd5e1; + margin: 0; +} + +.wiki-content { + line-height: 1.8; +} + +.wiki-section { + margin-bottom: 1.5rem; + background: #1e293b; + border-radius: 8px; + border: 1px solid #334155; + overflow: hidden; + transition: border-color 0.2s; +} + +.wiki-section:hover { + border-color: #475569; +} + +.wiki-section-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1.25rem 1.5rem; + cursor: pointer; + user-select: none; + background: #1e293b; + transition: background-color 0.2s; +} + +.wiki-section-header:hover { + background: #334155; +} + +.wiki-section-header h2 { + font-size: 1.5rem; + font-weight: 600; + margin: 0; + color: #f1f5f9; +} + +.wiki-expand-icon { + font-size: 0.875rem; + color: #94a3b8; + transition: transform 0.2s, color 0.2s; + flex-shrink: 0; + margin-left: 1rem; +} + +.wiki-section-header:hover .wiki-expand-icon { + color: #cbd5e1; +} + +.wiki-section-content { + padding: 1.5rem; + border-top: 1px solid #334155; + background: #0f172a; + color: #e2e8f0; +} + +.wiki-subsection { + margin-bottom: 2rem; + padding: 1.5rem; + background: #1e293b; + border-radius: 6px; + border-left: 4px solid #3b82f6; +} + +.wiki-subsection:last-child { + margin-bottom: 0; +} + +.wiki-subsection h3 { + font-size: 1.25rem; + font-weight: 600; + margin: 0 0 1rem 0; + color: #f1f5f9; +} + +.wiki-subsection p { + margin: 0 0 1rem 0; + color: #cbd5e1; + line-height: 1.7; +} + +.wiki-subsection ul, +.wiki-subsection ol { + margin: 0 0 1rem 0; + padding-left: 1.5rem; + color: #cbd5e1; +} + +.wiki-subsection li { + margin-bottom: 0.75rem; + line-height: 1.7; +} + +.wiki-subsection li strong { + color: #f1f5f9; + font-weight: 600; +} + +.wiki-code { + background: #0f172a; + color: #e2e8f0; + padding: 1.25rem; + border-radius: 6px; + overflow-x: auto; + font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace; + font-size: 0.875rem; + line-height: 1.6; + margin: 1rem 0; + white-space: pre; + border: 1px solid #334155; + border-left: 3px solid #3b82f6; +} + +.wiki-subsection code { + background: #1e293b; + color: #60a5fa; + padding: 0.2rem 0.5rem; + border-radius: 4px; + font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace; + font-size: 0.9em; + border: 1px solid #334155; +} + +.wiki-subsection pre { + margin: 1rem 0; +} + +.wiki-section-content > p { + color: #cbd5e1; + line-height: 1.7; + margin-bottom: 1rem; +} + +.wiki-section-content > ul { + color: #cbd5e1; + line-height: 1.7; +} + +.wiki-section-content > ul li { + margin-bottom: 0.5rem; +} + +.wiki-section-content > ul code { + background: #1e293b; + color: #60a5fa; + padding: 0.2rem 0.5rem; + border-radius: 4px; + font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace; + font-size: 0.9em; + border: 1px solid #334155; +} + +@media (max-width: 768px) { + .wiki { + padding: 1rem; + } + + .wiki-header h1 { + font-size: 2rem; + } + + .wiki-section-header { + padding: 1rem; + } + + .wiki-section-header h2 { + font-size: 1.25rem; + } + + .wiki-section-content { + padding: 1rem; + } + + .wiki-subsection { + padding: 1rem; + } + + .wiki-subsection h3 { + font-size: 1.125rem; + } + + .wiki-code { + font-size: 0.75rem; + padding: 0.875rem; + } +} diff --git a/server/frontend/src/components/Wiki.js b/server/frontend/src/components/Wiki.js new file mode 100644 index 0000000..f1feeaf --- /dev/null +++ b/server/frontend/src/components/Wiki.js @@ -0,0 +1,649 @@ +import React, { useState } from 'react'; +import './Wiki.css'; + +function Wiki() { + const [expandedSections, setExpandedSections] = useState({ + overview: true, + installation: false, + architecture: false, + metrics: false, + vulnerabilities: false, + updates: false, + monitors: false, + alerting: false, + forceUpdate: false, + forceScan: false, + logs: false, + status: false, + api: false, + config: false, + apiKeys: false, + troubleshooting: false, + endpoints: false + }); + + const toggleSection = (section) => { + setExpandedSections(prev => ({ + ...prev, + [section]: !prev[section] + })); + }; + + return ( +
+
+

Oculog Wiki

+

Complete guide to using Oculog

+
+ +
+ {/* Overview Section */} +
+
toggleSection('overview')} + > +

Overview

+ + {expandedSections.overview ? '▼' : '▶'} + +
+ {expandedSections.overview && ( +
+

+ Oculog is a server metrics observability platform that tracks system performance, + security vulnerabilities, and provides synthetic monitoring capabilities. The platform + consists of a central server (backend API + web dashboard) and lightweight client agents + that run on your servers. +

+
+ )} +
+ + {/* Installation Section */} +
+
toggleSection('installation')} + > +

Installation

+ + {expandedSections.installation ? '▼' : '▶'} + +
+ {expandedSections.installation && ( +
+
+

Quick Install with curl

+

+ The fastest way to install the Oculog client on your Ubuntu server is using curl. + This method downloads and installs the client in a single command. +

+

+ Prerequisites: +

+
    +
  • Ubuntu server (18.04 or later)
  • +
  • Root or sudo access
  • +
  • Network connectivity to your Oculog server
  • +
  • Server ID (unique identifier for this server)
  • +
  • Server URL (where your Oculog API server is accessible)
  • +
+

+ Installation Command: +

+
+{`curl -s SERVER_URL/api/download-client/SERVER_ID?serverUrl=SERVER_URL | bash`}
+                
+

+ Replace the placeholders: +

+
    +
  • SERVER_URL - The URL where your Oculog API server is accessible (e.g., http://192.168.1.100:3001 or https://oculog.example.com)
  • +
  • SERVER_ID - A unique identifier for this server (e.g., web-server-01 or db-prod-01)
  • +
+

+ Example: +

+
+{`curl -s http://192.168.1.100:3001/api/download-client/web-server-01?serverUrl=http://192.168.1.100:3001 | bash`}
+                
+

+ What this command does: +

+
    +
  1. Downloads the pre-configured installer script from your Oculog server
  2. +
  3. The installer includes your server URL and automatically generates an API key
  4. +
  5. Installs the client as a systemd service
  6. +
  7. Starts the client and begins sending metrics immediately
  8. +
+

+ Note: If you don't provide the serverUrl query parameter, + the installer will use the server URL from the request. It's recommended to include it + explicitly for clarity. +

+
+ +
+

Manual Installation

+

+ If you prefer to download and install manually: +

+
    +
  1. + Download the installer script +
    +{`# Using curl
    +curl -o oculog-client-install.sh SERVER_URL/api/download-client/SERVER_ID?serverUrl=SERVER_URL
    +
    +# Or using wget
    +wget -O oculog-client-install.sh SERVER_URL/api/download-client/SERVER_ID?serverUrl=SERVER_URL`}
    +                    
    +
  2. +
  3. + Make it executable +
    +{`chmod +x oculog-client-install.sh`}
    +                    
    +
  4. +
  5. + Run the installer +
    +{`sudo ./oculog-client-install.sh`}
    +                    
    +
  6. +
+

+ The installer will: +

+
    +
  • Create the configuration directory at /etc/oculog/
  • +
  • Generate an API key and store it in /etc/oculog/client.conf
  • +
  • Install the client script to /usr/local/bin/oculog-client
  • +
  • Create and enable a systemd service
  • +
  • Start the client service
  • +
+
+ +
+

Using the Download Client Dialog

+

+ You can also use the web dashboard to generate a custom installer: +

+
    +
  1. Click the download icon (plus icon) in the left sidebar
  2. +
  3. Enter your Server ID (unique identifier for this server)
  4. +
  5. Optionally enter a custom Server URL (leave empty to use the default)
  6. +
  7. Click "Download Client Installer" to download the script
  8. +
  9. Transfer the script to your Ubuntu server
  10. +
  11. Run: sudo bash oculog-client-install.sh
  12. +
+

+ The dialog also provides a ready-to-use curl command that you can copy and paste directly + into your server terminal. +

+
+ +
+

Verifying Installation

+

+ After installation, verify the client is running: +

+
+{`# Check service status
+sudo systemctl status oculog-client
+
+# View client logs
+sudo journalctl -u oculog-client -f
+
+# Check configuration
+sudo cat /etc/oculog/client.conf`}
+                
+

+ The client should appear in your Oculog dashboard within 30 seconds of installation. +

+
+
+ )} +
+ + {/* How It Works Section */} +
+
toggleSection('architecture')} + > +

How It Works

+ + {expandedSections.architecture ? '▼' : '▶'} + +
+ {expandedSections.architecture && ( +
+
+

Architecture

+

+ Oculog uses a client-server architecture: +

+
    +
  • Server: Backend API (Express.js) + Frontend Dashboard (React) + PostgreSQL database
  • +
  • Clients: Lightweight Python agents installed on monitored servers
  • +
+

+ Clients collect metrics and send them to the server via HTTP POST requests every 30 seconds + (configurable). The server stores metrics in PostgreSQL and displays them in real-time + on the web dashboard. +

+
+ +
+

Metrics Collection

+

+ The client agent collects the following metrics: +

+
    +
  • CPU Usage: Percentage utilization and core count
  • +
  • Memory: Total, used, available, and swap usage
  • +
  • Disk: Usage per mounted filesystem
  • +
  • Network: Bytes sent/received per interface
  • +
  • Process Count: Total number of running processes
  • +
  • Load Average: 1-minute, 5-minute, and 15-minute averages
  • +
  • Uptime: System uptime in seconds
  • +
+

+ Metrics are collected every 30 seconds by default (configurable in /etc/oculog/client.conf). +

+
+ +
+

Vulnerability Scanning

+

+ The client automatically scans installed packages for known vulnerabilities: +

+
    +
  • Scans run automatically every hour
  • +
  • Uses dpkg-query to list all installed packages
  • +
  • Queries the OSV (Open Source Vulnerabilities) API for vulnerability information
  • +
  • Results are cached to reduce API calls
  • +
  • Vulnerabilities are stored in the database and displayed in the Security view
  • +
+

+ Vulnerabilities are categorized by severity (CRITICAL, HIGH, MEDIUM, LOW) and can be + filtered by status (new, ongoing). When vulnerabilities are resolved (package updated), + they are automatically removed from the database rather than being marked as "fixed". +

+
+ +
+

Client Auto-Updates

+

+ The client automatically checks for updates: +

+
    +
  • Update checks run every hour
  • +
  • Compares client version (build timestamp) with latest version from server
  • +
  • If an update is available, the client automatically downloads and installs it
  • +
  • The client restarts itself after a successful update
  • +
+

+ Client versions are based on the modification time of the client.py source file, + ensuring all clients from the same build have the same version identifier. +

+
+ +
+

Synthetic Monitors

+

+ Synthetic monitors allow you to monitor external endpoints: +

+
    +
  • HTTP/HTTPS endpoint monitoring
  • +
  • Configurable check intervals
  • +
  • Tracks response time, status codes, and availability
  • +
  • Results are stored and displayed in the Synthetic Monitors view
  • +
+
+ +
+

Alerting

+

+ Alert policies allow you to set thresholds for various metrics: +

+
    +
  • CPU usage thresholds
  • +
  • Memory usage thresholds
  • +
  • Disk usage thresholds
  • +
  • Network throughput thresholds
  • +
  • Alert statuses: new, ongoing, resolved
  • +
+

+ Alerts are evaluated continuously and displayed in the Alerting view. +

+
+
+ )} +
+ + {/* Tips & Tricks Section */} +
+
toggleSection('forceUpdate')} + > +

Tips & Tricks

+ + {expandedSections.forceUpdate ? '▼' : '▶'} + +
+ {expandedSections.forceUpdate && ( +
+
+

Force a Client Update

+

+ To force a client to update immediately (without waiting for the hourly check): +

+
    +
  1. + Method 1: Restart the client service +
    +{`# On the monitored server
    +sudo systemctl restart oculog-client`}
    +                    
    +

    + This will trigger an immediate update check when the client starts. +

    +
  2. +
  3. + Method 2: Touch the client script on the server +
    +{`# On the Oculog server (where client.py source is located)
    +touch clients/ubuntu/client.py`}
    +                    
    +

    + This updates the file modification time, which changes the version identifier. + Clients checking for updates will detect the new version and update automatically. +

    +
  4. +
  5. + Method 3: Manually trigger update check +
    +{`# On the monitored server, edit the client script temporarily
    +# Change update_check_interval to a small value (e.g., 60 seconds)
    +# Or manually call the check_for_updates method`}
    +                    
    +
  6. +
+
+ +
+

Force a Vulnerability Scan

+

+ To force a client to perform a vulnerability scan immediately: +

+
    +
  1. + Method 1: Restart the client service +
    +{`# On the monitored server
    +sudo systemctl restart oculog-client`}
    +                    
    +

    + The client will perform an initial scan when it starts, then continue with hourly scans. +

    +
  2. +
  3. + Method 2: Temporarily reduce scan interval +
    +{`# Edit the client script on the monitored server
    +# Find VulnerabilityScanner class and change:
    +# self.scan_interval = 60  # 1 minute instead of 3600 (1 hour)
    +# Then restart: sudo systemctl restart oculog-client`}
    +                    
    +
  4. +
  5. + Method 3: Check client logs +
    +{`# View recent vulnerability scan activity
    +sudo journalctl -u oculog-client -n 100 | grep -i vuln`}
    +                    
    +
  6. +
+
+ +
+

Clear All Vulnerability Data

+

+ To clear all vulnerability data and start fresh (useful after updating vulnerability extraction logic): +

+
    +
  1. + Method 1: Use the API endpoint (Recommended) +
    +{`# Clear all vulnerabilities, server links, and cache
    +curl -X POST http://your-server:3001/api/security/vulnerabilities/clear-all`}
    +                    
    +

    + This will: +

    +
      +
    • Delete all vulnerability records
    • +
    • Delete all server-vulnerability links (automatically via CASCADE)
    • +
    • Clear the vulnerability cache
    • +
    • Return a summary of what was deleted
    • +
    +

    + The API endpoint runs in a transaction, so if anything fails, all changes are rolled back. +

    +
  2. +
  3. + Method 2: Direct SQL commands +
    +{`# Connect to PostgreSQL
    +psql -U your_user -d your_database
    +
    +# Clear vulnerability cache
    +DELETE FROM vulnerability_cache;
    +
    +# Clear vulnerabilities (CASCADE will automatically delete server_vulnerabilities)
    +DELETE FROM vulnerabilities;
    +
    +# Verify server_vulnerabilities is empty (should be automatic due to CASCADE)
    +SELECT COUNT(*) FROM server_vulnerabilities;`}
    +                    
    +

    + Note: The server_vulnerabilities table has a foreign key with ON DELETE CASCADE, + so deleting vulnerabilities will automatically delete all related server links. +

    +
  4. +
+

+ After clearing: The next vulnerability scan from your clients will repopulate the data + with the updated extraction logic (proper CVE IDs, severity, fixed versions, etc.). +

+
+ +
+

Cleanup Duplicate Vulnerabilities

+

+ If you notice duplicate vulnerability records, you can clean them up: +

+
+{`# Remove duplicate vulnerabilities (keeps the most complete record)
+curl -X POST http://your-server:3001/api/security/vulnerabilities/cleanup`}
+                
+

+ This will: +

+
    +
  • Find duplicates based on CVE ID + package name + ecosystem
  • +
  • Keep the record with the most complete data (has severity, fixed_version, etc.)
  • +
  • Remove duplicate records
  • +
  • Return the count of duplicates removed
  • +
+
+ +
+

View Client Logs

+

+ Monitor client activity and troubleshoot issues: +

+
+{`# View all logs
+sudo journalctl -u oculog-client -f
+
+# View last 100 lines
+sudo journalctl -u oculog-client -n 100
+
+# View logs from today
+sudo journalctl -u oculog-client --since today
+
+# Filter for specific events
+sudo journalctl -u oculog-client | grep -i "update"
+sudo journalctl -u oculog-client | grep -i "vulnerability"
+sudo journalctl -u oculog-client | grep -i "error"`}
+                
+
+ +
+

Check Client Status

+

+ Verify the client is running correctly: +

+
+{`# Check service status
+sudo systemctl status oculog-client
+
+# Check if client process is running
+ps aux | grep oculog-client
+
+# Verify configuration
+sudo cat /etc/oculog/client.conf
+
+# Test API connectivity
+curl -H "X-API-Key: YOUR_API_KEY" http://YOUR_SERVER:3001/health`}
+                
+
+ +
+

View Metrics via API

+

+ Access metrics programmatically: +

+
+{`# List all servers
+curl http://localhost:3001/api/servers
+
+# Get latest metrics for a server
+curl http://localhost:3001/api/servers/SERVER_ID/metrics?limit=10
+
+# Get server info
+curl http://localhost:3001/api/servers/SERVER_ID/info
+
+# Get vulnerability stats
+curl http://localhost:3001/api/servers/SERVER_ID/vulnerabilities/stats`}
+                
+
+ +
+

Client Configuration

+

+ The client configuration file is located at /etc/oculog/client.conf: +

+
+{`{
+  "server_url": "http://your-server:3001",
+  "server_id": "unique-server-identifier",
+  "api_key": "your-api-key",
+  "interval": 30
+}`}
+                
+

+ After modifying the configuration, restart the client: +

+
+{`sudo systemctl restart oculog-client`}
+                
+
+ +
+

API Key Management

+

+ API keys are used to authenticate client requests: +

+
    +
  • Each server should have its own API key
  • +
  • Keys are created automatically during client installation
  • +
  • Keys can be managed via the API: POST /api/keys and GET /api/keys/:serverId
  • +
  • Keys are stored hashed in the database for security
  • +
+
+ +
+

Troubleshooting

+

+ Common issues and solutions: +

+
    +
  • + Client not sending metrics: Check network connectivity, API key, and service status +
  • +
  • + Outdated client version: Restart the service to trigger an update check +
  • +
  • + No vulnerabilities showing: Wait for the hourly scan or restart the client +
  • +
  • + High API usage: Vulnerability results are cached to minimize API calls +
  • +
  • + Database connection issues: Check PostgreSQL is running and accessible +
  • +
+
+
+ )} +
+ + {/* API Endpoints Section */} +
+
toggleSection('endpoints')} + > +

API Endpoints

+ + {expandedSections.endpoints ? '▼' : '▶'} + +
+ {expandedSections.endpoints && ( +
+

+ Key API endpoints for reference: +

+
    +
  • GET /health - Health check
  • +
  • GET /api/servers - List all servers
  • +
  • GET /api/servers/:serverId/metrics - Get metrics for a server
  • +
  • POST /api/servers/:serverId/metrics - Submit metrics (client use)
  • +
  • GET /api/servers/:serverId/info - Get server information
  • +
  • GET /api/client-version/latest - Get latest client version
  • +
  • GET /api/client-script - Download client script
  • +
  • POST /api/servers/:serverId/vulnerabilities/scan - Submit vulnerability scan (client use)
  • +
  • GET /api/servers/:serverId/vulnerabilities - Get vulnerabilities for a server
  • +
  • GET /api/servers/:serverId/vulnerabilities/stats - Get vulnerability statistics for a server
  • +
  • POST /api/security/vulnerabilities/clear-all - Clear all vulnerability data
  • +
  • POST /api/security/vulnerabilities/cleanup - Remove duplicate vulnerabilities
  • +
  • GET /api/synthetic-monitors - List synthetic monitors
  • +
  • GET /api/alert-policies - List alert policies
  • +
  • GET /api/alerts - List alerts
  • +
+
+ )} +
+
+
+ ); +} + +export default Wiki; diff --git a/server/frontend/src/index.css b/server/frontend/src/index.css new file mode 100644 index 0000000..df07308 --- /dev/null +++ b/server/frontend/src/index.css @@ -0,0 +1,62 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html { + overscroll-behavior-y: none; + -webkit-text-size-adjust: 100%; + -moz-text-size-adjust: 100%; + text-size-adjust: 100%; + -webkit-tap-highlight-color: transparent; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + background-color: #0f172a; + color: #e2e8f0; + overscroll-behavior-y: none; + -webkit-text-size-adjust: 100%; + -moz-text-size-adjust: 100%; + text-size-adjust: 100%; + width: 100%; + overflow-x: hidden; +} + +/* Improve touch interactions on mobile */ +button, a, select, input { + -webkit-tap-highlight-color: rgba(252, 41, 34, 0.2); + touch-action: manipulation; +} + +/* Prevent horizontal scroll on mobile */ +@media (max-width: 768px) { + html, body { + overflow-x: hidden; + width: 100%; + position: relative; + } +} + +/* Hide React error overlay for external script errors */ +iframe[src*="react-error-overlay"], +div[data-react-error-overlay], +div[style*="position: fixed"][style*="z-index: 2147483647"] { + display: none !important; +} + +/* More specific selector for React error overlay */ +body > div:last-child[style*="position: fixed"] { + display: none !important; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} + diff --git a/server/frontend/src/index.js b/server/frontend/src/index.js new file mode 100644 index 0000000..74143f5 --- /dev/null +++ b/server/frontend/src/index.js @@ -0,0 +1,216 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import './index.css'; +import App from './App'; +import ErrorBoundary from './components/ErrorBoundary'; + +// Suppress external script errors (browser extensions, injected scripts) +window.addEventListener('error', (event) => { + const message = event.message || ''; + const filename = event.filename || ''; + + // Suppress errors from external sources (browser extensions, injected scripts) + if ( + message === 'Script error.' || + message.includes('ethereum') || + message.includes('web3') || + message.includes('selectedAddress') || + message.includes('window.ethereum') || + message.includes('undefined is not an object') || + filename === '' || + filename.includes('chrome-extension://') || + filename.includes('moz-extension://') || + filename.includes('safari-extension://') + ) { + event.preventDefault(); + event.stopPropagation(); + return false; + } +}, true); + +// Suppress unhandled promise rejections from external sources +window.addEventListener('unhandledrejection', (event) => { + const message = event.reason?.message || event.reason?.toString() || ''; + if ( + message.includes('ethereum') || + message.includes('web3') || + message === 'Script error.' + ) { + event.preventDefault(); + } +}); + +// Suppress console errors for known external errors +const originalConsoleError = console.error; +console.error = (...args) => { + const message = args.join(' '); + if ( + message.includes('ethereum') || + message.includes('web3') || + message === 'Script error.' || + message.includes('window.ethereum') || + message.includes('selectedAddress') || + message.includes('undefined is not an object') || + message.includes('handleError@') + ) { + return; // Suppress these errors + } + originalConsoleError.apply(console, args); +}; + +// Intercept and suppress React error overlay for external script errors +// This runs after React loads to catch errors that React's overlay might show +const suppressReactErrorOverlay = () => { + // Check for React error overlay and dismiss it if it shows external errors + const checkAndDismissOverlay = () => { + // Look for the error overlay container - check multiple possible selectors + const selectors = [ + '[data-react-error-overlay]', + 'iframe[src*="react-error-overlay"]', + 'div[style*="position: fixed"][style*="z-index: 2147483647"]', + 'div[style*="position:fixed"][style*="z-index:2147483647"]', + 'body > div:last-child[style*="position: fixed"]', + 'body > iframe:last-child' + ]; + + let overlay = null; + for (const selector of selectors) { + overlay = document.querySelector(selector); + if (overlay) break; + } + + if (overlay) { + // Check if the overlay contains external error messages + let overlayText = ''; + try { + overlayText = overlay.textContent || overlay.innerText || ''; + // Also check iframe content if it's an iframe + if (overlay.tagName === 'IFRAME' && overlay.contentDocument) { + overlayText += overlay.contentDocument.body?.textContent || ''; + } + } catch (e) { + // Can't access iframe content (cross-origin), but that's okay + } + + // Always hide if it contains external errors, or hide all overlays with high z-index + const hasExternalError = overlayText.includes('Script error') || + overlayText.includes('ethereum') || + overlayText.includes('selectedAddress') || + overlayText.includes('window.ethereum') || + overlayText.includes('handleError@'); + + if (hasExternalError || overlayText === '') { + // Try to find and click the dismiss button first + const dismissButton = overlay.querySelector('button[aria-label*="close"]') || + overlay.querySelector('button[aria-label*="dismiss"]') || + overlay.querySelector('button:last-child') || + overlay.querySelector('[role="button"]'); + + if (dismissButton) { + try { + dismissButton.click(); + } catch (e) { + // If click fails, remove the overlay + overlay.remove(); + } + } else { + // If no button found, hide or remove the overlay + overlay.style.display = 'none'; + overlay.remove(); + } + } + } + + // Also check all fixed position divs with high z-index or that contain error text + const allFixedDivs = document.querySelectorAll('div[style*="position: fixed"], div[style*="position:fixed"]'); + allFixedDivs.forEach(div => { + const style = window.getComputedStyle(div); + const zIndex = parseInt(style.zIndex) || 0; + const text = div.textContent || div.innerText || ''; + + // Hide if high z-index and contains error-related text + if (zIndex > 10000 || + text.includes('Uncaught runtime errors') || + text.includes('Script error') || + text.includes('ethereum') || + text.includes('handleError@')) { + // Check if it's specifically an external error before hiding + if (text.includes('Script error') || + text.includes('ethereum') || + text.includes('selectedAddress') || + text.includes('window.ethereum') || + (text.includes('Uncaught runtime errors') && text.includes('Script error'))) { + div.style.display = 'none'; + div.style.visibility = 'hidden'; + div.style.opacity = '0'; + div.remove(); + } + } + }); + + // Also check for any div containing "Uncaught runtime errors" text + const errorOverlays = document.querySelectorAll('div'); + errorOverlays.forEach(div => { + const text = div.textContent || div.innerText || ''; + if (text.includes('Uncaught runtime errors') && + (text.includes('Script error') || text.includes('ethereum'))) { + const style = window.getComputedStyle(div); + if (style.position === 'fixed' || style.position === 'absolute') { + div.style.display = 'none'; + div.remove(); + } + } + }); + }; + + // Check immediately and then more frequently + checkAndDismissOverlay(); + // Check every 100ms to catch overlay quickly + setInterval(checkAndDismissOverlay, 100); + + // Also listen for DOM changes to catch overlay when it appears + const observer = new MutationObserver(() => { + checkAndDismissOverlay(); + }); + + observer.observe(document.body, { + childList: true, + subtree: true + }); +}; + +// Suppress React's error reporting mechanism +if (typeof window !== 'undefined') { + // Override React's error handler if it exists + const originalHandleError = window.__REACT_ERROR_OVERLAY_GLOBAL_HANDLER__; + if (originalHandleError) { + window.__REACT_ERROR_OVERLAY_GLOBAL_HANDLER__ = function(error, isFatal) { + const errorMessage = error?.message || error?.toString() || ''; + if ( + errorMessage.includes('Script error') || + errorMessage.includes('ethereum') || + errorMessage.includes('selectedAddress') || + errorMessage.includes('window.ethereum') + ) { + return; // Suppress the error + } + // Call original handler for other errors + if (originalHandleError) { + originalHandleError(error, isFatal); + } + }; + } +} + +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render( + + + + + +); + +// Start suppressing React error overlay after React renders +setTimeout(suppressReactErrorOverlay, 1000); +