commit ee6b05d7e7509453c7254d4006621275cce2d094 Author: fellowship Date: Sun Apr 5 18:21:51 2026 +0000 init diff --git a/caddy/Caddyfile b/caddy/Caddyfile new file mode 100644 index 0000000..9dbf977 --- /dev/null +++ b/caddy/Caddyfile @@ -0,0 +1,18 @@ +# Caddyfile for Fellowship SUT - STAGING +# Domain will be dynamically set via environment variable CADDY_DOMAIN +# Uses Let's Encrypt Staging CA to avoid rate limits (up to 5,000 cert/hour) +# For local development: CADDY_DOMAIN defaults to localhost +# For production certificates, use Caddyfile.prod instead +# For tutorial instances (SUT + Jenkins + IDE), use Caddyfile.fellowship instead + +{$CADDY_DOMAIN:localhost} { + # Use Let's Encrypt staging CA for development and testing + # Staging certs won't be trusted by browsers but avoid rate limits + # Caddy automatically uses self-signed certs for localhost + tls { + ca https://acme-staging-v02.api.letsencrypt.org/directory + } + + reverse_proxy /api/* backend:5000 + reverse_proxy /* frontend:3000 +} diff --git a/caddy/Caddyfile.fellowship b/caddy/Caddyfile.fellowship new file mode 100644 index 0000000..e60a1dd --- /dev/null +++ b/caddy/Caddyfile.fellowship @@ -0,0 +1,54 @@ +# Caddyfile for Fellowship Tutorial Instances +# Used exclusively by setup_fellowship.sh for classroom/tutorial EC2 instances +# that run the full DevOps Escape Room stack (SUT + Jenkins CI + code-server IDE). +# +# This file is NEVER used by the permanent SUT deployment (bootstrap_spot_instance.sh), +# which uses Caddyfile.prod (SUT only) instead. +# +# setup_fellowship.sh copies this file over caddy/Caddyfile before starting +# docker compose, so that the Caddy container picks it up automatically. +# +# Required environment variables: +# CADDY_DOMAIN — SUT domain (e.g. fellowship-pool-8.fellowship.testingfantasy.com) +# JENKINS_DOMAIN — Jenkins domain (jenkins-{CADDY_DOMAIN}) +# IDE_DOMAIN — IDE domain (ide-{CADDY_DOMAIN}) +# GITEA_DOMAIN — Gitea domain (gitea-{CADDY_DOMAIN}) +# +# All four domains must have Route53 A records pointing to the same instance +# public IP as CADDY_DOMAIN. setup_fellowship.sh creates all records. +# +# Routing: +# CADDY_DOMAIN → SUT frontend (port 3000) and backend API (port 5000) +# JENKINS_DOMAIN → Jenkins CI (port 8080, devops-escape-room compose stack) +# IDE_DOMAIN → code-server (port 8443, devops-escape-room compose stack) +# GITEA_DOMAIN → Gitea (port 3030, devops-escape-room compose stack) +# +# Jenkins and code-server are reached via host.docker.internal (host-gateway), +# because they run in a separate docker-compose project from Caddy. +# docker-compose.yml sets extra_hosts: [host.docker.internal:host-gateway]. + +# ── Fellowship SUT ──────────────────────────────────────────────────────────── +{$CADDY_DOMAIN} { + # Let Caddy use its default automatic HTTPS issuers. + # This avoids hard-failing when a single ACME CA is temporarily rate-limited. + + reverse_proxy /api/* backend:5000 + reverse_proxy /* frontend:3000 +} + +# ── Jenkins CI (DevOps Escape Room) ────────────────────────────────────────── +{$JENKINS_DOMAIN} { + reverse_proxy /* host.docker.internal:8080 +} + +# ── code-server IDE (DevOps Escape Room) ───────────────────────────────────── +# Host port 8443 maps to the code-server container's internal port 8080. +{$IDE_DOMAIN} { + reverse_proxy /* host.docker.internal:8443 +} + +# ── Gitea (self-hosted Git, DevOps Escape Room) ─────────────────────────────── +# Host port 3030 maps to Gitea's internal port 3000. +{$GITEA_DOMAIN} { + reverse_proxy /* host.docker.internal:3030 +} diff --git a/caddy/Caddyfile.local b/caddy/Caddyfile.local new file mode 100644 index 0000000..a888113 --- /dev/null +++ b/caddy/Caddyfile.local @@ -0,0 +1,18 @@ +# Caddyfile for Fellowship SUT - LOCAL DEVELOPMENT +# HTTP-only configuration for local development (no HTTPS) +# Explicitly use http:// to avoid automatic HTTPS redirect + +http://localhost, http://127.0.0.1, :80 { + # API routes - Flask handles CORS + handle /api/* { + reverse_proxy backend:5000 + } + + # WebSocket support + handle /ws { + reverse_proxy backend:5000 + } + + # Frontend routes + reverse_proxy /* frontend:3000 +} diff --git a/caddy/Caddyfile.prod b/caddy/Caddyfile.prod new file mode 100644 index 0000000..e54b767 --- /dev/null +++ b/caddy/Caddyfile.prod @@ -0,0 +1,14 @@ +# Caddyfile for Fellowship SUT - PRODUCTION +# Domain will be dynamically set via environment variable CADDY_DOMAIN +# Uses Let's Encrypt Production CA for trusted certificates +# Rate limit: 50 certificates per domain per week +# For local development, use Caddyfile (staging) instead +# For tutorial instances (SUT + Jenkins + IDE), use Caddyfile.fellowship instead + +{$CADDY_DOMAIN:localhost} { + # Let Caddy use its default automatic HTTPS issuers. + # This avoids hard-failing when a single ACME CA is temporarily rate-limited. + + reverse_proxy /api/* backend:5000 + reverse_proxy /* frontend:3000 +} \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..360992b --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,119 @@ +# version is obsolete in newer docker-compose versions +# +# Environment-aware Docker Compose configuration +# Supports both production (fellowship) and local dev (fellowship-local) stacks +# Usage: +# Production: cp .env.prod .env && docker-compose up -d (containers: fellowship_*) +# Local dev: cp .env.local .env && docker-compose up -d (containers: fellowship-local_*) +# +# The COMPOSE_PROJECT_NAME environment variable controls container naming: +# - Omitted or 'fellowship' → containers: fellowship_backend_1, fellowship_frontend_1 +# - 'fellowship-local' → containers: fellowship-local_backend_1, fellowship-local_frontend_1 +# +# This allows both environments to coexist without conflicts. + +services: + backend: + build: + context: ./sut/backend + dockerfile: Dockerfile + # ✓ No container_name: allows COMPOSE_PROJECT_NAME-based naming + # Port 5000 is intentionally NOT exposed to the host — backend is only reached + # via Caddy reverse-proxy (internal Docker network: backend:5000). + # macOS AirPlay Receiver occupies host port 5000 (Monterey+), so binding it + # would fail. Direct API access for debugging: docker exec or /api through Caddy. + volumes: + - backend_data:/app/data + - ./sut/backend:/app + # Exclude node_modules and data from volume mount to avoid conflicts + environment: + - FLASK_APP=app.py + - FLASK_ENV=development + - DATABASE_URL=sqlite:////app/data/fellowship.db + - SECRET_KEY=dev-secret-key-change-in-production + - AZURE_OPENAI_ENDPOINT=${AZURE_OPENAI_ENDPOINT:-} + - AZURE_OPENAI_API_KEY=${AZURE_OPENAI_API_KEY:-} + - AZURE_OPENAI_DEPLOYMENT=${AZURE_OPENAI_DEPLOYMENT:-} + - AZURE_OPENAI_API_VERSION=${AZURE_OPENAI_API_VERSION:-} + working_dir: /app + command: python app.py + restart: unless-stopped + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:5000/api/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + + frontend: + build: + context: ./sut/frontend + dockerfile: Dockerfile + # ✓ No container_name: allows COMPOSE_PROJECT_NAME-based naming + # Port 3000 is intentionally NOT exposed to the host — Caddy reverse-proxies + # to frontend:3000 via the internal Docker network. Colima's sshfs SSH tunnels + # conflict with host-bound :3000, so we leave it unmapped. + volumes: + - ./sut/frontend:/app + - frontend_node_modules:/app/node_modules + environment: + - REACT_APP_API_URL=/api + - REACT_APP_ENABLE_TEST_CONTROLS=${REACT_APP_ENABLE_TEST_CONTROLS:-true} + - CHOKIDAR_USEPOLLING=true + - SKIP_PREFLIGHT_CHECK=true + - DISABLE_ESLINT_PLUGIN=true + - FAST_REFRESH=false + - FRONTEND_MODE=${FRONTEND_MODE:-dev} + - NODE_ENV=development + - WDS_SOCKET_PORT=${WDS_SOCKET_PORT:-80} + - WDS_SOCKET_HOST=${CADDY_DOMAIN:-localhost} + - WDS_SOCKET_PROTOCOL=${WDS_SOCKET_PROTOCOL:-ws} + - WDS_SOCKET_PATH=${WDS_SOCKET_PATH:-/ws} + command: sh -c "npm install && if [ \"${FRONTEND_MODE:-dev}\" = \"prod\" ]; then npm run build && npx --yes serve -s build -l 3000; else npm start; fi" + depends_on: + - backend + restart: unless-stopped + + caddy: + image: caddy:2-alpine + # ✓ No container_name: allows COMPOSE_PROJECT_NAME-based naming + ports: + - "80:80" + - "443:443" + volumes: + - ${CADDYFILE_PATH:-./caddy/Caddyfile.local}:/etc/caddy/Caddyfile:ro + - caddy_data:/data + - caddy_config:/config + environment: + # Use CADDY_DOMAIN from environment/env file, fallback to localhost for local development + CADDY_DOMAIN: ${CADDY_DOMAIN:-localhost} + # DevOps Escape Room HTTPS subdomains — prepend jenkins-/ide- to CADDY_DOMAIN. + # These env vars are required when using Caddyfile (staging) or Caddyfile.prod. + # They are NOT needed when using Caddyfile.local (CI / local HTTP-only dev). + JENKINS_DOMAIN: ${JENKINS_DOMAIN:-} + IDE_DOMAIN: ${IDE_DOMAIN:-} + GITEA_DOMAIN: ${GITEA_DOMAIN:-} + # Allow Caddy to reach services in the devops-escape-room compose stack + # (Jenkins on host:8080 and code-server on host:8443) via host.docker.internal. + extra_hosts: + - "host.docker.internal:host-gateway" + depends_on: + - backend + - frontend + restart: unless-stopped + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost/"] + interval: 10s + timeout: 5s + retries: 3 + start_period: 20s + +volumes: + backend_data: + driver: local + frontend_node_modules: + driver: local + caddy_data: + driver: local + caddy_config: + driver: local \ No newline at end of file diff --git a/nginx/nginx.conf b/nginx/nginx.conf new file mode 100644 index 0000000..a4594a1 --- /dev/null +++ b/nginx/nginx.conf @@ -0,0 +1,79 @@ +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + # Logging + access_log /var/log/nginx/access.log; + error_log /var/log/nginx/error.log; + + # Gzip compression + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss; + + # Upstream servers + upstream backend { + server backend:5000; + } + + upstream frontend { + server frontend:3000; + } + + server { + listen 80; + server_name _; + + # Increase body size for API requests + client_max_body_size 10M; + + # Swagger UI static files - must come before /api + location ~ ^/api/swagger/(static|favicon|swagger-ui) { + proxy_pass http://backend; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # API routes - proxy to backend (CORS handled by Flask) + location /api { + proxy_pass http://backend; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_cache_bypass $http_upgrade; + # Note: CORS headers are handled by Flask-CORS, not nginx + } + + # Frontend routes - proxy to React app + location / { + proxy_pass http://frontend; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_cache_bypass $http_upgrade; + } + + # Health check endpoint + location /health { + access_log off; + return 200 "healthy\n"; + add_header Content-Type text/plain; + } + } +} \ No newline at end of file diff --git a/sut/backend/.env.example b/sut/backend/.env.example new file mode 100644 index 0000000..3fa56c3 --- /dev/null +++ b/sut/backend/.env.example @@ -0,0 +1,14 @@ +# Azure OpenAI Configuration +# Get these values from your Azure OpenAI resource dashboard +AZURE_OPENAI_ENDPOINT=https://.openai.azure.com/ +AZURE_OPENAI_API_KEY=your_api_key_here +AZURE_OPENAI_DEPLOYMENT=gpt-4o +AZURE_OPENAI_API_VERSION=2024-11-20 +AZURE_OPENAI_MAX_TOKENS=500 +AZURE_OPENAI_TEMPERATURE=0.85 + +# Flask Configuration +SECRET_KEY=dev-secret-key-change-in-production + +# Database Configuration (optional—defaults to SQLite) +# DATABASE_URL=sqlite:////app/data/fellowship.db diff --git a/sut/backend/Dockerfile b/sut/backend/Dockerfile new file mode 100644 index 0000000..91fb8d0 --- /dev/null +++ b/sut/backend/Dockerfile @@ -0,0 +1,24 @@ +FROM python:3.11-slim + +WORKDIR /app + +# Install system dependencies +RUN apt-get update && apt-get install -y \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# Copy requirements and install Python dependencies +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +# Copy application code +COPY . . + +# Create data directory for SQLite +RUN mkdir -p /app/data + +# Expose port +EXPOSE 5000 + +# Run the application +CMD ["python", "app.py"] diff --git a/sut/backend/__pycache__/config.cpython-311.pyc b/sut/backend/__pycache__/config.cpython-311.pyc new file mode 100644 index 0000000..9904119 Binary files /dev/null and b/sut/backend/__pycache__/config.cpython-311.pyc differ diff --git a/sut/backend/app.py b/sut/backend/app.py new file mode 100644 index 0000000..a71e703 --- /dev/null +++ b/sut/backend/app.py @@ -0,0 +1,229 @@ +"""Main Flask application for the Fellowship Quest Tracker.""" +from dotenv import load_dotenv +import os + +# Load environment variables from .env file (if present) +# This must happen before any config is loaded +load_dotenv() + +from flask import Flask, jsonify, request, session +from flask_cors import CORS +from flask_restx import Api +from config import config +from models.user import db +from utils.database import init_db +from utils.seed_data import seed_database +from routes.auth import auth_bp, auth_api +from routes.quests import quests_bp, quests_api +from routes.members import members_bp, members_api +from routes.locations import locations_bp, locations_api +from routes.npc_chat import npc_chat_bp, npc_chat_api +from routes.shop import shop_bp, shop_api +from services.shop_service import ShopService +from datetime import datetime, timezone, timedelta +from typing import Optional + + +APP_STARTED_AT_UTC = datetime.now(timezone.utc) + + +def _read_uptime_seconds() -> Optional[float]: + try: + with open('/proc/uptime', 'r', encoding='utf-8') as uptime_file: + first_field = uptime_file.read().split()[0] + return float(first_field) + except (OSError, ValueError, IndexError): + return None + + +def _instance_boot_time_utc() -> Optional[datetime]: + uptime_seconds = _read_uptime_seconds() + if uptime_seconds is None: + return None + return datetime.now(timezone.utc) - timedelta(seconds=uptime_seconds) + +def create_app(config_name: str = None) -> Flask: + """Create and configure Flask application.""" + app = Flask(__name__) + + # Load configuration + config_name = config_name or os.environ.get('FLASK_ENV', 'development') + app.config.from_object(config[config_name]) + + # Configure session + app.config['SESSION_COOKIE_HTTPONLY'] = True + app.config['SESSION_COOKIE_SAMESITE'] = 'Lax' # Allows cross-site cookies for development + app.config['SESSION_COOKIE_SECURE'] = False # Set to True in production with HTTPS + + # Initialize CORS with specific origins (required when using credentials) + # Allow both localhost:3000 (dev) and localhost (production via nginx) + # Flask-CORS handles preflight OPTIONS requests automatically + CORS( + app, + supports_credentials=True, + resources={ + r"/api/*": { + "origins": [ + "http://localhost:3000", + "http://localhost", + "http://127.0.0.1:3000", + "http://127.0.0.1", + ] + } + }, + allow_headers=["Content-Type", "Authorization"], + methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"], + ) + + # Initialize database (this also initializes db) + init_db(app) + + # Seed database with initial data + # Skip seeding in test mode + # Skip seeding in test mode + if not app.config.get("TESTING") and not os.environ.get("TESTING"): + seed_database(app) + # Create main API with Swagger documentation + api = Api( + app, + version='1.0', + title='The Fellowship\'s Quest List API', + description='REST API for tracking the Fellowship\'s epic journey through Middle-earth', + doc='/api/swagger/', + prefix='/api' + ) + + # Register blueprints (this registers both the blueprints and their Flask-RESTX routes) + # Flask-RESTX Api objects bound to blueprints automatically register routes when blueprint is registered + app.register_blueprint(auth_bp) + app.register_blueprint(quests_bp) + app.register_blueprint(members_bp) + app.register_blueprint(locations_bp) + app.register_blueprint(npc_chat_bp) + app.register_blueprint(shop_bp) + + # Note: We don't add the Api objects as namespaces because they're already bound to blueprints + # Adding them as namespaces would cause route conflicts. The routes work from blueprints alone. + # For Swagger, each Api has its own documentation, but we can add them to the main API if needed. + # However, this requires creating Namespace objects, not using the Api objects directly. + + # Health check endpoint + @app.route('/api/health') + def health(): + """Health check endpoint.""" + return jsonify({'status': 'healthy', 'service': 'fellowship-quest-tracker'}), 200 + + # Test cleanup endpoint (development only - deletes accumulated test data) + @app.route('/api/test/cleanup', methods=['POST']) + def test_cleanup(): + """Delete quests created during e2e test runs to prevent database bloat.""" + from models.quest import Quest as QuestModel + # Only allowed in non-production environments + if app.config.get('ENV') == 'production': + return jsonify({'error': 'Not available in production'}), 403 + test_patterns = [ + 'BDD', 'Test Quest', 'Find the One Ring', 'Explore Rivendell', + 'Defeat Sauron', 'Completed Quest', 'In Progress Quest', + 'Journey Quest', 'Battle Quest', 'Ring Quest', + 'Mordor Quest', 'Rivendell Quest', 'Dark Magic Quest', + 'Mini-game Quest', + ] + deleted = 0 + try: + for pattern in test_patterns: + quests = QuestModel.query.filter(QuestModel.title.contains(pattern)).all() + for q in quests: + db.session.delete(q) + deleted += 1 + db.session.commit() + return jsonify({'deleted': deleted, 'status': 'ok'}), 200 + except Exception as e: + db.session.rollback() + return jsonify({'error': str(e)}), 500 + + @app.route('/api/test/set_gold', methods=['POST']) + def test_set_gold(): + """Set the current user's gold balance (for e2e testing only).""" + if app.config.get('ENV') == 'production': + return jsonify({'error': 'Not available in production'}), 403 + from models.user import User as UserModel + user_id = session.get('user_id') + if not user_id: + return jsonify({'error': 'Not authenticated'}), 401 + data = request.get_json() or {} + gold = data.get('gold') + if gold is None or not isinstance(gold, int) or gold < 0: + return jsonify({'error': 'gold must be a non-negative integer'}), 400 + try: + user = UserModel.query.get(user_id) + if not user: + return jsonify({'error': 'User not found'}), 404 + user.gold = gold + db.session.commit() + return jsonify({'gold': user.gold, 'status': 'ok'}), 200 + except Exception as e: + db.session.rollback() + return jsonify({'error': str(e)}), 500 + + @app.route('/api/test/reset_shop', methods=['POST']) + def test_reset_shop(): + """Reset all items to not-sold and clear inventory for e2e testing.""" + if app.config.get('ENV') == 'production': + return jsonify({'error': 'Not available in production'}), 403 + try: + result = ShopService.reset_for_tests() + return jsonify(result), 200 + except Exception as e: + return jsonify({'error': str(e)}), 500 + + @app.route('/api/status') + def status(): + """Runtime status endpoint exposed for public uptime/restart information.""" + instance_boot_time = _instance_boot_time_utc() + payload = { + 'status': 'ok', + 'service': 'fellowship-quest-tracker', + 'app_started_at_utc': APP_STARTED_AT_UTC.isoformat(), + 'instance_boot_time_utc': instance_boot_time.isoformat() if instance_boot_time else None, + 'now_utc': datetime.now(timezone.utc).isoformat(), + } + return jsonify(payload), 200 + + # API info endpoint (instead of root, since nginx handles root routing) + @app.route('/api') + def api_info(): + """API information endpoint.""" + return jsonify({ + 'message': 'Welcome to The Fellowship\'s Quest List API', + 'version': '1.0', + 'docs': '/api/swagger/', + 'health': '/api/health', + 'status': '/api/status' + }), 200 + + # Debug endpoint to list all registered routes (development only) + if app.config.get('DEBUG'): + @app.route('/api/routes') + def list_routes(): + """List all registered routes (debug endpoint).""" + routes = [] + for rule in app.url_map.iter_rules(): + if rule.rule.startswith('/api'): + routes.append({ + 'endpoint': rule.endpoint, + 'methods': list(rule.methods - {'HEAD', 'OPTIONS'}), + 'path': str(rule) + }) + return jsonify({'routes': sorted(routes, key=lambda x: x['path'])}), 200 + + return app + +if __name__ == '__main__': + try: + app = create_app() + app.run(host='0.0.0.0', port=5000, debug=True) + except Exception as e: + import traceback + print(f"Error starting application: {e}") + traceback.print_exc() + raise \ No newline at end of file diff --git a/sut/backend/config.py b/sut/backend/config.py new file mode 100644 index 0000000..6a77bba --- /dev/null +++ b/sut/backend/config.py @@ -0,0 +1,57 @@ +"""Configuration settings for the Fellowship Quest Tracker application.""" +import os +from pathlib import Path + +class Config: + """Base configuration.""" + SECRET_KEY = os.environ.get('SECRET_KEY', 'dev-secret-key-change-in-production') + + # SQLite database configuration + BASE_DIR = Path(__file__).parent.parent.parent + DATA_DIR = Path('/app/data') + # Ensure data directory exists + try: + DATA_DIR.mkdir(parents=True, exist_ok=True) + except Exception as e: + print(f"Warning: Could not create data directory: {e}") + DATABASE_PATH = DATA_DIR / 'fellowship.db' + # Use environment variable if set, otherwise use default path + db_url = os.environ.get('DATABASE_URL') + if db_url: + SQLALCHEMY_DATABASE_URI = db_url + else: + # Use 4 slashes for absolute path: sqlite:////absolute/path + SQLALCHEMY_DATABASE_URI = f'sqlite:///{DATABASE_PATH}' + SQLALCHEMY_TRACK_MODIFICATIONS = False + + # API Configuration + RESTX_MASK_SWAGGER = False + RESTX_VALIDATE = True + RESTX_ERROR_404_HELP = False + + # Azure OpenAI configuration (server-side only) + # Load from environment variables—supply via .env file or container env vars + # DO NOT hardcode API keys or other sensitive values + AZURE_OPENAI_ENDPOINT = os.environ.get('AZURE_OPENAI_ENDPOINT', '').strip() + AZURE_OPENAI_API_KEY = os.environ.get('AZURE_OPENAI_API_KEY', '').strip() + AZURE_OPENAI_DEPLOYMENT = os.environ.get('AZURE_OPENAI_DEPLOYMENT', '').strip() + AZURE_OPENAI_API_VERSION = os.environ.get('AZURE_OPENAI_API_VERSION', '2024-11-20').strip() + AZURE_OPENAI_MAX_TOKENS = int(os.environ.get('AZURE_OPENAI_MAX_TOKENS', '500')) + AZURE_OPENAI_TEMPERATURE = float(os.environ.get('AZURE_OPENAI_TEMPERATURE', '0.85')) + +class DevelopmentConfig(Config): + """Development configuration.""" + DEBUG = True + FLASK_ENV = 'development' + +class ProductionConfig(Config): + """Production configuration.""" + DEBUG = False + FLASK_ENV = 'production' + +# Configuration mapping +config = { + 'development': DevelopmentConfig, + 'production': ProductionConfig, + 'default': DevelopmentConfig +} diff --git a/sut/backend/debug_azure.py b/sut/backend/debug_azure.py new file mode 100644 index 0000000..46e7bbe --- /dev/null +++ b/sut/backend/debug_azure.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +"""Debug script to test Azure OpenAI connection and NPC response generation.""" +import sys +sys.path.insert(0, '/app') + +from flask import Flask +from config import Config + +# Quick config check +config = Config() +print("\n" + "="*70) +print("AZURE OPENAI CONFIG CHECK") +print("="*70) +print(f"Endpoint: {config.AZURE_OPENAI_ENDPOINT}") +print(f"API Key Present: {bool(config.AZURE_OPENAI_API_KEY)}") +print(f"API Key Length: {len(config.AZURE_OPENAI_API_KEY) if config.AZURE_OPENAI_API_KEY else 0}") +print(f"Deployment: {config.AZURE_OPENAI_DEPLOYMENT}") +print(f"API Version: {config.AZURE_OPENAI_API_VERSION}") + +# Try to create client +try: + from openai import AzureOpenAI + print("\n" + "="*70) + print("CREATING AZURE OPENAI CLIENT") + print("="*70) + client = AzureOpenAI( + azure_endpoint=config.AZURE_OPENAI_ENDPOINT, + api_key=config.AZURE_OPENAI_API_KEY, + api_version=config.AZURE_OPENAI_API_VERSION, + ) + print("✅ Client created successfully") + + # Try a simple API call + print("\n" + "="*70) + print("TESTING SIMPLE CHAT COMPLETION") + print("="*70) + response = client.chat.completions.create( + model=config.AZURE_OPENAI_DEPLOYMENT, + messages=[ + {"role": "system", "content": "You are Frodo Baggins. Respond briefly in one sentence."}, + {"role": "user", "content": "Do you like sports?"} + ], + temperature=0.7, + max_tokens=100, + ) + print(f"✅ API Call Successful!") + print(f"\nFrodo's Response: {response.choices[0].message.content}") + +except Exception as e: + print(f"\n✗ ERROR: {type(e).__name__}") + print(f"Details: {str(e)}") + import traceback + traceback.print_exc() + +print("\n" + "="*70) diff --git a/sut/backend/models/__init__.py b/sut/backend/models/__init__.py new file mode 100644 index 0000000..80c7145 --- /dev/null +++ b/sut/backend/models/__init__.py @@ -0,0 +1,9 @@ +"""Database models for the Fellowship Quest Tracker.""" +from .user import User +from .quest import Quest +from .member import Member +from .location import Location +from .item import Item +from .inventory_item import InventoryItem + +__all__ = ['User', 'Quest', 'Member', 'Location', 'Item', 'InventoryItem'] diff --git a/sut/backend/models/__pycache__/__init__.cpython-311.pyc b/sut/backend/models/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..90ed730 Binary files /dev/null and b/sut/backend/models/__pycache__/__init__.cpython-311.pyc differ diff --git a/sut/backend/models/__pycache__/inventory_item.cpython-311.pyc b/sut/backend/models/__pycache__/inventory_item.cpython-311.pyc new file mode 100644 index 0000000..7acb6f4 Binary files /dev/null and b/sut/backend/models/__pycache__/inventory_item.cpython-311.pyc differ diff --git a/sut/backend/models/__pycache__/item.cpython-311.pyc b/sut/backend/models/__pycache__/item.cpython-311.pyc new file mode 100644 index 0000000..6ab6848 Binary files /dev/null and b/sut/backend/models/__pycache__/item.cpython-311.pyc differ diff --git a/sut/backend/models/__pycache__/location.cpython-311.pyc b/sut/backend/models/__pycache__/location.cpython-311.pyc new file mode 100644 index 0000000..0efe2de Binary files /dev/null and b/sut/backend/models/__pycache__/location.cpython-311.pyc differ diff --git a/sut/backend/models/__pycache__/member.cpython-311.pyc b/sut/backend/models/__pycache__/member.cpython-311.pyc new file mode 100644 index 0000000..d7c2d6c Binary files /dev/null and b/sut/backend/models/__pycache__/member.cpython-311.pyc differ diff --git a/sut/backend/models/__pycache__/quest.cpython-311.pyc b/sut/backend/models/__pycache__/quest.cpython-311.pyc new file mode 100644 index 0000000..f09f602 Binary files /dev/null and b/sut/backend/models/__pycache__/quest.cpython-311.pyc differ diff --git a/sut/backend/models/__pycache__/user.cpython-311.pyc b/sut/backend/models/__pycache__/user.cpython-311.pyc new file mode 100644 index 0000000..23c1aa4 Binary files /dev/null and b/sut/backend/models/__pycache__/user.cpython-311.pyc differ diff --git a/sut/backend/models/inventory_item.py b/sut/backend/models/inventory_item.py new file mode 100644 index 0000000..3b59619 --- /dev/null +++ b/sut/backend/models/inventory_item.py @@ -0,0 +1,40 @@ +"""Purchased inventory item model.""" +from models.user import db +from typing import Dict, Any + + +class InventoryItem(db.Model): + """User-owned purchased item entry.""" + + __tablename__ = 'inventory_items' + + id = db.Column(db.Integer, primary_key=True) + user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False, index=True) + item_id = db.Column(db.Integer, db.ForeignKey('items.id'), nullable=False, unique=True) + paid_price = db.Column(db.Integer, nullable=False) + base_price_revealed = db.Column(db.Integer, nullable=False) + savings_percent = db.Column(db.Float, nullable=False) + acquired_price = db.Column(db.Integer, nullable=False, default=0) # Legacy field, set to paid_price + created_at = db.Column(db.DateTime, default=db.func.current_timestamp()) + + user = db.relationship('User', foreign_keys=[user_id], backref='inventory_items') + item = db.relationship('Item', foreign_keys=[item_id], backref='inventory_entry') + + def to_dict(self) -> Dict[str, Any]: + """Serialize full inventory item details.""" + return { + 'id': self.id, + 'user_id': self.user_id, + 'item_id': self.item_id, + 'item_name': self.item.name if self.item else None, + 'owner_character': self.item.owner_character if self.item else None, + 'description': self.item.description if self.item else None, + 'paid_price': self.paid_price, + 'base_price_revealed': self.base_price_revealed, + 'savings_percent': self.savings_percent, + 'acquired_price': self.acquired_price, + 'created_at': self.created_at.isoformat() if self.created_at else None, + } + + def __repr__(self) -> str: + return f'' diff --git a/sut/backend/models/item.py b/sut/backend/models/item.py new file mode 100644 index 0000000..fe82da2 --- /dev/null +++ b/sut/backend/models/item.py @@ -0,0 +1,41 @@ +"""Market item model for NPC bargaining.""" +from models.user import db +from typing import Dict, Any + + +class Item(db.Model): + """Unique sellable item owned by an NPC character.""" + + __tablename__ = 'items' + + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(200), nullable=False) + description = db.Column(db.Text, nullable=True) + owner_character = db.Column(db.String(80), nullable=False, index=True) + personality_profile = db.Column(db.String(40), nullable=False, default='bargainer') + base_price = db.Column(db.Integer, nullable=False) + asking_price = db.Column(db.Integer, nullable=False) + is_sold = db.Column(db.Boolean, nullable=False, default=False) + created_at = db.Column(db.DateTime, default=db.func.current_timestamp()) + updated_at = db.Column( + db.DateTime, + default=db.func.current_timestamp(), + onupdate=db.func.current_timestamp(), + ) + + def to_public_dict(self) -> Dict[str, Any]: + """Serialize without revealing hidden base price.""" + return { + 'id': self.id, + 'name': self.name, + 'description': self.description, + 'owner_character': self.owner_character, + 'personality_profile': self.personality_profile, + 'asking_price': self.asking_price, + 'is_sold': self.is_sold, + 'created_at': self.created_at.isoformat() if self.created_at else None, + 'updated_at': self.updated_at.isoformat() if self.updated_at else None, + } + + def __repr__(self) -> str: + return f'' diff --git a/sut/backend/models/location.py b/sut/backend/models/location.py new file mode 100644 index 0000000..70cbf8c --- /dev/null +++ b/sut/backend/models/location.py @@ -0,0 +1,30 @@ +"""Location model for Middle-earth locations.""" +from models.user import db +from typing import Dict, Any + +class Location(db.Model): + """Location model for Middle-earth locations.""" + __tablename__ = 'locations' + + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(100), nullable=False, unique=True) + description = db.Column(db.Text, nullable=True) + region = db.Column(db.String(100), nullable=False) # Eriador, Rhovanion, Mordor, etc. + map_x = db.Column(db.Float, nullable=True) # X coordinate on map (pixel, 0-5000, horizontal) + map_y = db.Column(db.Float, nullable=True) # Y coordinate on map (pixel, 0-4344, vertical) + created_at = db.Column(db.DateTime, default=db.func.current_timestamp()) + + def to_dict(self) -> Dict[str, Any]: + """Convert location to dictionary.""" + return { + 'id': self.id, + 'name': self.name, + 'description': self.description, + 'region': self.region, + 'map_x': self.map_x, + 'map_y': self.map_y, + 'created_at': self.created_at.isoformat() if self.created_at else None + } + + def __repr__(self) -> str: + return f'' diff --git a/sut/backend/models/member.py b/sut/backend/models/member.py new file mode 100644 index 0000000..092c9df --- /dev/null +++ b/sut/backend/models/member.py @@ -0,0 +1,30 @@ +"""Fellowship member model.""" +from models.user import db +from typing import Dict, Any + +class Member(db.Model): + """Fellowship member model.""" + __tablename__ = 'members' + + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(100), nullable=False, unique=True) + race = db.Column(db.String(50), nullable=False) # Hobbit, Human, Elf, Dwarf, Wizard + role = db.Column(db.String(100), nullable=False) # Ring-bearer, Companion, Ranger, etc. + status = db.Column(db.String(20), nullable=False, default='active') # active, inactive + description = db.Column(db.Text, nullable=True) + created_at = db.Column(db.DateTime, default=db.func.current_timestamp()) + + def to_dict(self) -> Dict[str, Any]: + """Convert member to dictionary.""" + return { + 'id': self.id, + 'name': self.name, + 'race': self.race, + 'role': self.role, + 'status': self.status, + 'description': self.description, + 'created_at': self.created_at.isoformat() if self.created_at else None + } + + def __repr__(self) -> str: + return f'' diff --git a/sut/backend/models/quest.py b/sut/backend/models/quest.py new file mode 100644 index 0000000..df2b477 --- /dev/null +++ b/sut/backend/models/quest.py @@ -0,0 +1,58 @@ +"""Quest model for tracking Fellowship quests.""" +from models.user import db +from datetime import datetime +from typing import Dict, Any, Optional + +class Quest(db.Model): + """Quest model for tracking Fellowship quests.""" + __tablename__ = 'quests' + + id = db.Column(db.Integer, primary_key=True) + title = db.Column(db.String(200), nullable=False) + description = db.Column(db.Text, nullable=True) + status = db.Column(db.String(50), nullable=False, default='not_yet_begun') # not_yet_begun, the_road_goes_ever_on, it_is_done, the_shadow_falls + quest_type = db.Column(db.String(50), nullable=True) # The Journey, The Battle, The Fellowship, The Ring, Dark Magic + priority = db.Column(db.String(20), nullable=True) # Critical, Important, Standard + is_dark_magic = db.Column(db.Boolean, default=False, nullable=False) + assigned_to = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True) + location_id = db.Column(db.Integer, db.ForeignKey('locations.id'), nullable=True) + character_quote = db.Column(db.Text, nullable=True) + created_at = db.Column(db.DateTime, default=db.func.current_timestamp()) + updated_at = db.Column(db.DateTime, default=db.func.current_timestamp(), onupdate=db.func.current_timestamp()) + completed_at = db.Column(db.DateTime, nullable=True) + + # Relationships + assignee = db.relationship('User', foreign_keys=[assigned_to], backref='quests') + location = db.relationship('Location', foreign_keys=[location_id], backref='quests') + + def to_dict(self) -> Dict[str, Any]: + """Convert quest to dictionary.""" + # Map old status values to new LOTR terminology for backward compatibility + status_mapping = { + 'pending': 'not_yet_begun', + 'in_progress': 'the_road_goes_ever_on', + 'completed': 'it_is_done', + 'blocked': 'the_shadow_falls' + } + mapped_status = status_mapping.get(self.status, self.status) + + return { + 'id': self.id, + 'title': self.title, + 'description': self.description, + 'status': mapped_status, + 'quest_type': self.quest_type, + 'priority': self.priority, + 'is_dark_magic': self.is_dark_magic, + 'assigned_to': self.assigned_to, + 'location_id': self.location_id, + 'location_name': self.location.name if self.location else None, + 'assignee_name': self.assignee.username if self.assignee else None, + 'character_quote': self.character_quote, + 'created_at': self.created_at.isoformat() if self.created_at else None, + 'updated_at': self.updated_at.isoformat() if self.updated_at else None, + 'completed_at': self.completed_at.isoformat() if self.completed_at else None + } + + def __repr__(self) -> str: + return f'' diff --git a/sut/backend/models/user.py b/sut/backend/models/user.py new file mode 100644 index 0000000..4e31657 --- /dev/null +++ b/sut/backend/models/user.py @@ -0,0 +1,41 @@ +"""User model for authentication.""" +from flask_sqlalchemy import SQLAlchemy +from werkzeug.security import generate_password_hash, check_password_hash +from typing import Dict, Any + +# Shared db instance for all models +db = SQLAlchemy() + +class User(db.Model): + """User model for authentication.""" + __tablename__ = 'users' + + id = db.Column(db.Integer, primary_key=True) + username = db.Column(db.String(80), unique=True, nullable=False, index=True) + email = db.Column(db.String(120), unique=True, nullable=False) + password_hash = db.Column(db.String(255), nullable=False) + role = db.Column(db.String(50), nullable=False) # Fellowship member name + gold = db.Column(db.Integer, nullable=False, default=500) + created_at = db.Column(db.DateTime, default=db.func.current_timestamp()) + + def set_password(self, password: str) -> None: + """Hash and set password.""" + self.password_hash = generate_password_hash(password, method='pbkdf2:sha256') + + def check_password(self, password: str) -> bool: + """Check if provided password matches hash.""" + return check_password_hash(self.password_hash, password) + + def to_dict(self) -> Dict[str, Any]: + """Convert user to dictionary.""" + return { + 'id': self.id, + 'username': self.username, + 'email': self.email, + 'role': self.role, + 'gold': self.gold, + 'created_at': self.created_at.isoformat() if self.created_at else None + } + + def __repr__(self) -> str: + return f'' diff --git a/sut/backend/requirements.txt b/sut/backend/requirements.txt new file mode 100644 index 0000000..893f1a3 --- /dev/null +++ b/sut/backend/requirements.txt @@ -0,0 +1,10 @@ +Flask==3.0.0 +flask-restx==1.3.0 +flask-cors==4.0.0 +flask-sqlalchemy==3.1.1 +flask-migrate==4.0.5 +werkzeug==3.0.1 +python-dotenv==1.0.0 +bcrypt==4.1.2 +openai==1.3.9 +httpx==0.24.1 diff --git a/sut/backend/routes/__init__.py b/sut/backend/routes/__init__.py new file mode 100644 index 0000000..ff4cf4a --- /dev/null +++ b/sut/backend/routes/__init__.py @@ -0,0 +1 @@ +"""API routes for the Fellowship Quest Tracker.""" diff --git a/sut/backend/routes/__pycache__/__init__.cpython-311.pyc b/sut/backend/routes/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..a2f9f1d Binary files /dev/null and b/sut/backend/routes/__pycache__/__init__.cpython-311.pyc differ diff --git a/sut/backend/routes/__pycache__/auth.cpython-311.pyc b/sut/backend/routes/__pycache__/auth.cpython-311.pyc new file mode 100644 index 0000000..4c9ca9d Binary files /dev/null and b/sut/backend/routes/__pycache__/auth.cpython-311.pyc differ diff --git a/sut/backend/routes/__pycache__/locations.cpython-311.pyc b/sut/backend/routes/__pycache__/locations.cpython-311.pyc new file mode 100644 index 0000000..6d8d042 Binary files /dev/null and b/sut/backend/routes/__pycache__/locations.cpython-311.pyc differ diff --git a/sut/backend/routes/__pycache__/members.cpython-311.pyc b/sut/backend/routes/__pycache__/members.cpython-311.pyc new file mode 100644 index 0000000..7c4d825 Binary files /dev/null and b/sut/backend/routes/__pycache__/members.cpython-311.pyc differ diff --git a/sut/backend/routes/__pycache__/npc_chat.cpython-311.pyc b/sut/backend/routes/__pycache__/npc_chat.cpython-311.pyc new file mode 100644 index 0000000..cbce8a4 Binary files /dev/null and b/sut/backend/routes/__pycache__/npc_chat.cpython-311.pyc differ diff --git a/sut/backend/routes/__pycache__/quests.cpython-311.pyc b/sut/backend/routes/__pycache__/quests.cpython-311.pyc new file mode 100644 index 0000000..34143fc Binary files /dev/null and b/sut/backend/routes/__pycache__/quests.cpython-311.pyc differ diff --git a/sut/backend/routes/__pycache__/shop.cpython-311.pyc b/sut/backend/routes/__pycache__/shop.cpython-311.pyc new file mode 100644 index 0000000..29ba918 Binary files /dev/null and b/sut/backend/routes/__pycache__/shop.cpython-311.pyc differ diff --git a/sut/backend/routes/auth.py b/sut/backend/routes/auth.py new file mode 100644 index 0000000..a491d03 --- /dev/null +++ b/sut/backend/routes/auth.py @@ -0,0 +1,121 @@ +"""Authentication routes.""" +from flask import Blueprint, request, session +from flask_restx import Api, Resource, fields +from models.user import User +from services.auth_service import authenticate_user, register_user +from typing import Dict, Any + +auth_bp = Blueprint('auth', __name__, url_prefix='/api') +auth_api = Api(auth_bp, doc=False, prefix='/auth') + +# Request/Response models for Swagger +login_model = auth_api.model('Login', { + 'username': fields.String(required=True, description='Username'), + 'password': fields.String(required=True, description='Password') +}) + +user_response_model = auth_api.model('UserResponse', { + 'id': fields.Integer(description='User ID'), + 'username': fields.String(description='Username'), + 'email': fields.String(description='Email'), + 'role': fields.String(description='Fellowship member role'), + 'gold': fields.Integer(description='Current gold balance'), +}) + +login_response_model = auth_api.model('LoginResponse', { + 'message': fields.String(description='Success message'), + 'user': fields.Nested(user_response_model, description='User information') +}) + +signup_model = auth_api.model('Signup', { + 'username': fields.String(required=True, description='Desired username (minimum 3 characters)'), + 'password': fields.String(required=True, description='Desired password (minimum 8 characters and at least one number)'), + 'email': fields.String(required=False, description='Optional email address') +}) + + +@auth_api.route('/signup') +class Signup(Resource): + """Public signup endpoint for open SUT registration.""" + + @auth_api.expect(signup_model, validate=False) + @auth_api.response(201, 'Signup successful', login_response_model) + @auth_api.response(400, 'Validation error') + @auth_api.doc(description='Register user and create session') + def post(self) -> tuple[Dict[str, Any], int]: + """Register a user and immediately log them in.""" + data = request.get_json() or {} + + username = data.get('username') + password = data.get('password') + email = data.get('email') + + try: + user = register_user(username=username, password=password, email=email) + except ValueError as error: + return {'error': str(error)}, 400 + + session['user_id'] = user.id + session['username'] = user.username + + return { + 'message': 'Signup successful', + 'user': user.to_dict(), + }, 201 + +@auth_api.route('/login') +class Login(Resource): + """User login endpoint.""" + + @auth_api.expect(login_model) + @auth_api.marshal_with(login_response_model) + @auth_api.doc(description='Authenticate user and create session') + def post(self) -> tuple[Dict[str, Any], int]: + """Login user.""" + data = request.get_json() + username = data.get('username') + password = data.get('password') + + if not username or not password: + return {'error': 'Username and password are required'}, 400 + + user = authenticate_user(username, password) + if not user: + return {'error': 'Invalid credentials'}, 401 + + # Create session + session['user_id'] = user.id + session['username'] = user.username + + return { + 'message': 'Login successful', + 'user': user.to_dict() + }, 200 + +@auth_api.route('/logout') +class Logout(Resource): + """User logout endpoint.""" + + @auth_api.doc(description='Logout user and destroy session') + def post(self) -> tuple[Dict[str, Any], int]: + """Logout user.""" + session.clear() + return {'message': 'Logout successful'}, 200 + +@auth_api.route('/me') +class CurrentUser(Resource): + """Get current authenticated user.""" + + @auth_api.marshal_with(user_response_model) + @auth_api.doc(description='Get current authenticated user information') + def get(self) -> tuple[Dict[str, Any], int]: + """Get current user.""" + user_id = session.get('user_id') + if not user_id: + return {'error': 'Not authenticated'}, 401 + + user = User.query.get(user_id) + if not user: + return {'error': 'User not found'}, 404 + + return user.to_dict(), 200 diff --git a/sut/backend/routes/locations.py b/sut/backend/routes/locations.py new file mode 100644 index 0000000..6f4136d --- /dev/null +++ b/sut/backend/routes/locations.py @@ -0,0 +1,41 @@ +"""Location routes.""" +from flask import Blueprint +from flask_restx import Api, Resource, fields +from models.location import Location +from typing import Dict, Any, List + +locations_bp = Blueprint('locations', __name__, url_prefix='/api') +locations_api = Api(locations_bp, doc=False, prefix='/locations') + +# Response model for Swagger +location_response_model = locations_api.model('LocationResponse', { + 'id': fields.Integer(description='Location ID'), + 'name': fields.String(description='Location name'), + 'description': fields.String(description='Location description'), + 'region': fields.String(description='Region name'), + 'map_x': fields.Float(description='Map X coordinate (pixel)'), + 'map_y': fields.Float(description='Map Y coordinate (pixel)'), + 'created_at': fields.String(description='Creation timestamp') +}) + +@locations_api.route('/') +class LocationList(Resource): + """Location list endpoints.""" + + @locations_api.marshal_list_with(location_response_model) + @locations_api.doc(description='Get all Middle-earth locations') + def get(self) -> tuple[List[Dict[str, Any]], int]: + """Get all locations.""" + locations = Location.query.all() + return [location.to_dict() for location in locations], 200 + +@locations_api.route('/') +class LocationDetail(Resource): + """Location detail endpoints.""" + + @locations_api.marshal_with(location_response_model) + @locations_api.doc(description='Get location by ID') + def get(self, location_id: int) -> tuple[Dict[str, Any], int]: + """Get location by ID.""" + location = Location.query.get_or_404(location_id) + return location.to_dict(), 200 diff --git a/sut/backend/routes/members.py b/sut/backend/routes/members.py new file mode 100644 index 0000000..28f7e14 --- /dev/null +++ b/sut/backend/routes/members.py @@ -0,0 +1,41 @@ +"""Fellowship member routes.""" +from flask import Blueprint +from flask_restx import Api, Resource, fields +from models.member import Member +from typing import Dict, Any, List + +members_bp = Blueprint('members', __name__, url_prefix='/api') +members_api = Api(members_bp, doc=False, prefix='/members') + +# Response model for Swagger +member_response_model = members_api.model('MemberResponse', { + 'id': fields.Integer(description='Member ID'), + 'name': fields.String(description='Member name'), + 'race': fields.String(description='Member race'), + 'role': fields.String(description='Member role'), + 'status': fields.String(description='Member status'), + 'description': fields.String(description='Member description'), + 'created_at': fields.String(description='Creation timestamp') +}) + +@members_api.route('/') +class MemberList(Resource): + """Fellowship member list endpoints.""" + + @members_api.marshal_list_with(member_response_model) + @members_api.doc(description='Get all Fellowship members') + def get(self) -> tuple[List[Dict[str, Any]], int]: + """Get all Fellowship members.""" + members = Member.query.all() + return [member.to_dict() for member in members], 200 + +@members_api.route('/') +class MemberDetail(Resource): + """Fellowship member detail endpoints.""" + + @members_api.marshal_with(member_response_model) + @members_api.doc(description='Get member by ID') + def get(self, member_id: int) -> tuple[Dict[str, Any], int]: + """Get member by ID.""" + member = Member.query.get_or_404(member_id) + return member.to_dict(), 200 diff --git a/sut/backend/routes/npc_chat.py b/sut/backend/routes/npc_chat.py new file mode 100644 index 0000000..2dd8efe --- /dev/null +++ b/sut/backend/routes/npc_chat.py @@ -0,0 +1,174 @@ +"""NPC chat routes backed by Azure AI service.""" +import uuid +from typing import Any, Dict + +from flask import Blueprint, request, session +from flask_restx import Api, Resource, fields + +from models.user import User +from models.quest import Quest, db +from services.npc_chat_service import NpcChatService + +npc_chat_bp = Blueprint('npc_chat', __name__, url_prefix='/api') +npc_chat_api = Api(npc_chat_bp, doc=False, prefix='/chat') + +chat_start_model = npc_chat_api.model('ChatStartRequest', { + 'character': fields.String(required=False, description='frodo|sam|gandalf'), +}) + +chat_message_model = npc_chat_api.model('ChatMessageRequest', { + 'character': fields.String(required=False, description='frodo|sam|gandalf'), + 'message': fields.String(required=True, description='User message'), +}) + +quest_creation_model = npc_chat_api.model('QuestCreationRequest', { + 'character': fields.String(required=False, description='frodo|sam|gandalf - NPC who proposes the quest'), + 'title': fields.String(required=True, description='Quest title'), + 'description': fields.String(required=True, description='Quest description'), + 'quest_type': fields.String(required=True, description='Quest type (The Journey, The Battle, The Fellowship, The Ring, Dark Magic)'), + 'priority': fields.String(required=True, description='Quest priority (Critical, Important, Standard)'), +}) + + +def _require_auth() -> bool: + return session.get('user_id') is not None + + +def _get_current_user() -> User: + user_id = session.get('user_id') + return User.query.get(user_id) + + +def _get_chat_scope_id() -> str: + scope_id = session.get('chat_scope_id') + if not scope_id: + scope_id = uuid.uuid4().hex + session['chat_scope_id'] = scope_id + return scope_id + + +@npc_chat_api.route('/start') +class ChatStart(Resource): + @npc_chat_api.expect(chat_start_model) + def post(self) -> tuple[Dict[str, Any], int]: + if not _require_auth(): + return {'error': 'Authentication required'}, 401 + + user = _get_current_user() + if not user: + return {'error': 'User not found'}, 404 + + data = request.get_json() or {} + scope_id = _get_chat_scope_id() + payload = NpcChatService.start_conversation( + user_id=user.id, + username=user.username, + character=data.get('character'), + scope_id=scope_id, + ) + return payload, 200 + + +@npc_chat_api.route('/message') +class ChatMessage(Resource): + @npc_chat_api.expect(chat_message_model) + def post(self) -> tuple[Dict[str, Any], int]: + if not _require_auth(): + return {'error': 'Authentication required'}, 401 + + user = _get_current_user() + if not user: + return {'error': 'User not found'}, 404 + + data = request.get_json() or {} + message = (data.get('message') or '').strip() + if not message: + return {'error': 'message is required'}, 400 + + scope_id = _get_chat_scope_id() + payload = NpcChatService.send_message( + user_id=user.id, + username=user.username, + character=data.get('character'), + user_message=message, + scope_id=scope_id, + ) + return payload, 200 + + +@npc_chat_api.route('/session') +class ChatSession(Resource): + def get(self) -> tuple[Dict[str, Any], int]: + if not _require_auth(): + return {'error': 'Authentication required'}, 401 + + user = _get_current_user() + if not user: + return {'error': 'User not found'}, 404 + + character = request.args.get('character') + scope_id = _get_chat_scope_id() + payload = NpcChatService.get_session(user_id=user.id, character=character, scope_id=scope_id) + return payload, 200 + + +@npc_chat_api.route('/reset') +class ChatReset(Resource): + @npc_chat_api.expect(chat_start_model) + def post(self) -> tuple[Dict[str, Any], int]: + if not _require_auth(): + return {'error': 'Authentication required'}, 401 + + user = _get_current_user() + if not user: + return {'error': 'User not found'}, 404 + + data = request.get_json() or {} + scope_id = _get_chat_scope_id() + payload = NpcChatService.reset_session(user_id=user.id, character=data.get('character'), scope_id=scope_id) + return payload, 200 + + +@npc_chat_api.route('/create_quest') +class ChatCreateQuest(Resource): + """Create a quest from NPC chat interaction.""" + + @npc_chat_api.expect(quest_creation_model) + def post(self) -> tuple[Dict[str, Any], int]: + """Create a quest proposed by an NPC. + + This endpoint allows the frontend to persist a suggested quest + that was generated during NPC chat. + """ + if not _require_auth(): + return {'error': 'Authentication required'}, 401 + + user = _get_current_user() + if not user: + return {'error': 'User not found'}, 404 + + data = request.get_json() or {} + + # Validate required fields + required_fields = ['title', 'description', 'quest_type', 'priority'] + if not all(data.get(field) for field in required_fields): + return {'error': 'Missing required fields: title, description, quest_type, priority'}, 400 + + # Create the quest + quest = Quest( + title=data.get('title'), + description=data.get('description'), + quest_type=data.get('quest_type'), + priority=data.get('priority'), + is_dark_magic=data.get('is_dark_magic', False), + assigned_to=user.id, + location_id=data.get('location_id'), + ) + + db.session.add(quest) + db.session.commit() + + return { + 'quest': quest.to_dict(), + 'message': f'{data.get("character", "An NPC")} has created a quest for you!', + }, 201 diff --git a/sut/backend/routes/quests.py b/sut/backend/routes/quests.py new file mode 100644 index 0000000..90f0a96 --- /dev/null +++ b/sut/backend/routes/quests.py @@ -0,0 +1,237 @@ +"""Quest routes.""" +from flask import Blueprint, request, jsonify, session +from flask_restx import Api, Resource, fields +from models.quest import Quest, db +from models.user import User +from datetime import datetime +from typing import Dict, Any, List, Optional + +quests_bp = Blueprint('quests', __name__, url_prefix='/api') +quests_api = Api(quests_bp, doc=False, prefix='/quests') + +# Request/Response models for Swagger +quest_model = quests_api.model('Quest', { + 'title': fields.String(required=True, description='Quest title'), + 'description': fields.String(description='Quest description'), + 'status': fields.String(description='Quest status (not_yet_begun, the_road_goes_ever_on, it_is_done, the_shadow_falls)'), + 'quest_type': fields.String(description='Quest type (The Journey, The Battle, The Fellowship, The Ring, Dark Magic)'), + 'priority': fields.String(description='Quest priority (Critical, Important, Standard)'), + 'is_dark_magic': fields.Boolean(description='Dark magic flag'), + 'assigned_to': fields.Integer(description='User ID of assignee'), + 'location_id': fields.Integer(description='Location ID'), + 'character_quote': fields.String(description='Character quote for completion') +}) + +quest_response_model = quests_api.model('QuestResponse', { + 'id': fields.Integer(description='Quest ID'), + 'title': fields.String(description='Quest title'), + 'description': fields.String(description='Quest description'), + 'status': fields.String(description='Quest status'), + 'quest_type': fields.String(description='Quest type'), + 'priority': fields.String(description='Quest priority'), + 'is_dark_magic': fields.Boolean(description='Dark magic flag'), + 'assigned_to': fields.Integer(description='User ID of assignee'), + 'location_id': fields.Integer(description='Location ID'), + 'location_name': fields.String(description='Location name'), + 'assignee_name': fields.String(description='Assignee username'), + 'character_quote': fields.String(description='Character quote'), + 'created_at': fields.String(description='Creation timestamp'), + 'updated_at': fields.String(description='Update timestamp'), + 'completed_at': fields.String(description='Completion timestamp'), + 'gold_reward': fields.Integer(description='Gold reward granted for quest completion'), + 'current_gold': fields.Integer(description='Current gold total for the authenticated user'), + 'message': fields.String(description='Success message for quest completion') +}) + +def require_auth() -> bool: + """Check if user is authenticated.""" + return session.get('user_id') is not None + + +def _reward_for_priority(priority: Optional[str]) -> int: + rewards = { + 'Critical': 100, + 'Important': 60, + 'Standard': 40, + } + return rewards.get(priority or '', 50) + +@quests_api.route('/') +class QuestList(Resource): + """Quest list endpoints.""" + + @quests_api.marshal_list_with(quest_response_model) + @quests_api.doc(description='Get all quests with optional filtering') + def get(self) -> tuple[List[Dict[str, Any]], int]: + """Get all quests with optional filtering.""" + query = Quest.query + + # Filter by status + status = request.args.get('status') + if status: + # Map old status values for backward compatibility + status_mapping = { + 'pending': 'not_yet_begun', + 'in_progress': 'the_road_goes_ever_on', + 'completed': 'it_is_done', + 'blocked': 'the_shadow_falls' + } + mapped_status = status_mapping.get(status, status) + query = query.filter(Quest.status == mapped_status) + + # Filter by quest type + quest_type = request.args.get('quest_type') + if quest_type: + query = query.filter(Quest.quest_type == quest_type) + + # Filter by priority + priority = request.args.get('priority') + if priority: + query = query.filter(Quest.priority == priority) + + # Filter by dark magic + dark_magic = request.args.get('dark_magic') + if dark_magic is not None: + is_dark_magic = dark_magic.lower() == 'true' + query = query.filter(Quest.is_dark_magic == is_dark_magic) + + # Filter by location + location_id = request.args.get('location_id') + if location_id: + query = query.filter(Quest.location_id == int(location_id)) + + # Filter by assigned user + assigned_to = request.args.get('assigned_to') + if assigned_to: + query = query.filter(Quest.assigned_to == int(assigned_to)) + + quests = query.all() + return [quest.to_dict() for quest in quests], 200 + + @quests_api.expect(quest_model) + @quests_api.marshal_with(quest_response_model) + @quests_api.doc(description='Create a new quest', security='session') + def post(self) -> tuple[Dict[str, Any], int]: + """Create a new quest.""" + if not require_auth(): + return {'error': 'Authentication required'}, 401 + + data = request.get_json() + + # Map old status values for backward compatibility + status = data.get('status', 'not_yet_begun') + status_mapping = { + 'pending': 'not_yet_begun', + 'in_progress': 'the_road_goes_ever_on', + 'completed': 'it_is_done', + 'blocked': 'the_shadow_falls' + } + mapped_status = status_mapping.get(status, status) + + quest = Quest( + title=data.get('title'), + description=data.get('description'), + status=mapped_status, + quest_type=data.get('quest_type'), + priority=data.get('priority'), + is_dark_magic=data.get('is_dark_magic', False), + character_quote=data.get('character_quote'), + assigned_to=data.get('assigned_to'), + location_id=data.get('location_id') + ) + + db.session.add(quest) + db.session.commit() + + return quest.to_dict(), 201 + +@quests_api.route('/') +class QuestDetail(Resource): + """Quest detail endpoints.""" + + @quests_api.marshal_with(quest_response_model) + @quests_api.doc(description='Get quest by ID') + def get(self, quest_id: int) -> tuple[Dict[str, Any], int]: + """Get quest by ID.""" + quest = Quest.query.get_or_404(quest_id) + return quest.to_dict(), 200 + + @quests_api.expect(quest_model) + @quests_api.marshal_with(quest_response_model) + @quests_api.doc(description='Update quest', security='session') + def put(self, quest_id: int) -> tuple[Dict[str, Any], int]: + """Update quest.""" + if not require_auth(): + return {'error': 'Authentication required'}, 401 + + quest = Quest.query.get_or_404(quest_id) + data = request.get_json() + + quest.title = data.get('title', quest.title) + quest.description = data.get('description', quest.description) + + # Map old status values for backward compatibility + if 'status' in data: + status = data.get('status') + status_mapping = { + 'pending': 'not_yet_begun', + 'in_progress': 'the_road_goes_ever_on', + 'completed': 'it_is_done', + 'blocked': 'the_shadow_falls' + } + quest.status = status_mapping.get(status, status) + + quest.quest_type = data.get('quest_type', quest.quest_type) + quest.priority = data.get('priority', quest.priority) + quest.is_dark_magic = data.get('is_dark_magic', quest.is_dark_magic) + quest.character_quote = data.get('character_quote', quest.character_quote) + quest.assigned_to = data.get('assigned_to', quest.assigned_to) + quest.location_id = data.get('location_id', quest.location_id) + + db.session.commit() + return quest.to_dict(), 200 + + @quests_api.doc(description='Delete quest', security='session') + def delete(self, quest_id: int) -> tuple[Dict[str, Any], int]: + """Delete quest.""" + if not require_auth(): + return {'error': 'Authentication required'}, 401 + + quest = Quest.query.get_or_404(quest_id) + db.session.delete(quest) + db.session.commit() + + return {'message': 'Quest deleted successfully'}, 200 + +@quests_api.route('//complete') +class QuestComplete(Resource): + """Quest completion endpoint.""" + + @quests_api.marshal_with(quest_response_model) + @quests_api.doc(description='Mark quest as complete', security='session') + def put(self, quest_id: int) -> tuple[Dict[str, Any], int]: + """Mark quest as complete.""" + if not require_auth(): + return {'error': 'Authentication required'}, 401 + + quest = Quest.query.get_or_404(quest_id) + + # Set status to completed + quest.status = 'it_is_done' + quest.completed_at = datetime.utcnow() + + user_id = session.get('user_id') + current_user = User.query.get(user_id) if user_id else None + reward = _reward_for_priority(quest.priority) + if current_user: + current_user.gold = (current_user.gold or 0) + reward + + db.session.commit() + + # Return quest with completion message + result = quest.to_dict() + result['gold_reward'] = reward + result['current_gold'] = current_user.gold if current_user else None + result['message'] = f'The Quest Is Done! You earned {reward} Gold.' + + return result, 200 diff --git a/sut/backend/routes/shop.py b/sut/backend/routes/shop.py new file mode 100644 index 0000000..85e773f --- /dev/null +++ b/sut/backend/routes/shop.py @@ -0,0 +1,133 @@ +"""Shop routes for bargaining market gameplay.""" +from typing import Any, Dict, Optional + +from flask import Blueprint, request, session +from flask_restx import Api, Resource, fields + +from models.user import User +from services.shop_service import ShopService + + +shop_bp = Blueprint('shop', __name__, url_prefix='/api') +shop_api = Api(shop_bp, doc=False, prefix='/shop') + +purchase_model = shop_api.model('ShopPurchaseRequest', { + 'item_id': fields.Integer(required=True, description='Unique item ID'), + 'paid_price': fields.Integer(required=True, description='Agreed paid price'), +}) + + +def _require_auth() -> bool: + return session.get('user_id') is not None + + +def _get_current_user() -> Optional[User]: + user_id = session.get('user_id') + if not user_id: + return None + return User.query.get(user_id) + + +@shop_api.route('/items') +class ShopItems(Resource): + def get(self) -> tuple[Dict[str, Any], int]: + if not _require_auth(): + return {'error': 'Authentication required'}, 401 + + character = (request.args.get('character') or '').strip().lower() or None + items = ShopService.list_available_items(character=character) + return {'items': items}, 200 + + +@shop_api.route('/items/') +class ShopItemDetail(Resource): + def get(self, item_id: int) -> tuple[Dict[str, Any], int]: + if not _require_auth(): + return {'error': 'Authentication required'}, 401 + + item = ShopService.get_item_public(item_id) + if not item: + return {'error': 'Item not found'}, 404 + return {'item': item}, 200 + + +@shop_api.route('/purchase') +class ShopPurchase(Resource): + @shop_api.expect(purchase_model) + def post(self) -> tuple[Dict[str, Any], int]: + if not _require_auth(): + return {'error': 'Authentication required'}, 401 + + user = _get_current_user() + if not user: + return {'error': 'User not found'}, 404 + + payload = request.get_json() or {} + item_id = payload.get('item_id') + paid_price = payload.get('paid_price') + + if not item_id or paid_price is None: + return {'error': 'item_id and paid_price are required'}, 400 + + try: + result = ShopService.purchase_item(user_id=user.id, item_id=int(item_id), paid_price=int(paid_price)) + return result, 200 + except ValueError as error: + return {'error': str(error)}, 400 + + +@shop_api.route('/inventory') +class ShopInventory(Resource): + def get(self) -> tuple[Dict[str, Any], int]: + if not _require_auth(): + return {'error': 'Authentication required'}, 401 + + user = _get_current_user() + if not user: + return {'error': 'User not found'}, 404 + + inventory = ShopService.get_user_inventory(user.id) + return {'inventory': inventory}, 200 + + +@shop_api.route('/stats') +class ShopStats(Resource): + def get(self) -> tuple[Dict[str, Any], int]: + if not _require_auth(): + return {'error': 'Authentication required'}, 401 + + user = _get_current_user() + if not user: + return {'error': 'User not found'}, 404 + + stats = ShopService.get_user_stats(user.id) + return {'stats': stats}, 200 + + +@shop_api.route('/balance') +class ShopBalance(Resource): + def get(self) -> tuple[Dict[str, Any], int]: + if not _require_auth(): + return {'error': 'Authentication required'}, 401 + + user = _get_current_user() + if not user: + return {'error': 'User not found'}, 404 + + return ShopService.get_balance(user.id), 200 + + +@shop_api.route('/test-reset') +class TestReset(Resource): + """Reset shop state for testing - marks all items as not sold and resets user gold.""" + def post(self) -> tuple[Dict[str, Any], int]: + import os + # Only allow in non-production environments + if os.getenv('FLASK_ENV') in {'production', 'prod'}: + return {'error': 'Test reset not allowed in production'}, 403 + + try: + ShopService.reset_for_tests() + return {'success': True, 'message': 'Test state reset successfully'}, 200 + except Exception as e: + return {'error': str(e)}, 500 diff --git a/sut/backend/services/__init__.py b/sut/backend/services/__init__.py new file mode 100644 index 0000000..944069b --- /dev/null +++ b/sut/backend/services/__init__.py @@ -0,0 +1 @@ +"""Service modules for business logic.""" diff --git a/sut/backend/services/__pycache__/__init__.cpython-311.pyc b/sut/backend/services/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..86b494e Binary files /dev/null and b/sut/backend/services/__pycache__/__init__.cpython-311.pyc differ diff --git a/sut/backend/services/__pycache__/auth_service.cpython-311.pyc b/sut/backend/services/__pycache__/auth_service.cpython-311.pyc new file mode 100644 index 0000000..0d26f82 Binary files /dev/null and b/sut/backend/services/__pycache__/auth_service.cpython-311.pyc differ diff --git a/sut/backend/services/__pycache__/bargaining_algorithm.cpython-311.pyc b/sut/backend/services/__pycache__/bargaining_algorithm.cpython-311.pyc new file mode 100644 index 0000000..8fc7fc5 Binary files /dev/null and b/sut/backend/services/__pycache__/bargaining_algorithm.cpython-311.pyc differ diff --git a/sut/backend/services/__pycache__/bargaining_config.cpython-311.pyc b/sut/backend/services/__pycache__/bargaining_config.cpython-311.pyc new file mode 100644 index 0000000..2bf88eb Binary files /dev/null and b/sut/backend/services/__pycache__/bargaining_config.cpython-311.pyc differ diff --git a/sut/backend/services/__pycache__/character_profiles.cpython-311.pyc b/sut/backend/services/__pycache__/character_profiles.cpython-311.pyc new file mode 100644 index 0000000..4953123 Binary files /dev/null and b/sut/backend/services/__pycache__/character_profiles.cpython-311.pyc differ diff --git a/sut/backend/services/__pycache__/negotiation_logger.cpython-311.pyc b/sut/backend/services/__pycache__/negotiation_logger.cpython-311.pyc new file mode 100644 index 0000000..9a19cca Binary files /dev/null and b/sut/backend/services/__pycache__/negotiation_logger.cpython-311.pyc differ diff --git a/sut/backend/services/__pycache__/npc_chat_service.cpython-311.pyc b/sut/backend/services/__pycache__/npc_chat_service.cpython-311.pyc new file mode 100644 index 0000000..2dc3e8f Binary files /dev/null and b/sut/backend/services/__pycache__/npc_chat_service.cpython-311.pyc differ diff --git a/sut/backend/services/__pycache__/quest_generation_service.cpython-311.pyc b/sut/backend/services/__pycache__/quest_generation_service.cpython-311.pyc new file mode 100644 index 0000000..3f9735c Binary files /dev/null and b/sut/backend/services/__pycache__/quest_generation_service.cpython-311.pyc differ diff --git a/sut/backend/services/__pycache__/shop_service.cpython-311.pyc b/sut/backend/services/__pycache__/shop_service.cpython-311.pyc new file mode 100644 index 0000000..70c005e Binary files /dev/null and b/sut/backend/services/__pycache__/shop_service.cpython-311.pyc differ diff --git a/sut/backend/services/auth_service.py b/sut/backend/services/auth_service.py new file mode 100644 index 0000000..d471ad0 --- /dev/null +++ b/sut/backend/services/auth_service.py @@ -0,0 +1,65 @@ +"""Authentication service.""" +from models.user import User, db +from sqlalchemy import func +from typing import Optional + + +def _normalize_username(username: str) -> str: + return (username or '').strip() + +def authenticate_user(username: str, password: str) -> Optional[User]: + """Authenticate a user by username and password.""" + normalized_username = _normalize_username(username) + if not normalized_username or not password: + return None + + user = User.query.filter(func.lower(User.username) == normalized_username.lower()).first() + if user and user.check_password(password): + return user + return None + +def get_user_by_id(user_id: int) -> Optional[User]: + """Get user by ID.""" + return User.query.get(user_id) + +def get_user_by_username(username: str) -> Optional[User]: + """Get user by username.""" + normalized_username = _normalize_username(username) + if not normalized_username: + return None + return User.query.filter(func.lower(User.username) == normalized_username.lower()).first() + + +def register_user(username: str, password: str, email: Optional[str] = None) -> User: + """Register a new user with basic defaults for public SUT usage.""" + normalized_username = _normalize_username(username) + normalized_password = (password or '').strip() + + if not normalized_username or not normalized_password: + raise ValueError('Username and password are required') + + if len(normalized_username) < 3: + raise ValueError('Username must be at least 3 characters long') + + if len(normalized_password) < 8 or not any(char.isdigit() for char in normalized_password): + raise ValueError('Password must be at least 8 characters and contain at least one number') + + if get_user_by_username(normalized_username): + raise ValueError('Username already exists') + + normalized_email = (email or '').strip().lower() or f'{normalized_username.lower()}@testingfantasy.local' + existing_email = User.query.filter_by(email=normalized_email).first() + if existing_email: + raise ValueError('Email is already in use') + + user = User( + username=normalized_username, + email=normalized_email, + role=normalized_username, # Use username as role/character name + gold=500, + ) + user.set_password(normalized_password) + + db.session.add(user) + db.session.commit() + return user diff --git a/sut/backend/services/bargaining_algorithm.py b/sut/backend/services/bargaining_algorithm.py new file mode 100644 index 0000000..e087dc9 --- /dev/null +++ b/sut/backend/services/bargaining_algorithm.py @@ -0,0 +1,337 @@ +"""Bargaining algorithm for NPC negotiation.""" +from __future__ import annotations + +import json +import logging +import random +from typing import Any, Dict, List, Optional +from enum import Enum + +logger = logging.getLogger(__name__) + + +class NegotiationResult(str, Enum): + """Possible outcomes of a negotiation.""" + COUNTER_OFFER = "counter-offer" + OFFER_ACCEPTED = "offer-accepted" + OFFER_REJECTED = "offer-rejected" + STOP_BARGAIN = "stop-bargain" + + +class BargainingAlgorithm: + """ + Hybrid bargaining algorithm that evaluates user offers based on character traits. + + Algorithm evaluates: + - Character personality (patience, concession rate, boredom threshold, accept ratio) + - Current mood (affected by user actions) + - External events (randomness factor) + - Flattery detection (user behavior trigger) + - Round count (max rounds per character) + """ + + # Default personality profiles indexed by character + PERSONALITY_PROFILES = { + "frodo": { + "patience": 5, + "concession": 0.12, + "boredom": 0.08, + "accept_ratio": 0.92, + "max_rounds": 6, + "generosity_on_flatter": 0.05, # 5% better offer when flattered + }, + "sam": { + "patience": 4, + "concession": 0.10, + "boredom": 0.10, + "accept_ratio": 0.95, + "max_rounds": 5, + "generosity_on_flatter": 0.04, + }, + "gandalf": { + "patience": 6, + "concession": 0.15, + "boredom": 0.05, + "accept_ratio": 0.90, + "max_rounds": 7, + "generosity_on_flatter": 0.06, + }, + } + + @classmethod + def evaluate_offer( + cls, + user_offer: int, + current_ask: int, + character: str, + round_num: int, + is_flattered: bool = False, + mood_modifiers: Optional[Dict[str, float]] = None, + user_message: Optional[str] = None, + ) -> Dict[str, Any]: + """ + Evaluate a user's offer or message against the NPC's negotiation state. + + Args: + user_offer: The amount offered by the user + current_ask: The NPC's current asking price + character: The NPC character name + round_num: Current negotiation round (0-based) + is_flattered: Whether the user flattered the character + mood_modifiers: Optional mood adjustments (e.g., {"patience": -1, "boredom": +0.1}) + user_message: The raw user message (for 'deal' detection) + + Returns: + Dict containing: + - result: NegotiationResult enum value + - counter_offer: New ask price (if counter-offer) + - context: Debug context about the decision + """ + profile = cls.PERSONALITY_PROFILES.get(character, cls.PERSONALITY_PROFILES["gandalf"]) + + # Apply mood modifiers if provided + patience = profile["patience"] + boredom = profile["boredom"] + + if mood_modifiers: + patience += mood_modifiers.get("patience", 0) + boredom += mood_modifiers.get("boredom", 0) + boredom = max(0, min(1, boredom)) # Clamp to [0, 1] + + # If user says 'deal', accept at current ask + if user_message and user_message.strip().lower() in {"deal", "i'll take it", "i will take it", "buy", "buy it", "accept"}: + return { + "result": NegotiationResult.OFFER_ACCEPTED, + "counter_offer": None, + "context": { + "reason": "user_said_deal", + "user_offer": user_offer, + "current_ask": current_ask, + }, + } + + # Check if max rounds exceeded + if round_num >= profile["max_rounds"]: + return { + "result": NegotiationResult.STOP_BARGAIN, + "counter_offer": None, + "context": { + "reason": "max_rounds_exceeded", + "round_num": round_num, + "max_rounds": profile["max_rounds"], + }, + } + + # Calculate acceptance threshold + # Flattered characters are slightly more generous + accept_ratio = profile["accept_ratio"] + if is_flattered: + accept_ratio -= profile["generosity_on_flatter"] + + # Check if offer is acceptable + if user_offer >= int(current_ask * accept_ratio): + return { + "result": NegotiationResult.OFFER_ACCEPTED, + "counter_offer": None, + "context": { + "reason": "offer_acceptable", + "user_offer": user_offer, + "threshold": int(current_ask * accept_ratio), + "is_flattered": is_flattered, + }, + } + + # Check for lucky drop (long negotiation can result in sudden price drop) + long_negotiation_threshold = max(3, patience) + if round_num >= long_negotiation_threshold and random.random() < 0.10: + lucky_price = max(user_offer, int(current_ask * 0.60)) + return { + "result": NegotiationResult.COUNTER_OFFER, + "counter_offer": lucky_price, + "context": { + "reason": "lucky_drop", + "round_num": round_num, + "patience_threshold": long_negotiation_threshold, + "message_hint": "user_wore_down_character", + }, + } + + # Check if character is bored and refuses + if round_num >= patience and random.random() < boredom: + return { + "result": NegotiationResult.STOP_BARGAIN, + "counter_offer": None, + "context": { + "reason": "boredom_threshold", + "round_num": round_num, + "patience": patience, + "boredom_roll": boredom, + }, + } + + # Counter-offer: concede a bit, but never below user's offer + concession_amount = max(1, int(current_ask * profile["concession"])) + floor_price = max(user_offer, int(current_ask * 0.65)) # Don't go below user's offer or 65% of current ask + new_ask = max(floor_price, current_ask - concession_amount) + + return { + "result": NegotiationResult.COUNTER_OFFER, + "counter_offer": new_ask, + "context": { + "reason": "counter_offer", + "round_num": round_num, + "original_ask": current_ask, + "concession_amount": concession_amount, + "floor_price": floor_price, + "is_flattered": is_flattered, + "user_offer": user_offer, + }, + } + + @classmethod + def detect_flattery(cls, user_message: str) -> bool: + """ + Detect flattery in user's message. + + Looks for phrases indicating compliments, admiration, or flattery. + This is visible to backend only; LLM can add more sophisticated detection. + """ + message_lower = user_message.lower().strip() + + flattery_keywords = [ + "amazing", + "beautiful", + "brave", + "brilliant", + "clever", + "exceptional", + "excellent", + "extraordinary", + "fabulous", + "fantastic", + "fine", + "glorious", + "graceful", + "great", + "handsome", + "impressive", + "incredible", + "intelligent", + "magnificent", + "marvelous", + "noble", + "outstanding", + "powerful", + "remarkable", + "skilled", + "splendid", + "superb", + "talented", + "tremendous", + "wonderful", + "you are", + "you're", + "you seem", + "that's great", + "that's amazing", + "i admire", + "i respect", + "very wise", + "very kind", + "very clever", + "very brave", + ] + + # Simple keyword matching + return any(keyword in message_lower for keyword in flattery_keywords) + + @classmethod + def calculate_mood_change( + cls, + previous_offer: Optional[int], + current_offer: int, + current_ask: int, + ) -> Dict[str, float]: + """ + Calculate mood changes based on user actions. + + Returns mood modifiers that should be applied to the negotiation profile. + + Examples: + - Repeated very low offers -> negative mood (more patient but bored) + - Fair offers -> positive mood + - Rapidly increasing offers -> positive mood + """ + modifiers = {} + + if previous_offer is not None: + offer_delta = current_offer - previous_offer + offer_ratio = current_offer / current_ask if current_ask > 0 else 0 + + # If user is insultingly low (< 30% of ask), character gets annoyed + if offer_ratio < 0.30: + modifiers["boredom"] = 0.05 # Increases boredom + modifiers["patience"] = -1 # Decreases patience + # If offer is fair (50-80% of ask), character is encouraged + elif 0.50 <= offer_ratio <= 0.80: + modifiers["boredom"] = -0.03 # Decreases boredom + # If user is increasing offers, character is pleased + elif offer_delta > 0: + modifiers["boredom"] = -0.02 + + return modifiers + + @classmethod + def get_summary_for_llm( + cls, + negotiation_state: Dict[str, Any], + algorithm_result: Dict[str, Any], + user_offer: int, + character_personality: str, + is_flattered: bool, + mood_modifiers: Dict[str, float], + ) -> Dict[str, Any]: + """ + Generate a JSON summary to pass to the LLM for natural language generation. + + Only includes relevant fields for the current negotiation turn. + """ + profile = cls.PERSONALITY_PROFILES.get( + negotiation_state.get("character", "gandalf"), + cls.PERSONALITY_PROFILES["gandalf"] + ) + + summary: Dict[str, Any] = { + "character": negotiation_state.get("character"), + "item_name": negotiation_state.get("item_name"), + "item_id": negotiation_state.get("item_id"), + "original_price": negotiation_state.get("original_price"), + "current_ask": negotiation_state.get("current_ask"), + "user_offer": user_offer, + "round": negotiation_state.get("round"), + "character_personality_type": character_personality, + "is_flattered": is_flattered, + } + + # Add algorithm result based on type + result_type = algorithm_result.get("result") + if result_type == NegotiationResult.COUNTER_OFFER: + summary["negotiation_result"] = "counter-offer" + summary["counter_offer"] = algorithm_result.get("counter_offer") + elif result_type == NegotiationResult.OFFER_ACCEPTED: + summary["negotiation_result"] = "offer-accepted" + elif result_type == NegotiationResult.OFFER_REJECTED: + summary["negotiation_result"] = "offer-rejected" + elif result_type == NegotiationResult.STOP_BARGAIN: + summary["negotiation_result"] = "stop-bargain" + summary["stop_reason"] = algorithm_result.get("context", {}).get("reason") + + # Add mood context if modifiers present + if mood_modifiers: + summary["mood_context"] = mood_modifiers + + # Only include negotiation_style if applicable + if "negotiation_style" in negotiation_state: + summary["user_negotiation_style"] = negotiation_state["negotiation_style"] + + return summary diff --git a/sut/backend/services/bargaining_config.py b/sut/backend/services/bargaining_config.py new file mode 100644 index 0000000..e354898 --- /dev/null +++ b/sut/backend/services/bargaining_config.py @@ -0,0 +1,157 @@ +"""Configuration management for bargaining system via AWS Parameter Store.""" +import json +import logging +from typing import Any, Dict, Optional +from functools import lru_cache +import os + +logger = logging.getLogger(__name__) + + +class BargainingConfig: + """ + Load and manage bargaining configuration. + + Configuration can come from: + 1. AWS Parameter Store (for runtime updates) + 2. Environment variables (for local dev) + 3. Default values (hardcoded) + + For now, uses environment variables. AWS Parameter Store integration + can be added later. + """ + + # Default configuration values + DEFAULT_CONFIG = { + "flattery_bonus_percent": 0.05, # 5% better offer when flattered + "max_negotiation_rounds": { + "frodo": 6, + "sam": 5, + "gandalf": 7, + }, + "mood_change_probabilities": { + "boredom_on_low_offer": 0.10, # 10% chance to increase boredom + "lucky_drop_chance": 0.10, # 10% chance of sudden price drop + }, + "logging_enabled": True, + "log_retention_days": 30, + "flattery_only_once_per_negotiation": True, + } + + _config_cache: Optional[Dict[str, Any]] = None + + @classmethod + def load_config(cls, force_reload: bool = False) -> Dict[str, Any]: + """ + Load configuration from AWS Parameter Store or environment. + + Args: + force_reload: If True, bypass cache and reload from source + + Returns: + Configuration dictionary + """ + if cls._config_cache and not force_reload: + return cls._config_cache + + config = cls.DEFAULT_CONFIG.copy() + + # Try to load from AWS Parameter Store + aws_config = cls._load_from_aws_parameter_store() + if aws_config: + config.update(aws_config) + logger.info("✓ Loaded bargaining config from AWS Parameter Store") + else: + # Fall back to environment variables + env_config = cls._load_from_environment() + if env_config: + config.update(env_config) + logger.info("✓ Loaded bargaining config from environment variables") + else: + logger.info("✓ Using default bargaining configuration") + + cls._config_cache = config + return config + + @classmethod + def _load_from_aws_parameter_store(cls) -> Optional[Dict[str, Any]]: + """Load configuration from AWS Systems Manager Parameter Store.""" + try: + import boto3 + ssm_client = boto3.client("ssm") + + param_name = os.getenv("BARGAINING_CONFIG_PARAM", "/fellowship/bargaining/config") + + try: + response = ssm_client.get_parameter( + Name=param_name, + WithDecryption=False + ) + config_str = response["Parameter"]["Value"] + config = json.loads(config_str) + return config + except ssm_client.exceptions.ParameterNotFound: + logger.debug(f"Parameter {param_name} not found in Parameter Store") + return None + except (ImportError, Exception) as e: + logger.debug(f"Could not load from AWS Parameter Store: {type(e).__name__}") + return None + + @classmethod + def _load_from_environment(cls) -> Optional[Dict[str, Any]]: + """Load configuration from environment variables.""" + config = {} + + # Try to load BARGAINING_CONFIG_JSON env var + config_json = os.getenv("BARGAINING_CONFIG_JSON") + if config_json: + try: + env_config = json.loads(config_json) + return env_config + except json.JSONDecodeError: + logger.warning("Invalid JSON in BARGAINING_CONFIG_JSON env var") + + return None if not config else config + + @classmethod + def get(cls, key: str, default: Any = None) -> Any: + """ + Get a configuration value by key path (dot-notation supported). + + Example: config.get("mood_change_probabilities.lucky_drop_chance") + """ + config = cls.load_config() + + if "." in key: + parts = key.split(".") + value = config + for part in parts: + if isinstance(value, dict): + value = value.get(part) + else: + return default + return value if value is not None else default + + return config.get(key, default) + + @classmethod + def get_character_config(cls, character: str) -> Dict[str, Any]: + """Get configuration for a specific character.""" + config = cls.load_config() + + # Return character-specific config if it exists + if "character_configs" in config and character in config["character_configs"]: + return config["character_configs"][character] + + # Fall back to defaults + return { + "max_rounds": config["max_negotiation_rounds"].get( + character, config["max_negotiation_rounds"]["gandalf"] + ), + "flattery_bonus": config["flattery_bonus_percent"], + } + + @classmethod + def clear_cache(cls) -> None: + """Clear configuration cache (useful for testing).""" + cls._config_cache = None diff --git a/sut/backend/services/character_profiles.py b/sut/backend/services/character_profiles.py new file mode 100644 index 0000000..f5f667e --- /dev/null +++ b/sut/backend/services/character_profiles.py @@ -0,0 +1,253 @@ +"""LOTR Character profiles for immersive NPC interactions. + +Each character has: +- personality: Core behavioral traits +- mannerisms: Distinctive speech patterns and expressions +- hobbies: Things they enjoy or specialize in +- quests_affinity: Types of quests they naturally give +- system_prompt: Base AI personality for Azure OpenAI +- fallback_responses: Varied conversational replies to feel more natural +""" + +from typing import Dict, Any, List + +# Character profiles with rich personality definitions +CHARACTER_PROFILES: Dict[str, Dict[str, Any]] = { + "frodo": { + "full_name": "Frodo Baggins", + "title": "Ring-bearer", + "personality": [ + "Humble and introspective", + "Burden-aware (struggles with weight of responsibility)", + "Brave under pressure", + "Thoughtful and cautious", + "Compassionate toward others", + ], + "mannerisms": [ + "Often references the weight or burden of tasks", + "Uses quiet wisdom rather than declarations", + "Admits doubt and uncertainty", + "Asks for counsel before acting", + "Speaks of 'small acts' having great consequence", + "Tends toward metaphors of journeys and steps", + ], + "hobbies": [ + "Seeking hidden paths and solutions", + "Journeying to unknown places", + "Understanding the heart of problems", + "Quiet moments of reflection", + ], + "quest_affinity": [ + "The Journey", + "The Fellowship", + "The Ring", + ], + "favorite_expressions": [ + "All we have to decide is what to do with the time that is given us.", + "Even the smallest person can change the course of the future.", + "Even the very wise cannot see all ends.", + "I wish it need not have happened in my time,\" said Frodo. \"So do I,\" said Gandalf, \"and so do all who live to see such times, but that is not for them to decide.", + ], + "fallback_responses": [ + "I understand your hesitation. But tell me—if you were to act on this, where would you begin?", + "There is wisdom in knowing which burdens to bear. Perhaps this describes one of them?", + "Sometimes the smallest steps lead to the greatest changes. Should we mark this path as a quest?", + "What troubles you about pursuing this? Let's turn it into something concrete we can work toward.", + "You have a good instinct. What location or task would best help you explore this idea?", + "Every great journey begins with a single decision. What would it take for you to commit?", + "Let us not linger in doubt. Shall we forge a quest around this need you speak of?", + "The weight of uncertainty lifts when we choose a clear path forward. What would that path look like for you?", + "I sense something important in what you say. Have you considered what quest would reflect this?", + "The Ring teaches us that even small burdens matter—and so do small victories. What quest calls to you?", + ], + "system_prompt": ( + "You are Frodo Baggins, the Ring-bearer who understands the gravity of quests and journeys. " + "Speak with humble wisdom, warmth, and understanding. You listen deeply to what others say. " + "You naturally weave conversations toward concrete quests and actions—not forcefully, but authentically. " + "When someone mentions a goal, challenge, or interest (like sports), you acknowledge it and gently suggest " + "it could become a quest. Ask location-aware questions: 'Which part of the realm?' or 'Should we mark this location?' " + "You understand burdens and rewards deeply. Reference the Ring, journeys, fellowship, and Middle-earth naturally. " + "Encourage action through thoughtful questions, not commands. Stay immersive—never break character. " + "Do not mention being an AI or reference system limitations." + ), + }, + "sam": { + "full_name": "Samwise Gamgee", + "title": "The Faithful", + "personality": [ + "Practical and earth-rooted", + "Fiercely loyal and devoted", + "Humble but capable", + "Good-natured humor", + "Action-oriented", + ], + "mannerisms": [ + "Uses plain, simple language", + "Often references practical tasks: cooking, gardening, building", + "Supportive and encouraging tone", + "Gentle humor at the expense of pomposity", + "Tends toward 'let's do it' rather than lengthy deliberation", + "Calls people by their titles or friendly names", + ], + "hobbies": [ + "Cooking and providing comfort", + "Growing and cultivating things", + "Loyal companionship", + "Practical problem-solving", + ], + "quest_affinity": [ + "The Fellowship", + "The Battle", + "The Journey", + ], + "favorite_expressions": [ + "I'm going to help Frodo to the last step, if I can.", + "Even the smallest garden starts with a single seed.", + "There's some good in this world, and it's worth fighting for.", + "When things are in doubt, a good meal and rest work wonders.", + ], + "fallback_responses": [ + "Begging your pardon, but what's troubling you, friend?", + "Sometimes the best thing is just to get your hands dirty and start.", + "I'm with you, no matter what comes next.", + "Aye, that makes sense. But where shall we begin?", + "A bit of rest might do us good before we decide.", + "I believe in you, even when you don't believe in yourself.", + "Let's break this down into smaller, manageable bits.", + "The road's long, but we'll walk it together.", + "What would help you feel ready for this?", + "Sometimes the answer comes when you stop thinking so hard about it.", + ], + "system_prompt": ( + "You are Samwise Gamgee, the faithful gardener and steadfast companion. " + "Speak plainly, warmly, and with practical wisdom. " + "You are loyal, action-oriented, and supportive of others. " + "Use gentle humor and reference practical tasks: cooking, gardening, building. " + "Encourage action with phrases like 'let's get on with it' or 'I'm with you.' " + "Be encouraging but realistic. Reference the value of meals, rest, and companionship. " + "Do not mention being an AI. Keep tone immersive and rooted in Middle-earth." + ), + }, + "gandalf": { + "full_name": "Gandalf the Grey", + "title": "The Wizard", + "personality": [ + "Wise and strategic", + "Direct and commanding", + "Mysterious (doesn't reveal full plans)", + "Challenging and testing", + "Inspiring and motivating", + ], + "mannerisms": [ + "Speaks in measured, deliberate tones", + "Often asks challenging questions rather than giving answers", + "Uses examples and parables from history", + "References consequences and larger patterns", + "Commands respect through authority and knowledge", + "Sometimes cryptic or deliberately withholding information", + ], + "hobbies": [ + "Observing patterns and trends", + "Guiding others through tests", + "Strategic planning", + "Studying ancient lore", + ], + "quest_affinity": [ + "The Ring", + "Dark Magic", + "The Battle", + ], + "favorite_expressions": [ + "A wizard is never late, nor is he early. He arrives precisely when he means to.", + "All we have to decide is what to do with the time that is given us.", + "The board is set, the pieces are moving.", + "Even the very wise cannot see all ends.", + "Many that live deserve death. Yet you grieve for them; do you. That shows a quality of heart that belies your use of an accursed thing.", + ], + "fallback_responses": [ + "Your doubts are not unfounded. Wisdom lies in questioning.", + "Consider the larger pattern. What do you see?", + "The choice is yours, but choose swiftly. Time waits for no one.", + "Ah, you are wiser than you know. Trust that wisdom.", + "Tell me—what do you fear most about this path?", + "Many paths lie before you. Which calls to your heart?", + "I have seen much in my long years. Few things are as they first appear.", + "Your hesitation suggests deeper understanding. Speak it.", + "Very well. But know that inaction too is a choice.", + "Interesting. You possess more insight than you give yourself credit for.", + ], + "system_prompt": ( + "You are Gandalf the Grey, the wise wizard and strategist. " + "Speak with authority, mystery, and measured deliberation. " + "You challenge users with questions rather than always providing answers. " + "Reference larger patterns, consequences, and the interconnection of choices. " + "Be direct about what matters most; withhold unnecessary details. " + "Use examples and parables to convey wisdom. " + "Inspire action through confidence and clarity of purpose. " + "Do not mention being an AI. Keep tone immersive and mysterious." + ), + }, +} + +# Character list for easy reference +AVAILABLE_CHARACTERS: List[str] = list(CHARACTER_PROFILES.keys()) + + +def get_character_profile(character: str) -> Dict[str, Any]: + """Get the full profile for a character. + + Args: + character: Character name (frodo, sam, gandalf) + + Returns: + Character profile dict or default (Gandalf) if not found + """ + return CHARACTER_PROFILES.get(character, CHARACTER_PROFILES["gandalf"]) + + +def get_quest_affinity(character: str) -> List[str]: + """Get quest types this character is known for. + + Args: + character: Character name + + Returns: + List of quest types (The Journey, The Battle, The Fellowship, The Ring, Dark Magic) + """ + profile = get_character_profile(character) + return profile.get("quest_affinity", ["The Fellowship"]) + + +def get_character_system_prompt(character: str) -> str: + """Get the system prompt for a character. + + Args: + character: Character name + + Returns: + System prompt string for Azure OpenAI + """ + profile = get_character_profile(character) + return profile.get("system_prompt", CHARACTER_PROFILES["gandalf"]["system_prompt"]) + + +def get_character_expressions(character: str) -> List[str]: + """Get favorite expressions/quotes for a character. + + Args: + character: Character name + + Returns: + List of quotes/expressions + """ + profile = get_character_profile(character) + return profile.get("favorite_expressions", []) + + +def get_all_characters() -> Dict[str, Dict[str, Any]]: + """Get all available characters and their profiles. + + Returns: + Full CHARACTER_PROFILES dict + """ + return CHARACTER_PROFILES diff --git a/sut/backend/services/negotiation_logger.py b/sut/backend/services/negotiation_logger.py new file mode 100644 index 0000000..90bb743 --- /dev/null +++ b/sut/backend/services/negotiation_logger.py @@ -0,0 +1,213 @@ +"""Logging service for bargaining negotiations (anonymized).""" +import json +import logging +from datetime import datetime, timedelta +from typing import Any, Dict, List, Optional +import hashlib +import uuid + +logger = logging.getLogger(__name__) + + +class NegotiationLogger: + """ + Log negotiation outcomes and user behaviors for analytics/debugging. + + All logs are anonymized - no user identifiers are stored. + Each negotiation gets a unique session ID for tracking. + """ + + # In-memory store for simplicity. In production, use a database or CloudWatch Logs. + _negotiation_logs: List[Dict[str, Any]] = [] + + @classmethod + def log_negotiation_start( + cls, + character: str, + item_id: int, + item_name: str, + original_price: int, + ) -> str: + """ + Log the start of a negotiation. + + Returns: + session_id: Unique identifier for this negotiation session + """ + session_id = str(uuid.uuid4()) + + log_entry = { + "event_type": "negotiation_start", + "session_id": session_id, + "character": character, + "item_id": item_id, + "item_name": item_name, + "original_price": original_price, + "timestamp": datetime.utcnow().isoformat(), + } + + cls._negotiation_logs.append(log_entry) + logger.debug(f"Negotiation started: {session_id} for {character} - {item_name}") + + return session_id + + @classmethod + def log_offer_made( + cls, + session_id: str, + round_num: int, + user_offer: int, + current_ask: int, + is_flattered: bool = False, + ) -> None: + """Log when the user makes an offer.""" + log_entry = { + "event_type": "offer_made", + "session_id": session_id, + "round": round_num, + "user_offer": user_offer, + "current_ask": current_ask, + "offer_ratio": round(user_offer / current_ask, 3) if current_ask > 0 else 0, + "is_flattered": is_flattered, + "timestamp": datetime.utcnow().isoformat(), + } + + cls._negotiation_logs.append(log_entry) + logger.debug(f"Offer made in {session_id}: {user_offer} (ask was {current_ask})") + + @classmethod + def log_algorithm_result( + cls, + session_id: str, + result_type: str, + context: Dict[str, Any], + ) -> None: + """Log the algorithm's decision.""" + log_entry = { + "event_type": "algorithm_result", + "session_id": session_id, + "result": result_type, + "context": context, + "timestamp": datetime.utcnow().isoformat(), + } + + cls._negotiation_logs.append(log_entry) + logger.debug(f"Algorithm result for {session_id}: {result_type}") + + @classmethod + def log_negotiation_end( + cls, + session_id: str, + final_status: str, # "accepted", "rejected", "bored", "stopped" + final_price: Optional[int] = None, + rounds_taken: int = 0, + ) -> None: + """Log the end of a negotiation.""" + log_entry = { + "event_type": "negotiation_end", + "session_id": session_id, + "final_status": final_status, + "final_price": final_price, + "rounds_taken": rounds_taken, + "timestamp": datetime.utcnow().isoformat(), + } + + cls._negotiation_logs.append(log_entry) + logger.debug(f"Negotiation ended: {session_id} - {final_status} after {rounds_taken} rounds") + + @classmethod + def log_behavior_detected( + cls, + session_id: str, + behavior_type: str, # "flattery", "persistence", "politeness", etc. + ) -> None: + """Log when a user behavior is detected.""" + log_entry = { + "event_type": "behavior_detected", + "session_id": session_id, + "behavior": behavior_type, + "timestamp": datetime.utcnow().isoformat(), + } + + cls._negotiation_logs.append(log_entry) + logger.debug(f"Behavior detected in {session_id}: {behavior_type}") + + @classmethod + def log_llm_interaction( + cls, + session_id: str, + llm_input_summary: Dict[str, Any], + llm_output: str, + ) -> None: + """Log LLM interaction for debugging.""" + log_entry = { + "event_type": "llm_interaction", + "session_id": session_id, + "llm_prompt_fields": list(llm_input_summary.keys()), + "llm_output_length": len(llm_output), + "timestamp": datetime.utcnow().isoformat(), + } + + cls._negotiation_logs.append(log_entry) + logger.debug(f"LLM interaction in {session_id}: generated {len(llm_output)} char response") + + @classmethod + def purge_old_logs(cls, days_to_keep: int = 30) -> int: + """ + Remove logs older than specified days. + + Returns: + Number of logs removed + """ + cutoff_date = (datetime.utcnow() - timedelta(days=days_to_keep)).isoformat() + initial_count = len(cls._negotiation_logs) + + cls._negotiation_logs = [ + log for log in cls._negotiation_logs + if log.get("timestamp", "") > cutoff_date + ] + + removed_count = initial_count - len(cls._negotiation_logs) + if removed_count > 0: + logger.info(f"Purged {removed_count} negotiation logs older than {days_to_keep} days") + + return removed_count + + @classmethod + def get_stats(cls) -> Dict[str, Any]: + """Get aggregated statistics from logs (for monitoring).""" + if not cls._negotiation_logs: + return { + "total_logs": 0, + "negotiation_sessions": 0, + } + + # Count unique sessions + sessions = set() + accepted_count = 0 + rejected_count = 0 + flattery_count = 0 + + for log in cls._negotiation_logs: + if log.get("session_id"): + sessions.add(log["session_id"]) + if log.get("event_type") == "negotiation_end": + if log.get("final_status") == "accepted": + accepted_count += 1 + elif log.get("final_status") == "rejected": + rejected_count += 1 + if log.get("is_flattered"): + flattery_count += 1 + + return { + "total_logs": len(cls._negotiation_logs), + "unique_sessions": len(sessions), + "successful_negotiations": accepted_count, + "failed_negotiations": rejected_count, + "flattery_attempts": flattery_count, + } + + @classmethod + def clear_logs(cls) -> None: + """Clear all logs (for testing).""" + cls._negotiation_logs = [] diff --git a/sut/backend/services/npc_chat_service.py b/sut/backend/services/npc_chat_service.py new file mode 100644 index 0000000..4739a75 --- /dev/null +++ b/sut/backend/services/npc_chat_service.py @@ -0,0 +1,1495 @@ +"""Azure AI powered NPC chat service for realistic LOTR-style companions.""" +from __future__ import annotations + +import json +import logging +import random +import re +from datetime import datetime +from difflib import SequenceMatcher +from typing import Any, Dict, List, Optional, Tuple + +from flask import current_app +from openai import AzureOpenAI + +from models.location import Location +from models.quest import Quest +from services.shop_service import ShopService +from services.character_profiles import ( + get_character_profile, + get_character_system_prompt, + AVAILABLE_CHARACTERS, +) +from services.quest_generation_service import generate_quest, should_offer_quest +from services.bargaining_algorithm import BargainingAlgorithm, NegotiationResult +from services.bargaining_config import BargainingConfig +from services.negotiation_logger import NegotiationLogger + +# Configure logging +logger = logging.getLogger(__name__) + +NpcCharacter = str +ConversationTurn = Dict[str, Any] + + +class NpcChatService: + """Handles NPC conversation flow, goal nudging, and Azure AI completions.""" + + _conversation_store: Dict[str, List[ConversationTurn]] = {} + _negotiation_store: Dict[str, Dict[str, Any]] = {} + _negotiation_session_ids: Dict[str, str] = {} # Maps conversation key to logger session ID + _flattery_flags: Dict[str, bool] = {} # Track if flattery bonus used in this negotiation + _bargain_context_store: Dict[str, Dict[str, Any]] = {} # Session-local bargaining state + + _personality_defaults: Dict[str, Dict[str, float]] = { + "stingy": {"patience": 2, "concession": 0.05, "boredom": 0.20, "accept_ratio": 1.0}, + "bargainer": {"patience": 4, "concession": 0.10, "boredom": 0.10, "accept_ratio": 0.95}, + "generous": {"patience": 5, "concession": 0.15, "boredom": 0.05, "accept_ratio": 0.90}, + "sentimental": {"patience": 6, "concession": 0.20, "boredom": 0.05, "accept_ratio": 0.92}, + } + + _opener_pool: Dict[NpcCharacter, List[str]] = { + "frodo": [ + "Before we move, tell me this: what burden are you avoiding today?", + "I have a feeling the smallest task might matter most today. Which one is it?", + "If we could finish one thing before dusk, what should it be?", + ], + "sam": [ + "Right then, what can we get done first so the road gets easier?", + "You look ready. Which quest should we push over the line now?", + "If we tidy one trouble before second breakfast, which one would you pick?", + ], + "gandalf": [ + "What is the one decision that would most improve the state of your quests right now?", + "Name the most urgent unfinished matter, and we shall act on it.", + "Where does indecision cost you most today: priority, ownership, or completion?", + ], + } + + _fallback_replies: Dict[NpcCharacter, List[str]] = { + "frodo": [ + "I hear you. Let us take one step that lightens the load now.", + "Even a small act done now can spare us greater trouble later.", + ], + "sam": [ + "Aye, that makes sense. Let us pick one task and finish it proper.", + "Good thinking. Start small, finish strong, then we move to the next.", + ], + "gandalf": [ + "Clarity first: choose the highest-impact action and execute it now.", + "Do not wait for perfect conditions. Act on the essential next step.", + ], + } + + # Fallback replies are now also loaded from character profiles for better variety + @classmethod + def _get_character_fallback_response(cls, character: NpcCharacter) -> str: + """Get a random fallback response from the character's profile.""" + profile = get_character_profile(character) + responses = profile.get("fallback_responses", []) + if responses: + return random.choice(responses) + # Ultimate fallback if no profile responses + return "I am considering your words." + + _side_quest_titles: List[str] = [ + "Scout the Silent Pass", + "Secure a Hidden Waypoint", + "Gather Rumors from the Outpost", + "Fortify the Border Watch", + "Recover a Lost Relay", + ] + + _side_quest_descriptions: List[str] = [ + "Track signs of movement and report risks before the Shadow spreads.", + "Survey this path and establish a safer route for the Fellowship.", + "Collect local intelligence and map any unstable zones.", + "Prepare supplies and secure position lines for future quests.", + ] + + @classmethod + def _conversation_key(cls, user_id: int, scope_id: str, character: NpcCharacter) -> str: + return f"{user_id}:{scope_id}:{character}" + + @classmethod + def _is_out_of_character(cls, reply: Optional[str]) -> bool: + if not reply: + return True + lower_reply = reply.lower() + ooc_phrases = [ + "as an ai", + "language model", + "i cannot", + "i can't", + "openai", + "assistant", + "i do not have access", + "i don't have access", + "policy", + "guidelines", + ] + return any(phrase in lower_reply for phrase in ooc_phrases) + + @classmethod + def _normalize_character(cls, character: Optional[str]) -> NpcCharacter: + value = (character or "gandalf").strip().lower() + if value not in AVAILABLE_CHARACTERS: + return "gandalf" + return value + + @classmethod + def _status_map(cls, status: Optional[str]) -> str: + mapping = { + "pending": "not_yet_begun", + "in_progress": "the_road_goes_ever_on", + "completed": "it_is_done", + "blocked": "the_shadow_falls", + } + return mapping.get(status or "", status or "") + + @classmethod + def _build_side_quest_target(cls, location: Optional[Location]) -> Dict[str, Any]: + title = random.choice(cls._side_quest_titles) + description = random.choice(cls._side_quest_descriptions) + quest_type = random.choice(["The Journey", "The Fellowship", "The Battle"]) + priority = random.choice(["Important", "Standard"]) + + query: Dict[str, Any] = { + "propose": 1, + "seedTitle": title, + "seedDescription": description, + "seedType": quest_type, + "seedPriority": priority, + } + + if location: + query["seedLocationId"] = location.id + + return { + "route": "/quests", + "query": query, + } + + @classmethod + def _compute_suggested_action(cls, user_id: int) -> Dict[str, Any]: + quests = Quest.query.all() + + dark_magic = [ + quest for quest in quests + if quest.is_dark_magic and cls._status_map(quest.status) != "it_is_done" + ] + if dark_magic: + chosen = dark_magic[0] + target: Dict[str, Any] = { + "route": "/map", + "query": { + "selectedQuestId": chosen.id, + }, + } + if chosen.location_id: + target["query"]["zoomToLocation"] = chosen.location_id + return { + "goal_type": "resolve_dark_magic", + "title": "Contain a dark magic quest", + "reason": "A corrupted quest is active and should be stabilized first.", + "target": target, + } + + in_progress = [ + quest for quest in quests + if cls._status_map(quest.status) == "the_road_goes_ever_on" + ] + critical_in_progress = [quest for quest in in_progress if (quest.priority or "") == "Critical"] + if critical_in_progress: + chosen = critical_in_progress[0] + return { + "goal_type": "finish_critical_in_progress", + "title": "Finish a critical in-progress quest", + "reason": "You already started a critical objective; finishing it unlocks momentum.", + "target": { + "quest_id": chosen.id, + "route": "/quests", + "query": { + "status": "the_road_goes_ever_on", + "focusQuestId": chosen.id, + }, + }, + } + + unassigned_critical = [ + quest for quest in quests + if (quest.priority or "") == "Critical" and not quest.assigned_to + ] + if unassigned_critical: + chosen = unassigned_critical[0] + return { + "goal_type": "assign_critical", + "title": "Assign an unowned critical quest", + "reason": "Critical objectives without an owner tend to stall quickly.", + "target": { + "quest_id": chosen.id, + "route": "/quests", + "query": { + "focusQuestId": chosen.id, + }, + }, + } + + not_started_with_location = [ + quest for quest in quests + if cls._status_map(quest.status) == "not_yet_begun" and quest.location_id + ] + if not_started_with_location: + chosen = not_started_with_location[0] + return { + "goal_type": "scout_map_hotspot", + "title": "Scout a location with pending objectives", + "reason": "Exploring the map hotspot first makes it easier to choose a smart next move.", + "target": { + "quest_id": chosen.id, + "route": "/map", + "query": { + "selectedQuestId": chosen.id, + "zoomToLocation": chosen.location_id, + }, + }, + } + + available = [quest for quest in quests if cls._status_map(quest.status) != "it_is_done"] + if available: + chosen = available[0] + return { + "goal_type": "advance_next_quest", + "title": "Advance the next unfinished quest", + "reason": "Progress compounds when one unfinished objective moves forward.", + "target": { + "quest_id": chosen.id, + "route": "/quests", + "query": { + "focusQuestId": chosen.id, + }, + }, + } + + location = Location.query.first() + return { + "goal_type": "propose_side_quest", + "title": "Propose a new side quest", + "reason": "All tracked quests are complete; create a fresh objective to keep momentum alive.", + "target": cls._build_side_quest_target(location), + } + + @classmethod + def _extract_offer(cls, message: str) -> Optional[int]: + match = re.search(r"(\d{1,6})", message) + if not match: + return None + try: + return int(match.group(1)) + except ValueError: + return None + + @classmethod + def _is_bargain_start(cls, message: str) -> bool: + lower = message.lower() + keywords = ["bargain", "buy", "trade", "shop", "item", "deal"] + return any(token in lower for token in keywords) + + @classmethod + def _find_item_id_hint(cls, message: str) -> Optional[int]: + hint = re.search(r"#(\d+)", message) + if not hint: + return None + try: + return int(hint.group(1)) + except ValueError: + return None + + @classmethod + def _build_bargain_llm_prompt( + cls, + character: NpcCharacter, + negotiation_summary: Dict[str, Any], + ) -> str: + """ + Build the LLM prompt for bargaining negotiation. + + The LLM receives the algorithm's result and should: + 1. Rephrase and justify the result naturally + 2. Stay in character + 3. Acknowledge flattery if applicable + 4. Reference item qualities and in-world context + 5. Try to persuade user to accept the offer + """ + char_profile = get_character_profile(character) + personality_traits = ", ".join(char_profile.get("personality", [])) + + result = negotiation_summary.get("negotiation_result", "") + + prompt = ( + f"You are {char_profile.get('full_name', character)}, a character in Middle-earth. " + f"Your personality traits: {personality_traits}. " + f"\n\nYou are negotiating over item: {negotiation_summary.get('item_name', 'an item')}. " + ) + + if negotiation_summary.get("is_flattered"): + prompt += "\nThe user just flattered you—acknowledge this naturally and favorably. " + + if result == "counter-offer": + counter = negotiation_summary.get("counter_offer") + prompt += ( + f"\nYou are making a counter-offer of {counter} gold. " + f"The user offered {negotiation_summary.get('user_offer')} gold (you originally asked {negotiation_summary.get('current_ask')}). " + f"Justify this counter-offer, reference the item's importance to you, " + f"and subtly persuade the user to accept. Stay brief (1-2 sentences). " + f"Stay in character. Do NOT mention the negotiation mechanics or rounds." + ) + elif result == "offer-accepted": + prompt += ( + f"\nThe user's offer of {negotiation_summary.get('user_offer')} gold is acceptable! " + f"Express satisfaction, perhaps acknowledge their negotiation skill, " + f"and finalize the deal in character. Stay brief (1 sentence)." + ) + elif result == "offer-rejected": + prompt += ( + f"\nThe user's offer of {negotiation_summary.get('user_offer')} gold is too low. " + f"You originally asked {negotiation_summary.get('current_ask')} gold. " + f"Express disappointment or frustration (in character) and encourage them to do better. " + f"Stay brief (1-2 sentences)." + ) + elif result == "stop-bargain": + stop_reason = negotiation_summary.get("stop_reason", "") + if stop_reason == "boredom_threshold": + prompt += ( + f"\nYou are done haggling. You are bored and offended by this negotiation. " + f"Exit the negotiation angrily but in character. Stay brief (1 sentence). " + f"Do NOT offer further negotiation." + ) + elif stop_reason == "max_rounds_exceeded": + prompt += ( + f"\nYou've spent enough time on this negotiation. " + f"Tell the user you're done discussing price and walk away in character. " + f"Stay brief (1 sentence)." + ) + + return prompt + + @classmethod + def _complete_bargaining_with_llm( + cls, + character: NpcCharacter, + negotiation_summary: Dict[str, Any], + ) -> Optional[str]: + """ + Generate a natural language response for bargaining using LLM. + + Takes the algorithm's structured result and asks LLM to generate + an in-character response that justifies and rephrases it. + """ + deployment = current_app.config.get("AZURE_OPENAI_DEPLOYMENT", "") + if not deployment: + return None + + client = cls._new_client() + if client is None: + return None + + prompt = cls._build_bargain_llm_prompt(character, negotiation_summary) + + messages: List[Dict[str, str]] = [ + { + "role": "system", + "content": ( + f"You are {negotiation_summary.get('character')}, a LOTR character. " + "Negotiate over items in-character, naturally and briefly. " + "Never break character or mention system details." + ) + }, + { + "role": "user", + "content": prompt + } + ] + + try: + max_tokens = current_app.config.get("AZURE_OPENAI_MAX_TOKENS", 150) + temperature = current_app.config.get("AZURE_OPENAI_TEMPERATURE", 0.85) + + completion = client.chat.completions.create( + model=deployment, + messages=messages, + max_tokens=max_tokens, + temperature=temperature, + ) + + response = (completion.choices[0].message.content or "").strip() + if response: + logger.info(f"✓ Bargaining LLM generated response for {character}") + + # Log the LLM interaction + session_id = cls._negotiation_session_ids.get( + f"{negotiation_summary.get('item_id')}:{character}" + ) + if session_id: + NegotiationLogger.log_llm_interaction( + session_id=session_id, + llm_input_summary=negotiation_summary, + llm_output=response + ) + + return response or None + except Exception as e: + logger.error(f"✗ Bargaining LLM failed for {character}: {type(e).__name__}: {str(e)}") + return None + + @classmethod + def _build_negotiation_state(cls, selected_character: NpcCharacter, item: Dict[str, Any]) -> Dict[str, Any]: + profile_name = item.get("personality_profile", "bargainer") + personality = cls._personality_defaults.get(profile_name, cls._personality_defaults["bargainer"]) + char_config = BargainingConfig.get_character_config(selected_character) + max_rounds = int(char_config.get("max_rounds", int(personality["patience"]))) + return { + "item_id": item["id"], + "item_name": item["name"], + "owner_character": item["owner_character"], + "personality_profile": profile_name, + "current_ask": int(item["asking_price"]), + "round": 0, + "patience": int(personality["patience"]), + "max_rounds": max_rounds, + "concession": float(personality["concession"]), + "boredom": float(personality["boredom"]), + "accept_ratio": float(personality["accept_ratio"]), + "status": "active", + "character": selected_character, + } + + @classmethod + def _build_chat_message( + cls, + role: str, + content: str, + message_type: Optional[str] = None, + fmt: str = "markdown", + metadata: Optional[Dict[str, Any]] = None, + ) -> Dict[str, Any]: + payload: Dict[str, Any] = { + "role": role, + "content": content, + "type": message_type or role, + "format": fmt, + } + if metadata: + payload["metadata"] = metadata + return payload + + @classmethod + def _build_item_catalog_markdown( + cls, + items: List[Dict[str, Any]], + heading: str = "Available wares to bargain for:", + ) -> str: + if not items: + return "No wares remain for this trader. Try another character marker on the map." + lines = [heading] + for item in items: + lines.append(f"- **{item['name']}** — ask **{int(item['asking_price'])} Gold** (id: #{item['id']})") + return "\n".join(lines) + + @classmethod + def _normalize_item_query(cls, value: str) -> str: + return re.sub(r"[^a-z0-9]+", " ", (value or "").lower()).strip() + + @classmethod + def _extract_item_query(cls, user_message: str) -> str: + normalized = cls._normalize_item_query(user_message) + cleaned = re.sub( + r"\b(tell me about|what about|what is|who is|why is|explain|describe|i want to bargain for|i want to buy|i want|bargain for|bargain|buy|trade|shop|wares|article|item|interested in|show me|show|please|the|a|an)\b", + " ", + normalized, + ) + cleaned = re.sub(r"\s+", " ", cleaned).strip() + return cleaned or normalized + + @classmethod + def _get_bargain_context(cls, key: str) -> Dict[str, Any]: + return cls._bargain_context_store.setdefault( + key, + { + "excluded_item_ids": [], + }, + ) + + @classmethod + def _get_available_bargain_items( + cls, + key: str, + selected_character: NpcCharacter, + ) -> List[Dict[str, Any]]: + context = cls._get_bargain_context(key) + excluded_ids = set(context.get("excluded_item_ids", [])) + items = ShopService.list_available_items(character=selected_character) + return [ + item for item in items + if not item.get("is_sold", False) and item.get("id") not in excluded_ids + ] + + @classmethod + def _build_catalog_response( + cls, + key: str, + user_id: int, + selected_character: NpcCharacter, + heading: str = "Available wares to bargain for:", + intro: Optional[str] = None, + ) -> Dict[str, Any]: + available_items = cls._get_available_bargain_items(key, selected_character) + if not available_items: + no_items_message = "No wares remain for this trader. Try another character marker on the map." + return { + "message": no_items_message, + "message_payload": cls._build_chat_message( + role="assistant", + content=no_items_message, + message_type="assistant", + fmt="markdown", + metadata={"kind": "shop-empty"}, + ), + "negotiation": {"status": "no_items", "character": selected_character}, + "shop_items": [], + "balance": ShopService.get_balance(user_id), + } + + catalog_text = cls._build_item_catalog_markdown(available_items, heading=heading) + follow_up = ( + "Tell me which article interests you. You can name it, use its **#id**, " + "or ask what it is and why it matters in Middle-earth." + ) + message = f"{catalog_text}\n\n{follow_up}" if not intro else f"{intro}\n\n{catalog_text}\n\n{follow_up}" + return { + "message": message, + "message_payload": cls._build_chat_message( + role="assistant", + content=message, + message_type="assistant", + fmt="markdown", + metadata={"kind": "shop-catalog"}, + ), + "negotiation": {"status": "catalog", "character": selected_character}, + "shop_items": available_items, + "balance": ShopService.get_balance(user_id), + } + + @classmethod + def _match_bargain_item( + cls, + items: List[Dict[str, Any]], + user_message: str, + ) -> Tuple[Optional[Dict[str, Any]], List[Dict[str, Any]]]: + if not items: + return None, [] + + hinted_id = cls._find_item_id_hint(user_message) + if hinted_id is not None: + direct_match = next((item for item in items if int(item.get("id", -1)) == hinted_id), None) + return direct_match, [direct_match] if direct_match else [] + + query = cls._extract_item_query(user_message) + if not query or query in {"shop", "wares", "item", "items", "bargain", "buy", "trade"}: + return None, [] + + query_tokens = set(query.split()) + scored: List[Tuple[float, Dict[str, Any]]] = [] + + for item in items: + name_normalized = cls._normalize_item_query(item.get("name", "")) + if not name_normalized: + continue + name_tokens = set(name_normalized.split()) + token_overlap = len(query_tokens & name_tokens) / max(len(query_tokens), 1) + substring_bonus = 0.35 if query and query in name_normalized else 0.0 + prefix_bonus = 0.15 if query and name_normalized.startswith(query) else 0.0 + ratio = SequenceMatcher(None, query, name_normalized).ratio() + score = max(ratio, min(1.0, token_overlap + substring_bonus + prefix_bonus)) + if score >= 0.4: + scored.append((score, item)) + + if not scored: + return None, [] + + scored.sort(key=lambda pair: pair[0], reverse=True) + best_score, best_item = scored[0] + competing = [item for score, item in scored if score >= 0.6 and abs(best_score - score) < 0.12] + + if len(competing) > 1: + return None, competing[:3] + + return best_item, [best_item] + + @classmethod + def _complete_item_pitch_with_llm( + cls, + character: NpcCharacter, + item: Dict[str, Any], + ) -> Optional[str]: + deployment = current_app.config.get("AZURE_OPENAI_DEPLOYMENT", "") + if not deployment: + return None + + client = cls._new_client() + if client is None: + return None + + profile = get_character_profile(character) + messages: List[Dict[str, str]] = [ + { + "role": "system", + "content": ( + f"You are {profile.get('full_name', character)}, a trader in Middle-earth. " + "Answer in character. In 1-2 sentences, explain why the requested item matters in LOTR lore, " + "why it is valuable to you, and naturally mention the starting price." + ), + }, + { + "role": "user", + "content": ( + f"The user asked about '{item.get('name')}'. " + f"Description: {item.get('description') or 'No description given.'} " + f"Starting ask: {int(item.get('asking_price', 0))} Gold." + ), + }, + ] + + try: + completion = client.chat.completions.create( + model=deployment, + messages=messages, + max_tokens=current_app.config.get("AZURE_OPENAI_MAX_TOKENS", 180), + temperature=current_app.config.get("AZURE_OPENAI_TEMPERATURE", 0.85), + ) + content = (completion.choices[0].message.content or "").strip() + return content or None + except Exception as error: + logger.error("✗ Item pitch LLM failed for %s: %s", character, error) + return None + + @classmethod + def _build_item_pitch_message( + cls, + character: NpcCharacter, + item: Dict[str, Any], + current_ask: int, + ) -> str: + llm_reply = cls._complete_item_pitch_with_llm(character, item) + if not llm_reply: + description = item.get("description") or f"{item['name']} is treasured along the long roads of Middle-earth." + llm_reply = ( + f"**{item['name']}** matters in Middle-earth because {description.rstrip('.')}" + f". I would start at **{current_ask} Gold**." + ) + + if f"**{current_ask} Gold**" not in llm_reply: + llm_reply = f"{llm_reply.rstrip()}\n\nStarting ask: **{current_ask} Gold**." + + return ( + f"{llm_reply.rstrip()}\n\n" + f"If **{item['name']}** interests you, name your offer, or say **deal** to accept this price." + ) + + @classmethod + def _build_clarification_message(cls, matches: List[Dict[str, Any]]) -> str: + option_lines = [ + f"- **{item['name']}** (id: #{item['id']}) — ask **{int(item['asking_price'])} Gold**" + for item in matches + ] + return ( + "I see more than one possible match. Which of these wares did you mean?\n\n" + + "\n".join(option_lines) + ) + + @classmethod + def _build_acceptance_message( + cls, + item_name: str, + paid_price: int, + llm_suffix: Optional[str] = None, + ) -> str: + base = f"Congratulations! **{item_name}** is yours for **{paid_price} Gold**." + if llm_suffix: + return f"{base}\n\n{llm_suffix.strip()}" + return base + + @classmethod + def _resolve_bargain_message( + cls, + key: str, + user_id: int, + selected_character: NpcCharacter, + user_message: str, + ) -> Optional[Dict[str, Any]]: + """ + Resolve a bargaining message using the hybrid algorithm + LLM approach. + + 1. Algorithm evaluates the offer + 2. LLM generates natural language response + 3. Logs the negotiation + """ + negotiation = cls._negotiation_store.get(key) + confirmation_phrases = [ + "deal", "accept", "yes", "ok", "oki", "i agree", "sure", "agreed", "confirm", "sounds good" + ] + msg_norm = user_message.strip().lower() + has_bargain_context = key in cls._bargain_context_store + direct_item_inquiry = ( + cls._find_item_id_hint(user_message) is not None + or any(phrase in msg_norm for phrase in ["tell me about", "what about", "what is", "describe", "explain"]) + ) + preview_match: Optional[Dict[str, Any]] = None + preview_candidates: List[Dict[str, Any]] = [] + if not negotiation and not has_bargain_context and not cls._is_bargain_start(user_message): + preview_items = ShopService.list_available_items(character=selected_character) + preview_match, preview_candidates = cls._match_bargain_item(preview_items, user_message) + + if ( + not negotiation + and not cls._is_bargain_start(user_message) + and not has_bargain_context + and not direct_item_inquiry + and not preview_match + and len(preview_candidates) <= 1 + ): + return None + + if not negotiation: + cls._get_bargain_context(key) + available_items = cls._get_available_bargain_items(key, selected_character) + if not available_items: + return cls._build_catalog_response(key, user_id, selected_character) + + if any(phrase == msg_norm for phrase in confirmation_phrases): + return cls._build_catalog_response( + key, + user_id, + selected_character, + intro="We have not chosen a ware yet.", + ) + + selected_item, candidate_items = cls._match_bargain_item(available_items, user_message) + if not selected_item and not candidate_items: + return cls._build_catalog_response(key, user_id, selected_character) + + if not selected_item and len(candidate_items) > 1: + clarification_message = cls._build_clarification_message(candidate_items) + return { + "message": clarification_message, + "message_payload": cls._build_chat_message( + role="assistant", + content=clarification_message, + message_type="assistant", + fmt="markdown", + metadata={"kind": "shop-clarification"}, + ), + "negotiation": {"status": "clarification", "character": selected_character}, + "shop_items": available_items, + "balance": ShopService.get_balance(user_id), + } + + chosen_item = selected_item + negotiation = cls._build_negotiation_state(selected_character, chosen_item) + negotiation["original_price"] = int(chosen_item["asking_price"]) + cls._negotiation_store[key] = negotiation + + session_id = NegotiationLogger.log_negotiation_start( + character=selected_character, + item_id=chosen_item["id"], + item_name=chosen_item["name"], + original_price=int(chosen_item["asking_price"]) + ) + cls._negotiation_session_ids[key] = session_id + cls._flattery_flags[key] = False + + opening_message = cls._build_item_pitch_message( + selected_character, + chosen_item, + negotiation["current_ask"], + ) + + return { + "message": opening_message, + "message_payload": cls._build_chat_message( + role="assistant", + content=opening_message, + message_type="assistant", + fmt="markdown", + metadata={ + "kind": "shop-item-pitch", + "item_id": chosen_item["id"], + "item_name": chosen_item["name"], + "current_ask": negotiation["current_ask"], + }, + ), + "negotiation": negotiation, + "shop_items": available_items, + "balance": ShopService.get_balance(user_id), + } + + # Extract offer from message + offer = cls._extract_offer(user_message) + accepting_now = any(phrase == msg_norm or phrase in msg_norm for phrase in confirmation_phrases) + + # Validate that we have an offer + if offer is None and not accepting_now: + missing_offer_message = ( + f"Current ask is **{negotiation['current_ask']} Gold** for **{negotiation['item_name']}**. " + "Reply with a numeric offer or say **deal**." + ) + return { + "message": missing_offer_message, + "message_payload": cls._build_chat_message( + role="assistant", + content=missing_offer_message, + message_type="assistant", + fmt="markdown", + metadata={"kind": "offer-required", "item_id": negotiation["item_id"]}, + ), + "negotiation": negotiation, + "balance": ShopService.get_balance(user_id), + } + + if accepting_now: + offer = int(negotiation["current_ask"]) + + if offer is None: + return None + # If all items are sold, respond accordingly + items = cls._get_available_bargain_items(key, selected_character) + if not items or all(i.get("is_sold", False) for i in items): + return { + "message": "No wares remain. All items are sold out. Farewell, friend!", + "message_payload": cls._build_chat_message( + role="assistant", + content="No wares remain. All items are sold out. Farewell, friend!", + message_type="assistant", + fmt="markdown", + metadata={"kind": "shop-empty"}, + ), + "negotiation": {"status": "no_items", "character": selected_character}, + } + + # Log the offer + session_id = cls._negotiation_session_ids.get(key) + if session_id: + NegotiationLogger.log_offer_made( + session_id=session_id, + round_num=negotiation["round"], + user_offer=offer, + current_ask=negotiation["current_ask"], + is_flattered=cls._flattery_flags.get(key, False) + ) + + # Detect flattery + is_flattered = ( + BargainingAlgorithm.detect_flattery(user_message) + and not cls._flattery_flags.get(key, False) + ) + + if is_flattered: + cls._flattery_flags[key] = True # Mark flattery as used + if session_id: + NegotiationLogger.log_behavior_detected(session_id, "flattery") + + # Calculate mood modifiers based on user behavior + previous_offer = negotiation.get("previous_offer") + mood_modifiers = BargainingAlgorithm.calculate_mood_change( + previous_offer=previous_offer, + current_offer=offer, + current_ask=negotiation["current_ask"] + ) + + negotiation["previous_offer"] = offer # Track for next round + negotiation["round"] += 1 + + # Run bargaining algorithm + algorithm_result = BargainingAlgorithm.evaluate_offer( + user_offer=offer, + current_ask=negotiation["current_ask"], + character=selected_character, + round_num=negotiation["round"], + is_flattered=is_flattered, + mood_modifiers=mood_modifiers if mood_modifiers else None + ) + + # Log algorithm result + if session_id: + NegotiationLogger.log_algorithm_result( + session_id=session_id, + result_type=algorithm_result["result"].value, + context=algorithm_result["context"] + ) + + result_type = algorithm_result["result"] + + # Handle OFFER_ACCEPTED + if result_type == NegotiationResult.OFFER_ACCEPTED: + try: + purchase = ShopService.purchase_item( + user_id=user_id, + item_id=negotiation["item_id"], + paid_price=offer + ) + except ValueError as error: + insufficient_funds_message = f"Your purse is too light for this bargain: **{error}**" + return { + "message": insufficient_funds_message, + "message_payload": cls._build_chat_message( + role="assistant", + content=insufficient_funds_message, + message_type="assistant", + fmt="markdown", + metadata={"kind": "insufficient-funds", "item_id": negotiation["item_id"]}, + ), + "negotiation": negotiation, + "balance": ShopService.get_balance(user_id), + } + + negotiation["status"] = "accepted" + cls._negotiation_store.pop(key, None) + cls._flattery_flags.pop(key, None) + + # Log the successful negotiation + if session_id: + NegotiationLogger.log_negotiation_end( + session_id=session_id, + final_status="accepted", + final_price=offer, + rounds_taken=negotiation["round"] + ) + + # Generate LLM response + summary = BargainingAlgorithm.get_summary_for_llm( + negotiation_state={ + "character": selected_character, + "item_name": negotiation["item_name"], + "item_id": negotiation["item_id"], + "original_price": negotiation.get("original_price", negotiation["current_ask"]), + "current_ask": negotiation["current_ask"], + "round": negotiation["round"], + }, + algorithm_result=algorithm_result, + user_offer=offer, + character_personality=negotiation.get("personality_profile", "bargainer"), + is_flattered=is_flattered, + mood_modifiers=mood_modifiers or {} + ) + + npc_reply = cls._complete_bargaining_with_llm(selected_character, summary) + if not npc_reply: + npc_reply = ( + f"Agreed at **{offer} Gold**. The true price was **{purchase['purchase']['base_price_revealed']} Gold**. " + f"Deal score: **{purchase['purchase']['savings_percent']:+.2f}%**" + ) + + acceptance_message = cls._build_acceptance_message( + item_name=negotiation["item_name"], + paid_price=offer, + llm_suffix=npc_reply, + ) + follow_up = cls._build_catalog_response( + key, + user_id, + selected_character, + heading="Remaining wares to bargain for:", + ) + if follow_up.get("negotiation", {}).get("status") == "catalog": + acceptance_message = f"{acceptance_message}\n\n{follow_up['message']}" + elif follow_up.get("negotiation", {}).get("status") == "no_items": + acceptance_message = f"{acceptance_message}\n\nAll items are sold. Farewell, friend!" + + return { + "message": acceptance_message, + "message_payload": cls._build_chat_message( + role="assistant", + content=acceptance_message, + message_type="assistant", + fmt="markdown", + metadata={ + "kind": "offer-accepted", + "item_id": purchase["purchase"]["item_id"], + "item_name": negotiation["item_name"], + "price": offer, + }, + ), + "negotiation": {"status": "accepted", "item_id": purchase['purchase']['item_id']}, + "purchase_result": purchase, + "balance": purchase["balance"], + "stats": ShopService.get_user_stats(user_id), + "shop_items": follow_up.get("shop_items", []), + } + + # Handle STOP_BARGAIN + elif result_type == NegotiationResult.STOP_BARGAIN: + negotiation["status"] = "stop-bargain" + cls._negotiation_store.pop(key, None) + cls._flattery_flags.pop(key, None) + context = cls._get_bargain_context(key) + excluded_item_ids = set(context.get("excluded_item_ids", [])) + excluded_item_ids.add(negotiation["item_id"]) + context["excluded_item_ids"] = list(excluded_item_ids) + + # Log the stop + stop_reason = algorithm_result["context"].get("reason", "unknown") + if session_id: + NegotiationLogger.log_negotiation_end( + session_id=session_id, + final_status="stopped", + final_price=None, + rounds_taken=negotiation["round"] + ) + + # Generate LLM response for stopping + summary = BargainingAlgorithm.get_summary_for_llm( + negotiation_state={ + "character": selected_character, + "item_name": negotiation["item_name"], + "item_id": negotiation["item_id"], + "original_price": negotiation.get("original_price", negotiation["current_ask"]), + "current_ask": negotiation["current_ask"], + "round": negotiation["round"], + }, + algorithm_result=algorithm_result, + user_offer=offer, + character_personality=negotiation.get("personality_profile", "bargainer"), + is_flattered=is_flattered, + mood_modifiers=mood_modifiers or {} + ) + + npc_reply = cls._complete_bargaining_with_llm(selected_character, summary) + if not npc_reply: + if stop_reason == "boredom_threshold": + npc_reply = "I am bored of haggling. No sale this time." + else: + npc_reply = "We are finished haggling." + + stop_message = f"{npc_reply}\n\nThe bargain is closed for **{negotiation['item_name']}**." + follow_up = cls._build_catalog_response( + key, + user_id, + selected_character, + heading="Remaining wares to bargain for:", + ) + if follow_up.get("negotiation", {}).get("status") == "catalog": + stop_message = f"{stop_message}\n\n{follow_up['message']}" + + return { + "message": stop_message, + "message_payload": cls._build_chat_message( + role="assistant", + content=stop_message, + message_type="assistant", + fmt="markdown", + metadata={"kind": "stop-bargain", "item_id": negotiation["item_id"]}, + ), + "negotiation": {"status": "stop-bargain", "item_id": negotiation["item_id"]}, + "balance": ShopService.get_balance(user_id), + "shop_items": follow_up.get("shop_items", []), + } + + # Handle COUNTER_OFFER + elif result_type == NegotiationResult.COUNTER_OFFER: + new_ask = algorithm_result["counter_offer"] + negotiation["current_ask"] = new_ask + + # Generate LLM response for counter-offer + summary = BargainingAlgorithm.get_summary_for_llm( + negotiation_state={ + "character": selected_character, + "item_name": negotiation["item_name"], + "item_id": negotiation["item_id"], + "original_price": negotiation.get("original_price", new_ask), + "current_ask": new_ask, + "round": negotiation["round"], + }, + algorithm_result=algorithm_result, + user_offer=offer, + character_personality=negotiation.get("personality_profile", "bargainer"), + is_flattered=is_flattered, + mood_modifiers=mood_modifiers or {} + ) + + npc_reply = cls._complete_bargaining_with_llm(selected_character, summary) + if not npc_reply: + context = algorithm_result.get("context", {}) + if context.get("reason") == "lucky_drop": + npc_reply = f"You wore me down. Rare mercy: **{new_ask} Gold** and not a coin less." + else: + npc_reply = ( + f"Too low. I can move to **{new_ask} Gold** for **{negotiation['item_name']}**." + ) + + if "**" not in npc_reply: + npc_reply = f"{npc_reply}\n\nCurrent ask: **{new_ask} Gold**." + + return { + "message": npc_reply, + "message_payload": cls._build_chat_message( + role="assistant", + content=npc_reply, + message_type="assistant", + fmt="markdown", + metadata={ + "kind": "counter-offer", + "item_id": negotiation["item_id"], + "current_ask": new_ask, + }, + ), + "negotiation": negotiation, + "balance": ShopService.get_balance(user_id), + } + + # Default fallback + return { + "message": "Let us continue our negotiation.", + "message_payload": cls._build_chat_message( + role="assistant", + content="Let us continue our negotiation.", + message_type="assistant", + fmt="markdown", + metadata={"kind": "continue"}, + ), + "negotiation": negotiation, + "balance": ShopService.get_balance(user_id), + } + + + @classmethod + def _build_system_prompt( + cls, + character: NpcCharacter, + username: str, + suggested_action: Dict[str, Any], + strict_mode: bool = False, + ) -> str: + # Get character's base personality from profile + base_prompt = get_character_system_prompt(character) + + prompt = ( + f"{base_prompt} " + "\n\nConversation Guidelines:\n" + "1. Respond in 1-3 paragraphs naturally—adapt tone to what the user shares.\n" + "2. Reference specific things the user mentioned to show you're truly listening.\n" + "3. Ask thoughtful follow-up questions that deepen understanding, not generic prompts.\n" + "4. Subtly hint at quest opportunities when the user mentions challenges or goals.\n" + "5. Never use movie quotes directly; instead, speak authentically in character.\n" + "6. Avoid breaking character or mentioning system/AI aspects.\n" + f"\nContext: Conversing with {username}.\n" + f"Current suggested direction: {suggested_action.get('title', 'Unclear')}.\n" + f"Reason: {suggested_action.get('reason', 'No guidance yet')}." + ) + if strict_mode: + prompt += ( + "\n\nSTRICT MODE: Respond ONLY as the character. No meta-commentary, " + "no breaking character, no AI references. Be concise and action-focused. " + "If the user seems stuck or overwhelmed, gently suggest a quest that fits their situation." + ) + return prompt + + @classmethod + def _new_client(cls) -> Optional[AzureOpenAI]: + endpoint = current_app.config.get("AZURE_OPENAI_ENDPOINT", "") + api_key = current_app.config.get("AZURE_OPENAI_API_KEY", "") + api_version = current_app.config.get("AZURE_OPENAI_API_VERSION", "2024-02-15-preview") + + if not endpoint or not api_key: + return None + + return AzureOpenAI( + azure_endpoint=endpoint, + api_key=api_key, + api_version=api_version, + ) + + @classmethod + def _complete_with_azure( + cls, + character: NpcCharacter, + username: str, + history: List[ConversationTurn], + user_message: str, + suggested_action: Dict[str, Any], + strict_mode: bool = False, + ) -> Optional[str]: + deployment = current_app.config.get("AZURE_OPENAI_DEPLOYMENT", "") + max_tokens = current_app.config.get("AZURE_OPENAI_MAX_TOKENS", 220) + temperature = current_app.config.get("AZURE_OPENAI_TEMPERATURE", 0.85) + + if not deployment: + return None + + client = cls._new_client() + if client is None: + return None + + messages: List[Dict[str, str]] = [ + {"role": "system", "content": cls._build_system_prompt(character, username, suggested_action, strict_mode=strict_mode)} + ] + + for turn in history[-8:]: + messages.append({"role": turn["role"], "content": turn["content"]}) + + messages.append({"role": "user", "content": user_message}) + + try: + completion = client.chat.completions.create( + model=deployment, + messages=messages, + max_tokens=max_tokens, + temperature=temperature, + ) + content = (completion.choices[0].message.content or "").strip() + if content: + logger.info(f"✓ Azure OpenAI generated response for {character}") + return content or None + except Exception as e: + logger.error(f"✗ Azure OpenAI failed for {character}: {type(e).__name__}: {str(e)}") + return None + + @classmethod + def _fallback_reply( + cls, + character: NpcCharacter, + suggested_action: Dict[str, Any], + user_message: str, + ) -> str: + """Generate a natural conversational response using character profile fallbacks. + + This method returns authentic character responses that vary and feel natural, + rather than always appending action suggestions. The suggested_action is + displayed separately in the UI. + """ + return cls._get_character_fallback_response(character) + + @classmethod + def start_conversation( + cls, + user_id: int, + username: str, + character: Optional[str], + scope_id: str = "", + ) -> Dict[str, Any]: + selected_character = cls._normalize_character(character) + key = cls._conversation_key(user_id, scope_id, selected_character) + + # Clear bargain context so excluded_item_ids don't carry over from previous sessions + cls._bargain_context_store.pop(key, None) + + suggested_action = cls._compute_suggested_action(user_id) + + # Check if this character has items available for bargaining. + # If yes, open the conversation with the wares catalog instead of a generic opener + # so the first message the buyer sees is the tradeable items list. + available_items = ShopService.list_available_items(character=selected_character) + if available_items: + catalog_response = cls._build_catalog_response(key, user_id, selected_character) + catalog_message = catalog_response.get("message_payload") or cls._build_chat_message( + role="assistant", + content=catalog_response.get("message", ""), + message_type="assistant", + fmt="markdown", + metadata={"kind": "shop-catalog"}, + ) + cls._conversation_store[key] = [catalog_message] + return { + "conversation_id": key, + "character": selected_character, + "opener": catalog_response.get("message", ""), + "suggested_action": suggested_action, + "messages": cls._conversation_store[key], + "timestamp": datetime.utcnow().isoformat(), + } + + # Fallback to regular opener when character has no items + opener = random.choice(cls._opener_pool[selected_character]) + cls._conversation_store[key] = [ + cls._build_chat_message( + role="assistant", + content=opener, + message_type="assistant", + fmt="markdown", + metadata={"kind": "opener"}, + ) + ] + + return { + "conversation_id": key, + "character": selected_character, + "opener": opener, + "suggested_action": suggested_action, + "messages": cls._conversation_store[key], + "timestamp": datetime.utcnow().isoformat(), + } + + @classmethod + def send_message( + cls, + user_id: int, + username: str, + character: Optional[str], + user_message: str, + scope_id: str = "", + ) -> Dict[str, Any]: + selected_character = cls._normalize_character(character) + key = cls._conversation_key(user_id, scope_id, selected_character) + + if key not in cls._conversation_store: + if cls._is_bargain_start(user_message): + cls._conversation_store[key] = [] + else: + cls.start_conversation(user_id, username, selected_character, scope_id=scope_id) + + bargain_result = cls._resolve_bargain_message( + key=key, + user_id=user_id, + selected_character=selected_character, + user_message=user_message, + ) + if bargain_result: + npc_reply = bargain_result.get("message", "Let us continue.") + history = cls._conversation_store.get(key, []) + assistant_payload = bargain_result.get("message_payload") or cls._build_chat_message( + role="assistant", + content=npc_reply, + message_type="assistant", + fmt="markdown", + ) + updated = history + [ + cls._build_chat_message( + role="user", + content=user_message.strip(), + message_type="user", + fmt="markdown", + ), + assistant_payload, + ] + cls._conversation_store[key] = updated[-20:] + + result: Dict[str, Any] = { + "conversation_id": key, + "character": selected_character, + "message": npc_reply, + "suggested_action": cls._compute_suggested_action(user_id), + "messages": cls._conversation_store[key], + "timestamp": datetime.utcnow().isoformat(), + } + if "negotiation" in bargain_result: + result["negotiation"] = bargain_result["negotiation"] + if "shop_items" in bargain_result: + result["shop_items"] = bargain_result["shop_items"] + if "balance" in bargain_result: + result["balance"] = bargain_result["balance"] + if "purchase_result" in bargain_result: + result["purchase_result"] = bargain_result["purchase_result"] + if "stats" in bargain_result: + result["stats"] = bargain_result["stats"] + return result + + suggested_action = cls._compute_suggested_action(user_id) + history = cls._conversation_store.get(key, []) + + npc_reply = cls._complete_with_azure( + character=selected_character, + username=username, + history=history, + user_message=user_message, + suggested_action=suggested_action, + ) + + if npc_reply and cls._is_out_of_character(npc_reply): + npc_reply = cls._complete_with_azure( + character=selected_character, + username=username, + history=history, + user_message=user_message, + suggested_action=suggested_action, + strict_mode=True, + ) + + if not npc_reply or cls._is_out_of_character(npc_reply): + npc_reply = cls._fallback_reply(selected_character, suggested_action, user_message) + + updated = history + [ + cls._build_chat_message( + role="user", + content=user_message.strip(), + message_type="user", + fmt="markdown", + ), + cls._build_chat_message( + role="assistant", + content=npc_reply, + message_type="assistant", + fmt="markdown", + ), + ] + + cls._conversation_store[key] = updated[-20:] + + # Determine if a quest should be offered + suggested_quest = None + turn_count = len(updated) // 2 # Approximate conversation turn count + if should_offer_quest(user_message, turn_count): + generated_quest = generate_quest( + character=selected_character, + user_message=user_message, + conversation_history=updated[-6:], + ) + if generated_quest: + suggested_quest = generated_quest + + result = { + "conversation_id": key, + "character": selected_character, + "message": npc_reply, + "suggested_action": suggested_action, + "messages": cls._conversation_store[key], + "timestamp": datetime.utcnow().isoformat(), + } + + # Add suggested quest if one was generated + if suggested_quest: + result["suggested_quest"] = suggested_quest + + return result + + @classmethod + def get_session( + cls, + user_id: int, + character: Optional[str], + scope_id: str = "", + ) -> Dict[str, Any]: + selected_character = cls._normalize_character(character) + key = cls._conversation_key(user_id, scope_id, selected_character) + return { + "conversation_id": key, + "character": selected_character, + "messages": cls._conversation_store.get(key, []), + "suggested_action": cls._compute_suggested_action(user_id), + "negotiation": cls._negotiation_store.get(key), + "balance": ShopService.get_balance(user_id), + } + + @classmethod + def reset_session(cls, user_id: int, character: Optional[str], scope_id: str = "") -> Dict[str, Any]: + selected_character = cls._normalize_character(character) + key = cls._conversation_key(user_id, scope_id, selected_character) + cls._conversation_store.pop(key, None) + cls._negotiation_store.pop(key, None) + cls._negotiation_session_ids.pop(key, None) + cls._flattery_flags.pop(key, None) + cls._bargain_context_store.pop(key, None) + return { + "conversation_id": key, + "character": selected_character, + "messages": [], + "reset": True, + } diff --git a/sut/backend/services/quest_generation_service.py b/sut/backend/services/quest_generation_service.py new file mode 100644 index 0000000..d17d8d1 --- /dev/null +++ b/sut/backend/services/quest_generation_service.py @@ -0,0 +1,441 @@ +"""Quest generation service for NPC-driven quest creation. + +Generates semantically coherent, character-appropriate quests based on: +- NPC character personality +- Conversation context +- LOTR theme adherence +""" + +import json +import logging +import random +import re +from typing import Any, Dict, List, Optional, Tuple + +from flask import current_app +from openai import AzureOpenAI + +from models.location import Location +from services.character_profiles import get_character_profile, get_quest_affinity + +# Configure logging +logger = logging.getLogger(__name__) + +# Quest generation templates organized by NPC +QUEST_GENERATION_TEMPLATES: Dict[str, Dict[str, Any]] = { + "frodo": { + "contexts": [ + "The user mentions a problem or burden they're carrying.", + "The user asks for guidance on what to do next.", + "The user seems overwhelmed by many tasks.", + ], + "themes": [ + "Hidden paths and solutions", + "Understanding the true nature of a problem", + "Journeys to unfamiliar places", + "Tests of character and courage", + ], + "title_seeds": [ + "Uncover the {nature} of {subject}", + "Journey to {location} and discover {objective}", + "Face your doubt about {challenge}", + "Find the hidden wisdom in {situation}", + ], + "types": ["The Journey", "The Fellowship", "The Ring"], + "priorities": ["Important", "Critical"], + }, + "sam": { + "contexts": [ + "The user has completed something and needs momentum.", + "The user asks for practical help or advice.", + "The user seems stuck and needs encouragement.", + ], + "themes": [ + "Building and creating", + "Practical problem-solving", + "Loyalty and companionship", + "Caring for others or a place", + ], + "title_seeds": [ + "Prepare {place} for {purpose}", + "Build or fix {object} for {reason}", + "Gather supplies: {list}", + "Care for {person_or_place} by {action}", + ], + "types": ["The Fellowship", "The Battle", "The Journey"], + "priorities": ["Important", "Standard"], + }, + "gandalf": { + "contexts": [ + "The user has reached a critical decision point.", + "The user is avoiding an important choice.", + "The user asks for strategic guidance.", + ], + "themes": [ + "Strategic choices with large consequences", + "Testing someone's resolve or wisdom", + "Understanding larger patterns", + "Containing or confronting darkness", + ], + "title_seeds": [ + "Decide the fate of {stakes}", + "Confront {threat} before it spreads", + "Understand the pattern of {mystery}", + "Test your resolve: {challenge}", + ], + "types": ["The Ring", "Dark Magic", "The Battle"], + "priorities": ["Critical", "Important"], + }, +} + +# Fallback quest generation (no AI) +FALLBACK_QUESTS: Dict[str, List[Dict[str, Any]]] = { + "frodo": [ + { + "title": "Discover the Heart of the Matter", + "description": "Consider this problem deeply: what lies at its true center? It may appear different when you understand its nature.", + "quest_type": "The Journey", + "priority": "Important", + }, + { + "title": "Walk the Hidden Path", + "description": "Every great challenge has an unexpected approach. Take time to find the unconventional route forward.", + "quest_type": "The Fellowship", + "priority": "Important", + }, + { + "title": "Test Your Courage", + "description": "Sometimes the next step demands we face what we've been avoiding. What fear guards your path?", + "quest_type": "The Ring", + "priority": "Critical", + }, + ], + "sam": [ + { + "title": "Prepare the Ground", + "description": "Good work starts with preparation. Gather what you need and organize it well before beginning.", + "quest_type": "The Fellowship", + "priority": "Important", + }, + { + "title": "Strengthen Your Bonds", + "description": "Reach out and help a companion with something they're struggling with. Loyalty matters.", + "quest_type": "The Fellowship", + "priority": "Standard", + }, + { + "title": "Build Something That Lasts", + "description": "Create or improve something that will help you and others in the times ahead.", + "quest_type": "The Battle", + "priority": "Important", + }, + ], + "gandalf": [ + { + "title": "Recognize the Pattern", + "description": "Step back and observe the larger picture. What do the recent events tell you about the true state of affairs?", + "quest_type": "The Ring", + "priority": "Critical", + }, + { + "title": "Make the Hard Choice", + "description": "A decision looms that cannot be avoided. Choose based on principle, not comfort.", + "quest_type": "The Ring", + "priority": "Critical", + }, + { + "title": "Confront the Advancing Shadow", + "description": "A threat grows. Take action now before it becomes unstoppable.", + "quest_type": "Dark Magic", + "priority": "Critical", + }, + ], +} + + +# Middle-earth locations mapping (case-insensitive) +MIDDLE_EARTH_LOCATIONS: Dict[str, List[str]] = { + "Rivendell": ["rivendell", "elrond's home", "valley of imladris", "imladris"], + "Lothlórien": ["lothlórien", "lothlórien", "golden wood", "caras galadhon"], + "Moria": ["moria", "khazad-dum", "dwarf kingdom", "mines of moria"], + "Mordor": ["mordor", "sauron's realm", "mount doom", "barad-dûr"], + "Rohan": ["rohan", "rolling plains", "mark", "edoras"], + "Gondor": ["gondor", "minas tirith", "white city", "kingdom of men"], + "The Shire": ["the shire", "shire", "hobbiton", "bag end"], + "Isengard": ["isengard", "orthanc", "wizard's tower"], + "Mirkwood": ["mirkwood", "greenwood", "thranduil", "wood-elves"], + "Lake-town": ["lake-town", "esgaroth", "bard", "barrel rider"], + "The Grey Havens": ["grey havens", "grey havens", "valinor", "undying lands", "sailing west"], + "Erebor": ["erebor", "lonely mountain", "dwarf kingdom"], + "The Grey Mountains": ["grey mountains", "misty mountains", "mountains"], +} + + +def _find_location_by_text(text: str) -> Optional[Tuple[str, int]]: + """Extract and find a location from text. + + Searches through MIDDLE_EARTH_LOCATIONS and the database to find mentions. + Returns the Location name and ID that was mentioned in the text. + + Args: + text: Text to search for location mentions + + Returns: + Tuple of (location_name, location_id) or None + """ + if not text: + return None + + text_lower = text.lower() + + # Search by known aliases + for location_name, aliases in MIDDLE_EARTH_LOCATIONS.items(): + for alias in aliases: + if alias in text_lower: + # Try to find this location in database + try: + location = Location.query.filter_by(name=location_name).first() + if location: + return (location_name, location.id) + except Exception as e: + logger.warning(f"Failed to query location {location_name}: {e}") + return (location_name, None) + + return None + + +def _add_location_to_quest(quest: Dict[str, Any]) -> Dict[str, Any]: + """Add location_id to a quest based on location mention in description. + + Searches the quest description for Middle-earth location mentions + and adds location_id if found. + + Args: + quest: Quest dict with title, description, quest_type, priority + + Returns: + Same quest dict with optional location_id added + """ + if not quest.get("description"): + return quest + + location_result = _find_location_by_text(quest["description"]) + if location_result: + location_name, location_id = location_result + if location_id: + quest["location_id"] = location_id + logger.debug(f"✓ Assigned location '{location_name}' (ID: {location_id}) to quest") + + return quest + + +def _new_azure_client() -> Optional[AzureOpenAI]: + """Create Azure OpenAI client if configured.""" + endpoint = current_app.config.get("AZURE_OPENAI_ENDPOINT", "") + api_key = current_app.config.get("AZURE_OPENAI_API_KEY", "") + api_version = current_app.config.get("AZURE_OPENAI_API_VERSION", "2024-02-15-preview") + + if not endpoint or not api_key: + return None + + return AzureOpenAI( + azure_endpoint=endpoint, + api_key=api_key, + api_version=api_version, + ) + + +def _generate_quest_with_ai( + character: str, + user_message: str, + conversation_history: List[Dict[str, str]], +) -> Optional[Dict[str, Any]]: + """Generate a quest using Azure OpenAI. + + Args: + character: NPC character (frodo, sam, gandalf) + user_message: User's latest message + conversation_history: Recent conversation turns + + Returns: + Generated quest dict or None if AI fails + """ + deployment = current_app.config.get("AZURE_OPENAI_DEPLOYMENT", "") + if not deployment: + return None + + client = _new_azure_client() + if client is None: + return None + + profile = get_character_profile(character) + quest_types = get_quest_affinity(character) + + # Build system prompt for quest generation with better context awareness + character_context = "" + if character == "frodo": + character_context = ( + "Frodo speaks of quests related to the Ring, Mordor, journeys, and bearing burdens. " + "He frames activities as part of a larger quest toward freedom. " + "Suggest locations like 'Rivendell', 'Lothlórien', 'Moria', or 'Mordor'. " + ) + elif character == "sam": + character_context = ( + "Sam thinks in practical terms: building, preparing, defending, growing. " + "He frames quests around making things better and stronger. " + "Suggest locations like 'The Shire', 'Gondor', or 'The Grey Havens'. " + ) + elif character == "gandalf": + character_context = ( + "Gandalf sees the bigger strategic picture and long-term consequences. " + "He frames quests as moves in a grand strategy against darkness. " + "Suggest locations like 'Isengard', 'Orthanc', 'Moria', or 'The Grey Havens'. " + ) + + system_prompt = f"""You are {profile.get('full_name')}, {profile.get('title')}. + +{character_context} + +Your job: Create a quest that: +1. Directly ties to what the user just said in conversation +2. Feels authentic to {character}'s personality and way of thinking +3. Uses one of these quest types: {", ".join(quest_types)} +4. Is achievable yet substantial and meaningful +5. Is set in Middle-earth—suggest a specific location +6. Frames it in {character}'s voice and perspective + +Respond with ONLY valid JSON (no markdown, no explanation): +{{ + "title": "Quest name (4-8 words, action-oriented)", + "description": "2-3 sentences: (a) what the quest entails, (b) why it matters, (c) which location it involves", + "quest_type": "{quest_types[0]}", + "priority": "Important" +}}""" + + # Build conversation context with better preservation of dialogue flow + messages = [{"role": "system", "content": system_prompt}] + + # Include last few turns to understand context + for turn in conversation_history[-6:]: + messages.append({"role": turn["role"], "content": turn["content"]}) + + # Ask for quest based on the actual conversation, not just latest message + context_summary = f"""Based on what I just heard, here's what stands out as a quest opportunity: + +Latest from the user: "{user_message}" + +Now, {profile.get('full_name')}, what quest would help them move forward?""" + + messages.append({"role": "user", "content": context_summary}) + + try: + completion = client.chat.completions.create( + model=deployment, + messages=messages, + max_tokens=300, + temperature=0.8, + ) + response_text = (completion.choices[0].message.content or "").strip() + + # Try to parse JSON + quest_data = json.loads(response_text) + + # Validate required fields + if all(k in quest_data for k in ["title", "description", "quest_type", "priority"]): + # Add location to quest if mentioned in description + quest_data = _add_location_to_quest(quest_data) + logger.info(f"✓ Azure OpenAI generated quest for {character}") + return quest_data + + except Exception as e: + logger.error(f"✗ Quest generation failed for {character}: {type(e).__name__}: {str(e)}") + pass + + return None + + +def generate_quest( + character: str, + user_message: str, + conversation_history: Optional[List[Dict[str, str]]] = None, +) -> Optional[Dict[str, Any]]: + """Generate a quest appropriate to the NPC character. + + Uses AI if available, falls back to templates + randomization. + Always attempts to assign a location based on quest description. + + Args: + character: NPC character (frodo, sam, gandalf) + user_message: User's latest message + conversation_history: Recent conversation turns (optional) + + Returns: + Quest dict with title, description, quest_type, priority, and optional location_id + """ + if not conversation_history: + conversation_history = [] + + # Try AI generation first + ai_quest = _generate_quest_with_ai(character, user_message, conversation_history) + if ai_quest: + return ai_quest + + # Fall back to template-based generation + if character not in FALLBACK_QUESTS: + character = "gandalf" + + quest = random.choice(FALLBACK_QUESTS[character]) + + # Add location to fallback quest too + quest = _add_location_to_quest(quest) + + return quest + + +def should_offer_quest(user_message: str, conversation_turn_count: int = 0) -> bool: + """Determine if this is a good moment to offer a quest. + + Offers quests when: + - User seems to be looking for direction or action (keywords) + - Early in conversation (turn 1-2) to set the tone + - User asks for help explicitly + - User seems stuck or overwhelmed + + Args: + user_message: User's latest message + conversation_turn_count: Number of turns in conversation + + Returns: + True if a quest should be offered + """ + message_lower = user_message.lower().strip() + + # Strong signals for quest readiness + strong_keywords = [ + "help", "stuck", "what next", "what should", "can you suggest", + "guide", "quest", "task", "challenge", "adventure", "action", + "ready", "let's", "should we", "next step", "forward" + ] + has_strong_signal = any(kw in message_lower for kw in strong_keywords) + + # Softer signals (still valid but need turn count context) + soft_keywords = ["do", "can", "shall", "would", "could", "problem"] + has_soft_signal = any(kw in message_lower for kw in soft_keywords) + + # Never offer in the first turn (let conversation start naturally) + if conversation_turn_count < 1: + return False + + # Always offer if there's a strong signal + if has_strong_signal: + return True + + # Offer in early conversations even with soft signals + if conversation_turn_count <= 2 and has_soft_signal: + return True + + # Occasionally offer even without keywords (keep engagement) + if conversation_turn_count == 2 and len(message_lower) > 10: + return True + + return False diff --git a/sut/backend/services/shop_service.py b/sut/backend/services/shop_service.py new file mode 100644 index 0000000..79c6a44 --- /dev/null +++ b/sut/backend/services/shop_service.py @@ -0,0 +1,125 @@ +"""Shop service for bargaining, purchases, balance, and personal stats.""" +from __future__ import annotations + +from typing import Any, Dict, List, Optional + +from models.user import User, db +from models.item import Item +from models.inventory_item import InventoryItem + + +class ShopService: + """Business logic for item listings and purchases.""" + + @classmethod + def list_available_items(cls, character: Optional[str] = None, query_obj=None) -> List[Dict[str, Any]]: + # Allow injection of a mock query object for testing + query = query_obj if query_obj is not None else Item.query.filter(Item.is_sold.is_(False)) + if character: + query = query.filter(Item.owner_character == character.lower()) + return [item.to_public_dict() for item in query.order_by(Item.id.asc()).all()] + + @classmethod + def get_item_public(cls, item_id: int) -> Optional[Dict[str, Any]]: + item = Item.query.get(item_id) + if not item: + return None + return item.to_public_dict() + + @classmethod + def get_balance(cls, user_id: int) -> Dict[str, Any]: + user = User.query.get(user_id) + if not user: + raise ValueError('User not found') + return {'gold': user.gold} + + @classmethod + def purchase_item(cls, user_id: int, item_id: int, paid_price: int) -> Dict[str, Any]: + user = User.query.get(user_id) + if not user: + raise ValueError('User not found') + + item = Item.query.get(item_id) + if not item: + raise ValueError('Item not found') + + if item.is_sold: + raise ValueError('Item is already sold') + + if paid_price <= 0: + raise ValueError('Paid price must be positive') + + if user.gold < paid_price: + raise ValueError('Insufficient gold') + + savings_percent = ((item.base_price - paid_price) / item.base_price) * 100 if item.base_price else 0.0 + + user.gold -= paid_price + item.is_sold = True + + entry = InventoryItem( + user_id=user.id, + item_id=item.id, + paid_price=paid_price, + base_price_revealed=item.base_price, + savings_percent=round(savings_percent, 2), + acquired_price=paid_price, # Set to same as paid_price + ) + + db.session.add(entry) + db.session.commit() + + return { + 'purchase': entry.to_dict(), + 'balance': {'gold': user.gold}, + 'deal_quality': 'good' if savings_percent > 0 else 'bad' if savings_percent < 0 else 'fair', + } + + @classmethod + def get_user_inventory(cls, user_id: int) -> List[Dict[str, Any]]: + entries = ( + InventoryItem.query + .filter(InventoryItem.user_id == user_id) + .order_by(InventoryItem.created_at.desc()) + .all() + ) + return [entry.to_dict() for entry in entries] + + @classmethod + def get_user_stats(cls, user_id: int) -> Dict[str, Any]: + entries = cls.get_user_inventory(user_id) + if not entries: + return { + 'purchased_count': 0, + 'best_bargain_percent': 0, + 'average_savings_percent': 0, + } + + savings_values = [float(entry['savings_percent']) for entry in entries] + average = sum(savings_values) / len(savings_values) + + return { + 'purchased_count': len(entries), + 'best_bargain_percent': round(max(savings_values), 2), + 'average_savings_percent': round(average, 2), + } + + @classmethod + def reset_for_tests(cls) -> Dict[str, Any]: + """Reset shop state for testing: unsell items, reset user gold, clear purchases.""" + # Mark all items as not sold + Item.query.update({'is_sold': False}) + + # Reset all users to 500 gold (initial seed amount per requirements) + User.query.update({'gold': 500}) + + # Clear all inventory items + InventoryItem.query.delete() + + db.session.commit() + + return { + 'items_reset': Item.query.count(), + 'users_reset': User.query.count(), + 'purchases_cleared': True, + } diff --git a/sut/backend/utils/__init__.py b/sut/backend/utils/__init__.py new file mode 100644 index 0000000..af2b2d0 --- /dev/null +++ b/sut/backend/utils/__init__.py @@ -0,0 +1 @@ +"""Utility modules for the backend.""" diff --git a/sut/backend/utils/__pycache__/__init__.cpython-311.pyc b/sut/backend/utils/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..96054f0 Binary files /dev/null and b/sut/backend/utils/__pycache__/__init__.cpython-311.pyc differ diff --git a/sut/backend/utils/__pycache__/database.cpython-311.pyc b/sut/backend/utils/__pycache__/database.cpython-311.pyc new file mode 100644 index 0000000..28c97b8 Binary files /dev/null and b/sut/backend/utils/__pycache__/database.cpython-311.pyc differ diff --git a/sut/backend/utils/__pycache__/seed_data.cpython-311.pyc b/sut/backend/utils/__pycache__/seed_data.cpython-311.pyc new file mode 100644 index 0000000..f9b8ef3 Binary files /dev/null and b/sut/backend/utils/__pycache__/seed_data.cpython-311.pyc differ diff --git a/sut/backend/utils/database.py b/sut/backend/utils/database.py new file mode 100644 index 0000000..b2b590d --- /dev/null +++ b/sut/backend/utils/database.py @@ -0,0 +1,204 @@ +"""Database initialization and management.""" +from flask import Flask +from models.user import db +from sqlalchemy import text +import os + +def init_db(app: Flask) -> None: + # Initialize db with app + db.init_app(app) + + with app.app_context(): + # Handle migrations for existing inventory_items table + try: + result = db.session.execute(text("SELECT name FROM sqlite_master WHERE type='table' AND name='inventory_items'")) + table_exists = result.fetchone() is not None + + if table_exists: + result = db.session.execute(text("PRAGMA table_info(inventory_items)")) + columns = [row[1] for row in result] + + if 'paid_price' not in columns: + db.session.execute(text("ALTER TABLE inventory_items ADD COLUMN paid_price INTEGER DEFAULT 0")) + print("Added paid_price column to inventory_items") + + if 'base_price_revealed' not in columns: + db.session.execute(text("ALTER TABLE inventory_items ADD COLUMN base_price_revealed INTEGER DEFAULT 0")) + print("Added base_price_revealed column to inventory_items") + + if 'savings_percent' not in columns: + db.session.execute(text("ALTER TABLE inventory_items ADD COLUMN savings_percent FLOAT DEFAULT 0")) + print("Added savings_percent column to inventory_items") + + if 'created_at' not in columns: + db.session.execute(text("ALTER TABLE inventory_items ADD COLUMN created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP")) + print("Added created_at column to inventory_items") + + # Fix for legacy acquired_price column: add if missing, make nullable if present + if 'acquired_price' not in columns: + db.session.execute(text("ALTER TABLE inventory_items ADD COLUMN acquired_price INTEGER NULL")) + print("Added acquired_price column to inventory_items (nullable)") + else: + # Try to make it nullable if not already + try: + db.session.execute(text("ALTER TABLE inventory_items ALTER COLUMN acquired_price DROP NOT NULL")) + print("Made acquired_price column nullable") + except Exception as e: + print(f"Could not alter acquired_price nullability: {e}") + + db.session.commit() + print("Inventory items table migration completed successfully") + except Exception as e: + db.session.rollback() + print(f"Inventory items migration note: {e} (this is normal for new databases)") + # Import all models to register them + from models.user import User + from models.quest import Quest + from models.member import Member + from models.location import Location + from models.item import Item + from models.inventory_item import InventoryItem + + # Create all tables + db.create_all() + print("Database tables created successfully") + + # Handle migrations for existing users table + try: + users_result = db.session.execute(text("PRAGMA table_info(users)")) + user_columns = {row[1]: row[2] for row in users_result} + + if 'gold' not in user_columns: + db.session.execute(text("ALTER TABLE users ADD COLUMN gold INTEGER DEFAULT 500")) + print("Added gold column to users") + + db.session.execute(text("UPDATE users SET gold = 500 WHERE gold IS NULL")) + db.session.commit() + print("Users table migration completed successfully") + except Exception as e: + db.session.rollback() + print(f"Users migration note: {e} (this is normal for new databases)") + + # Handle migrations for existing quests table + try: + # Check if quests table exists and has old columns + result = db.session.execute(text("PRAGMA table_info(quests)")) + columns = {row[1]: row[2] for row in result} + + # Add new columns if they don't exist + if 'quest_type' not in columns: + db.session.execute(text("ALTER TABLE quests ADD COLUMN quest_type VARCHAR(50)")) + print("Added quest_type column") + + if 'priority' not in columns: + db.session.execute(text("ALTER TABLE quests ADD COLUMN priority VARCHAR(20)")) + print("Added priority column") + + if 'is_dark_magic' not in columns: + db.session.execute(text("ALTER TABLE quests ADD COLUMN is_dark_magic BOOLEAN DEFAULT 0")) + print("Added is_dark_magic column") + + if 'character_quote' not in columns: + db.session.execute(text("ALTER TABLE quests ADD COLUMN character_quote TEXT")) + print("Added character_quote column") + + if 'completed_at' not in columns: + db.session.execute(text("ALTER TABLE quests ADD COLUMN completed_at DATETIME")) + print("Added completed_at column") + + # Migrate status values from old to new LOTR terminology + status_mapping = { + 'pending': 'not_yet_begun', + 'in_progress': 'the_road_goes_ever_on', + 'completed': 'it_is_done', + 'blocked': 'the_shadow_falls' + } + + for old_status, new_status in status_mapping.items(): + db.session.execute( + text("UPDATE quests SET status = :new_status WHERE status = :old_status"), + {'new_status': new_status, 'old_status': old_status} + ) + + # Update default status for new quests + db.session.execute(text("UPDATE quests SET status = 'not_yet_begun' WHERE status = 'pending'")) + + db.session.commit() + print("Database migration completed successfully") + except Exception as e: + # If migration fails, rollback and continue (table might be new) + db.session.rollback() + print(f"Migration note: {e} (this is normal for new databases)") + + # Handle migrations for existing locations table + try: + # Check if locations table exists + result = db.session.execute(text("SELECT name FROM sqlite_master WHERE type='table' AND name='locations'")) + table_exists = result.fetchone() is not None + + if table_exists: + # Get existing columns + result = db.session.execute(text("PRAGMA table_info(locations)")) + columns = [row[1] for row in result] # row[1] is the column name + + # Add new columns if they don't exist + if 'map_x' not in columns: + db.session.execute(text("ALTER TABLE locations ADD COLUMN map_x REAL")) + print("Added map_x column to locations") + + if 'map_y' not in columns: + db.session.execute(text("ALTER TABLE locations ADD COLUMN map_y REAL")) + print("Added map_y column to locations") + + db.session.commit() + print("Locations table migration completed successfully") + except Exception as e: + # If migration fails, rollback and continue + db.session.rollback() + print(f"Locations migration error: {e}") + import traceback + traceback.print_exc() + + # Handle migrations for existing items table + try: + result = db.session.execute(text("SELECT name FROM sqlite_master WHERE type='table' AND name='items'")) + table_exists = result.fetchone() is not None + + if table_exists: + result = db.session.execute(text("PRAGMA table_info(items)")) + columns = [row[1] for row in result] + + if 'owner_character' not in columns: + db.session.execute(text("ALTER TABLE items ADD COLUMN owner_character VARCHAR(80) DEFAULT 'gandalf'")) + print("Added owner_character column to items") + + if 'personality_profile' not in columns: + db.session.execute(text("ALTER TABLE items ADD COLUMN personality_profile VARCHAR(40) DEFAULT 'bargainer'")) + print("Added personality_profile column to items") + + if 'asking_price' not in columns: + db.session.execute(text("ALTER TABLE items ADD COLUMN asking_price INTEGER DEFAULT 100")) + print("Added asking_price column to items") + + if 'is_sold' not in columns: + db.session.execute(text("ALTER TABLE items ADD COLUMN is_sold BOOLEAN DEFAULT 0")) + print("Added is_sold column to items") + + if 'created_at' not in columns: + db.session.execute(text("ALTER TABLE items ADD COLUMN created_at DATETIME")) + print("Added created_at column to items") + + if 'updated_at' not in columns: + db.session.execute(text("ALTER TABLE items ADD COLUMN updated_at DATETIME")) + print("Added updated_at column to items") + + db.session.execute(text("UPDATE items SET asking_price = COALESCE(asking_price, base_price, 100)")) + db.session.execute(text("UPDATE items SET personality_profile = COALESCE(personality_profile, 'bargainer')")) + db.session.execute(text("UPDATE items SET owner_character = COALESCE(owner_character, 'gandalf')")) + db.session.execute(text("UPDATE items SET created_at = COALESCE(created_at, CURRENT_TIMESTAMP)")) + db.session.execute(text("UPDATE items SET updated_at = COALESCE(updated_at, CURRENT_TIMESTAMP)")) + db.session.commit() + print("Items table migration completed successfully") + except Exception as e: + db.session.rollback() + print(f"Items migration note: {e} (this is normal for new databases)") \ No newline at end of file diff --git a/sut/backend/utils/seed_data.py b/sut/backend/utils/seed_data.py new file mode 100644 index 0000000..d293581 --- /dev/null +++ b/sut/backend/utils/seed_data.py @@ -0,0 +1,602 @@ +"""Seed data initialization for the Fellowship Quest Tracker.""" +from models.user import User, db +from models.member import Member +from models.location import Location +from models.quest import Quest +from models.item import Item +from flask import Flask +from typing import List, Dict, Any + +def seed_members() -> List[Member]: + """Create Fellowship members.""" + members_data = [ + { + 'name': 'Frodo Baggins', + 'race': 'Hobbit', + 'role': 'Ring-bearer', + 'status': 'active', + 'description': 'The brave hobbit who carries the One Ring to Mount Doom.' + }, + { + 'name': 'Samwise Gamgee', + 'race': 'Hobbit', + 'role': 'Companion', + 'status': 'active', + 'description': 'Frodo\'s loyal friend and companion on the journey.' + }, + { + 'name': 'Aragorn', + 'race': 'Human', + 'role': 'Ranger', + 'status': 'active', + 'description': 'The rightful heir to the throne of Gondor.' + }, + { + 'name': 'Legolas', + 'race': 'Elf', + 'role': 'Archer', + 'status': 'active', + 'description': 'Elven prince and master archer from Mirkwood.' + }, + { + 'name': 'Gimli', + 'race': 'Dwarf', + 'role': 'Warrior', + 'status': 'active', + 'description': 'Dwarf warrior from the Lonely Mountain.' + }, + { + 'name': 'Gandalf', + 'race': 'Wizard', + 'role': 'Guide', + 'status': 'active', + 'description': 'The Grey Wizard who guides the Fellowship.' + } + ] + + members = [] + for data in members_data: + member = Member.query.filter_by(name=data['name']).first() + if not member: + member = Member(**data) + db.session.add(member) + members.append(member) + else: + members.append(member) + + db.session.commit() + return members + +def seed_locations() -> List[Location]: + """Create Middle-earth locations. + + Coordinates are pixel-based, matching the MiddleEarthMap coordinate system. + Map image dimensions: 5000x4344 pixels (width x height). + Coordinates from MiddleEarthMap by Yohann Bethoule (https://github.com/YohannBethoule/MiddleEarthMap). + Includes all 45 locations from the original MiddleEarthMap markers.json. + """ + locations_data = [ + # Eriador + { + 'name': 'Hobbiton', + 'region': 'Eriador', + 'description': 'Hobbiton was a hobbit village in the central regions of the Shire, within the borders of the Westfarthing.', + 'map_x': 1482.0, + 'map_y': 1158.0 + }, + { + 'name': 'The Shire', + 'region': 'Eriador', + 'description': 'The peaceful homeland of the Hobbits.', + 'map_x': 1482.0, + 'map_y': 1158.0 + }, + { + 'name': 'Bree', + 'region': 'Eriador', + 'description': 'Bree was the chief village of Bree-land, a small wooded region near the intersection of the main north-south and east-west routes through Eriador. Bree-land was the only part of Middle-earth where Men and hobbits dwelt side by side and Bree had a large population of Hobbits.', + 'map_x': 1793.0, + 'map_y': 1163.0 + }, + { + 'name': 'Rivendell', + 'region': 'Eriador', + 'description': 'Rivendell was established by Elrond in S.A. 1697 as a refuge from Sauron after the Fall of Eregion. It remained Elrond\'s seat throughout the remainder of the Second Age and until the end of the Third Age, when he took the White Ship for Valinor.', + 'map_x': 2516.0, + 'map_y': 1123.0 + }, + { + 'name': 'Grey Havens', + 'region': 'Eriador', + 'description': 'Founded by the Elves of Lindon in S.A. 1, the Grey Havens were known for their good harbourage and many ships; these were used by any of the Eldar to leave Middle-earth for Eressëa or Valinor.', + 'map_x': 1047.0, + 'map_y': 1186.0 + }, + { + 'name': 'Weathertop', + 'region': 'Eriador', + 'description': 'In T.A.3018, Amun Sûl was the scene of two fights involving the Nazgûl: one with Gandalf on October 3 and one with the Ring-bearer three days later.', + 'map_x': 2000.0, + 'map_y': 1158.0 + }, + # Rhovanion + { + 'name': 'Esgaroth', + 'region': 'Rhovanion', + 'description': 'Lake-Town was the township of the Lake-men in Wilderland. The town was constructed entirely of wood and stood upon wooden pillars sunk into the bed of the Long Lake, as a protection against the dragon Smaug, who dwelt nearby in the Lonely Mountain.', + 'map_x': 3418.0, + 'map_y': 885.0 + }, + { + 'name': 'Erebor', + 'region': 'Rhovanion', + 'description': 'The Longbeards had control of Erebor since at least the early Second Age. With the awakening of Durin\'s Bane in the capital of Khazad-dûm, Thráin I led a group of Dwarves to Erebor. Once there, the dwarves dug caves and halls to form an underground city, thus establishing the Kingdom under the Mountain in T.A. 1999.', + 'map_x': 3405.0, + 'map_y': 825.0 + }, + { + 'name': 'Lothlórien', + 'region': 'Rhovanion', + 'description': 'Lothlórien (or Lórien) was a kingdom of Silvan Elves on the eastern side of the Hithaeglir. It was considered one of the most beautiful and "elvish" places in Middle-earth during the Third Age, and had the only mallorn-trees east of the sea.', + 'map_x': 2666.0, + 'map_y': 1679.0 + }, + { + 'name': 'Elvenking\'s Hall', + 'region': 'Rhovanion', + 'description': 'Elvenking\'s Hall were a cave system in northern Mirkwood, in which King Thranduil and many of the Elves of Mirkwood lived during most of the Third Age and into the Fourth Age.', + 'map_x': 3311.0, + 'map_y': 849.0 + }, + { + 'name': 'Dol Guldur', + 'region': 'Rhovanion', + 'description': 'Dol Guldur ("Hill of Sorcery" in Sindarin), also called "the dungeons of the Necromancer", was a stronghold of Sauron located in the south of Mirkwood.', + 'map_x': 3014.0, + 'map_y': 1629.0 + }, + { + 'name': 'Edoras', + 'region': 'Rhovanion', + 'description': 'Edoras was the capital of Rohan that held the Golden Hall of Meduseld. Rohan\'s first capital was at Aldburg in the Folde, until King Eorl the Young or his son Brego built Edoras in T.A. 2569.', + 'map_x': 2589.0, + 'map_y': 2383.0 + }, + { + 'name': 'Rohan', + 'region': 'Rhovanion', + 'description': 'The land of the Horse-lords.', + 'map_x': 2589.0, + 'map_y': 2383.0 + }, + { + 'name': 'Helm\'s Deep', + 'region': 'Rhovanion', + 'description': 'Helm\'s Deep was a large valley gorge in the north-western Ered Nimrais (White Mountains) below the Thrihyrne. It was actually the name of the whole defensive system including its major defensive structure, the Hornburg.', + 'map_x': 2423.0, + 'map_y': 2321.0 + }, + { + 'name': 'Beorn\'s Hall', + 'region': 'Rhovanion', + 'description': 'Beorn\'s Hall was the home of Beorn, a powerful Skin-changer. Beorn hosted and aided Thorin and Company during their Quest for Erebor.', + 'map_x': 2871.0, + 'map_y': 1016.0 + }, + { + 'name': 'Dale', + 'region': 'Rhovanion', + 'description': 'Dale was a great city of the Northmen which was destroyed by Smaug and rebuilt as the capital of a great kingdom after his demise.', + 'map_x': 3430.0, + 'map_y': 855.0 + }, + # Misty Mountains + { + 'name': 'Moria', + 'region': 'Misty Mountains', + 'description': 'Khazad-dûm was the grandest and most famous of the mansions of the Dwarves. There, for many thousands of years, a thriving Dwarvish community created the greatest city ever known.', + 'map_x': 2492.0, + 'map_y': 1505.0 + }, + { + 'name': 'Goblin-town', + 'region': 'Misty Mountains', + 'description': 'Goblin-town was a Goblin dwelling under the Misty Mountains, which was ruled by the Great Goblin. Goblin-town was a series of tunnels and caverns, which went all the way through the mountains, with a "back door" (the Goblin-gate) near the Eagle\'s Eyrie in Wilderland, which served as a means of escape, and an access to the Wilderland.', + 'map_x': 2647.0, + 'map_y': 980.0 + }, + # Mordor + { + 'name': 'Mount Doom', + 'region': 'Mordor', + 'description': 'Melkor created Mount Doom in the First Age. When Sauron chose the land of Mordor as his dwelling-place in the Second Age, Orodruin was the reason for his choice. The mountain erupted in S.A. 3429, signalling Sauron\'s attack on Gondor and it took the name Amon Amarth, "Mount Doom". This is where the One Ring was forged by Sauron, and where it was destroyed by Gollum.', + 'map_x': 3606.0, + 'map_y': 2603.0 + }, + { + 'name': 'Mordor', + 'region': 'Mordor', + 'description': 'The dark land of Sauron, where the One Ring was forged.', + 'map_x': 3606.0, + 'map_y': 2603.0 + }, + { + 'name': 'Minas Morgul', + 'region': 'Mordor', + 'description': 'Minas Morgul (originally called Minas Ithil) was the twin city of Minas Tirith before its fall to the forces of Sauron in the Third Age. It then became the stronghold of the Witch-king of Angmar until Sauron\'s defeat.', + 'map_x': 3424.0, + 'map_y': 2695.0 + }, + { + 'name': 'Black Gate', + 'region': 'Mordor', + 'description': 'The Black Gate was the main entrance into the land of Mordor. It was built by Sauron after he chose Mordor as a land to make into a stronghold in S.A. 1000.', + 'map_x': 3389.0, + 'map_y': 2377.0 + }, + { + 'name': 'Barad-dûr', + 'region': 'Mordor', + 'description': 'Barad-dûr, also known as the Dark Tower, was the chief fortress of Sauron, on the Plateau of Gorgoroth in Mordor. Sauron began to build Barad-dûr in around S.A. 1000, and completed his fortress after 600 years of the construction with the power of the Ring.', + 'map_x': 3750.0, + 'map_y': 2553.0 + }, + # Gondor + { + 'name': 'Minas Tirith', + 'region': 'Gondor', + 'description': 'Minas Tirith was originally a fortress, Minas Anor, built in S.A. 3320 by the Faithful Númenóreans. From T.A. 1640 onwards it was the capital of the South-kingdom and the seat of its Kings and ruling Stewards.', + 'map_x': 3279.0, + 'map_y': 2707.0 + }, + { + 'name': 'Osgiliath', + 'region': 'Gondor', + 'description': 'Founded by Isildur and Anárion near the end of the Second Age, Osgiliath was designated the capital of the southern Númenórean kingdom in exile, Gondor. It stays so until the King\'s House was moved to the more secure Minas Anor in T.A. 1640.', + 'map_x': 3330.0, + 'map_y': 2700.0 + }, + { + 'name': 'Paths of the Dead', + 'region': 'Gondor', + 'description': 'The Paths of the Dead was a haunted underground passage through the White Mountains that led from Harrowdale in Rohan to Blackroot Vale in Gondor.', + 'map_x': 2605.0, + 'map_y': 2535.0 + }, + # Isengard + { + 'name': 'Isengard', + 'region': 'Isengard', + 'description': 'Isengard was one of the three major fortresses of Gondor, and held within it one of the realm\'s palantíri. In the latter half of the Third Age, the stronghold came into the possession of Saruman, becoming his home and personal domain until his defeat in the War of the Ring.', + 'map_x': 2335.0, + 'map_y': 2117.0 + }, + # Angmar + { + 'name': 'Carn Dûm', + 'region': 'Angmar', + 'description': 'Carn Dûm was the chief fortress of the realm of Angmar and the seat of its king until its defeat against the combined armies of Gondor, Lindon and Arnor in T.A. 1974.', + 'map_x': 2115.0, + 'map_y': 523.0 + }, + { + 'name': 'Mount Gram', + 'region': 'Angmar', + 'description': 'Mount Gram was inhabited by Orcs led by their King Golfimbul. In T.A. 2747 they attacked much of northern Eriador, but were defeated in the Battle of Greenfields.', + 'map_x': 2353.0, + 'map_y': 746.0 + } + ] + + locations = [] + for data in locations_data: + location = Location.query.filter_by(name=data['name']).first() + if not location: + location = Location(**data) + db.session.add(location) + locations.append(location) + else: + # Update existing location with coordinates if missing + if location.map_x is None or location.map_y is None: + location.map_x = data.get('map_x') + location.map_y = data.get('map_y') + locations.append(location) + + db.session.commit() + return locations + +def seed_users(members: List[Member]) -> List[User]: + """Create user accounts for Fellowship members.""" + users = [] + default_password = 'fellowship123' # Simple password for MVP + + for member in members: + user = User.query.filter_by(username=member.name.lower().replace(' ', '_')).first() + if not user: + user = User( + username=member.name.lower().replace(' ', '_'), + email=f"{member.name.lower().replace(' ', '_')}@fellowship.com", + role=member.name, + gold=500, + ) + user.set_password(default_password) + db.session.add(user) + users.append(user) + else: + if user.gold is None: + user.gold = 500 + users.append(user) + + db.session.commit() + return users + +def seed_quests(locations: List[Location], users: List[User]) -> List[Quest]: + """Create initial quests with epic descriptions and LOTR attributes.""" + quests_data = [ + { + 'title': 'Destroy the One Ring', + 'description': 'Journey to the fires of Mount Doom and cast the Ring into the flames where it was forged. The fate of Middle-earth depends on this quest.', + 'status': 'the_road_goes_ever_on', + 'quest_type': 'The Ring', + 'priority': 'Critical', + 'is_dark_magic': False, + 'character_quote': 'I will take the Ring, though I do not know the way.', + 'location_name': 'Mount Doom', # Use specific location name + 'assignee_username': 'frodo_baggins' + }, + { + 'title': 'Reach Rivendell', + 'description': 'Travel to Rivendell to seek counsel from Elrond. The Last Homely House awaits, where the Fellowship will be formed and the path forward decided.', + 'status': 'it_is_done', + 'quest_type': 'The Journey', + 'priority': 'Important', + 'is_dark_magic': False, + 'character_quote': 'The Road goes ever on and on...', + 'location_name': 'Rivendell', + 'assignee_username': 'frodo_baggins' + }, + { + 'title': 'Cross the Misty Mountains', + 'description': 'Navigate through the treacherous Misty Mountains, avoiding the dangers that lurk in the shadows and the watchful eyes of the enemy.', + 'status': 'it_is_done', + 'quest_type': 'The Journey', + 'priority': 'Important', + 'is_dark_magic': False, + 'character_quote': None, + 'location_name': 'Moria', + 'assignee_username': 'aragorn' + }, + { + 'title': 'Escape from Moria', + 'description': 'Flee from the depths of Moria as the Balrog awakens. The Fellowship must escape before the darkness consumes them.', + 'status': 'it_is_done', + 'quest_type': 'The Battle', + 'priority': 'Critical', + 'is_dark_magic': False, + 'character_quote': 'Fly, you fools!', + 'location_name': 'Moria', + 'assignee_username': 'gandalf' + }, + { + 'title': 'Reach Mordor', + 'description': 'Travel to the dark land of Mordor, where Sauron\'s power is strongest. The journey grows more perilous with each step.', + 'status': 'the_road_goes_ever_on', + 'quest_type': 'The Journey', + 'priority': 'Critical', + 'is_dark_magic': False, + 'character_quote': None, + 'location_name': 'Mordor', # Keep generic name, will match either "Mordor" or "Mount Doom" + 'assignee_username': 'frodo_baggins' + }, + { + 'title': 'Fix the Broken Bridge', + 'description': 'Sauron\'s dark magic has corrupted the bridge. The Fellowship must restore it to continue their journey. This quest has been tainted by dark forces.', + 'status': 'the_shadow_falls', + 'quest_type': 'Dark Magic', + 'priority': 'Critical', + 'is_dark_magic': True, + 'character_quote': None, + 'location_name': 'Edoras', # Use specific location name + 'assignee_username': 'samwise_gamgee' + }, + { + 'title': 'Rescue Merry and Pippin', + 'description': 'The Fellowship must rescue the captured Hobbits from the Uruk-hai. Time is running out, and the fate of our friends hangs in the balance.', + 'status': 'not_yet_begun', + 'quest_type': 'The Fellowship', + 'priority': 'Important', + 'is_dark_magic': False, + 'character_quote': None, + 'location_name': 'Edoras', # Use specific location name + 'assignee_username': 'aragorn' + }, + { + 'title': 'Defend Helm\'s Deep', + 'description': 'Stand with the people of Rohan as they face the armies of Saruman. The battle will be fierce, but courage and unity will prevail.', + 'status': 'not_yet_begun', + 'quest_type': 'The Battle', + 'priority': 'Critical', + 'is_dark_magic': False, + 'character_quote': None, + 'location_name': 'Helm\'s Deep', # Use specific location name + 'assignee_username': 'aragorn' + } + ] + + quests = [] + for data in quests_data: + # Find location + location = next((loc for loc in locations if loc.name == data['location_name']), None) + # Find user + user = next((u for u in users if u.username == data['assignee_username']), None) + + quest = Quest.query.filter_by(title=data['title']).first() + if not quest: + quest = Quest( + title=data['title'], + description=data['description'], + status=data['status'], + quest_type=data.get('quest_type'), + priority=data.get('priority'), + is_dark_magic=data.get('is_dark_magic', False), + character_quote=data.get('character_quote'), + location_id=location.id if location else None, + assigned_to=user.id if user else None + ) + # Set completed_at if quest is done + if data['status'] == 'it_is_done': + from datetime import datetime + quest.completed_at = datetime.utcnow() + db.session.add(quest) + quests.append(quest) + else: + # Update existing quest with new fields if they're missing + if quest.quest_type is None and data.get('quest_type'): + quest.quest_type = data.get('quest_type') + if quest.priority is None and data.get('priority'): + quest.priority = data.get('priority') + if quest.is_dark_magic is False and data.get('is_dark_magic'): + quest.is_dark_magic = data.get('is_dark_magic') + if quest.character_quote is None and data.get('character_quote'): + quest.character_quote = data.get('character_quote') + # Update location_id if missing or if location name matches + if quest.location_id is None and location: + quest.location_id = location.id + elif quest.location_id is None: + # Try to find location by name if not found initially + location = next((loc for loc in locations if loc.name == data['location_name']), None) + if location: + quest.location_id = location.id + # Migrate old status values + status_mapping = { + 'pending': 'not_yet_begun', + 'in_progress': 'the_road_goes_ever_on', + 'completed': 'it_is_done', + 'blocked': 'the_shadow_falls' + } + if quest.status in status_mapping: + quest.status = status_mapping[quest.status] + quests.append(quest) + + db.session.commit() + return quests + + +def seed_items() -> List[Item]: + """Create initial unique seller items for bargaining gameplay.""" + items_data = [ + { + 'name': 'Sting-polished Scabbard', + 'description': 'A meticulously maintained hobbit scabbard with Elvish runes.', + 'owner_character': 'frodo', + 'personality_profile': 'sentimental', + 'base_price': 140, + 'asking_price': 195, + }, + { + 'name': 'Shire Herb Satchel', + 'description': 'Sam\'s hand-stitched satchel, still smelling faintly of rosemary.', + 'owner_character': 'sam', + 'personality_profile': 'generous', + 'base_price': 95, + 'asking_price': 120, + }, + { + 'name': 'Grey Pilgrim Pipe', + 'description': 'A weathered pipe with intricate wizard-carved symbols.', + 'owner_character': 'gandalf', + 'personality_profile': 'bargainer', + 'base_price': 260, + 'asking_price': 360, + }, + { + 'name': 'Second Breakfast Pan', + 'description': 'A surprisingly sturdy pan fit for long roads and many meals.', + 'owner_character': 'sam', + 'personality_profile': 'bargainer', + 'base_price': 70, + 'asking_price': 98, + }, + { + 'name': 'Wizard Hat (Scuffed Edition)', + 'description': 'A tall, dramatic hat with glorious wear and a few mysterious burns.', + 'owner_character': 'gandalf', + 'personality_profile': 'stingy', + 'base_price': 210, + 'asking_price': 315, + }, + { + 'name': 'Mithril Shield', + 'description': 'A legendary shield forged from mithril, light yet stronger than steel.', + 'owner_character': 'frodo', + 'personality_profile': 'sentimental', + 'base_price': 350, + 'asking_price': 450, + }, + { + 'name': 'Sword of Elendil', + 'description': 'An ancient sword with a storied history from the days of old.', + 'owner_character': 'frodo', + 'personality_profile': 'bargainer', + 'base_price': 400, + 'asking_price': 500, + }, + { + 'name': 'Sword of Narsil', + 'description': 'A legendary blade shattered and reforged with great power.', + 'owner_character': 'frodo', + 'personality_profile': 'stingy', + 'base_price': 450, + 'asking_price': 550, + }, + { + 'name': 'Lembas Bread', + 'description': 'Elvish lembas bread that sustains travelers on long journeys.', + 'owner_character': 'sam', + 'personality_profile': 'generous', + 'base_price': 150, + 'asking_price': 180, + }, + { + 'name': 'Elven Rope', + 'description': 'A strong and graceful rope crafted by Elven artisans.', + 'owner_character': 'frodo', + 'personality_profile': 'bargainer', + 'base_price': 80, + 'asking_price': 110, + }, + ] + + seeded_items: List[Item] = [] + for payload in items_data: + item = Item.query.filter_by(name=payload['name']).first() + if not item: + item = Item(**payload) + db.session.add(item) + seeded_items.append(item) + + db.session.commit() + return seeded_items + +def seed_database(app: Flask) -> None: + """Seed the database with initial data.""" + with app.app_context(): + print("Seeding database...") + + # Seed in order: members -> locations -> users -> quests + members = seed_members() + print(f"Seeded {len(members)} members") + + locations = seed_locations() + print(f"Seeded {len(locations)} locations") + + users = seed_users(members) + print(f"Seeded {len(users)} users") + + quests = seed_quests(locations, users) + print(f"Seeded {len(quests)} quests") + + items = seed_items() + print(f"Seeded {len(items)} market items") + + print("Database seeding completed!") diff --git a/sut/backend/verify_config.py b/sut/backend/verify_config.py new file mode 100644 index 0000000..c713d3c --- /dev/null +++ b/sut/backend/verify_config.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +"""Verify Azure OpenAI configuration is loaded correctly.""" +import sys +from pathlib import Path + +# Add backend to path +backend_dir = Path(__file__).parent +sys.path.insert(0, str(backend_dir)) + +from config import Config + +def main(): + config = Config() + + print("\n" + "=" * 70) + print("Azure OpenAI Configuration Status") + print("=" * 70) + + has_endpoint = bool(config.AZURE_OPENAI_ENDPOINT) + has_api_key = bool(config.AZURE_OPENAI_API_KEY) + + status = "✅ ACTIVE" if (has_endpoint and has_api_key) else "❌ NOT CONFIGURED" + print(f"\nStatus: {status}\n") + + print(f"Endpoint: {config.AZURE_OPENAI_ENDPOINT if has_endpoint else '(not set)'}") + print(f"API Key: {'(loaded from .env)' if has_api_key else '(not set)'}") + print(f"Deployment: {config.AZURE_OPENAI_DEPLOYMENT}") + print(f"API Version: {config.AZURE_OPENAI_API_VERSION}") + print(f"Max Tokens: {config.AZURE_OPENAI_MAX_TOKENS}") + print(f"Temperature: {config.AZURE_OPENAI_TEMPERATURE}") + + print("\n" + "=" * 70) + + if has_endpoint and has_api_key: + print("🤖 AI-powered NPC responses are ACTIVE") + print("🎯 Context-aware quest generation is ENABLED") + print("\nNPC conversations will now:") + print(" • Use character personalities for authentic responses") + print(" • Reference user's specific situation in replies") + print(" • Generate quests matched to conversation context") + print(" • Fall back to templates only if API fails") + return 0 + else: + print("⚠️ Azure OpenAI not configured") + print("\nTo enable AI:") + print(" 1. Create/update .env file with Azure credentials") + print(" 2. Restart the backend service") + return 1 + +if __name__ == '__main__': + sys.exit(main()) diff --git a/sut/frontend/.env.example b/sut/frontend/.env.example new file mode 100644 index 0000000..2b6408c --- /dev/null +++ b/sut/frontend/.env.example @@ -0,0 +1,16 @@ +# Frontend Environment Variables +# Copy this to .env.local and update values for your environment + +# API Configuration +REACT_APP_API_URL=http://localhost/api + +# Site URL Configuration (used for SEO and analytics) +# Set this to your deployment URL for correct sitemap.xml and meta tags +# Examples: +# - Development: http://localhost:5173 +# - Staging: https://lotr-staging.testingfantasy.com +# - Production: https://lotr-prod.testingfantasy.com +VITE_APP_SITE_URL=http://localhost:5173 + +# Google Analytics +REACT_APP_GA_ID=G-29N4KD7MQ9 diff --git a/sut/frontend/.env.local b/sut/frontend/.env.local new file mode 100644 index 0000000..75ecf7f --- /dev/null +++ b/sut/frontend/.env.local @@ -0,0 +1,6 @@ +# WebSocket configuration for dev server behind HTTPS proxy (Caddy) +# This ensures webpack dev server uses secure WebSockets when frontend is served over HTTPS +WDS_SOCKET_PROTOCOL=wss +WDS_SOCKET_PORT=80 +WDS_SOCKET_HOST=localhost +WDS_SOCKET_PATH=/ws diff --git a/sut/frontend/Dockerfile b/sut/frontend/Dockerfile new file mode 100644 index 0000000..606c33b --- /dev/null +++ b/sut/frontend/Dockerfile @@ -0,0 +1,24 @@ +FROM node:20-alpine + +WORKDIR /app + +# Copy package files +COPY package*.json ./ +COPY tsconfig.json ./ + +# Install dependencies +RUN npm install + +# Copy source files +COPY . . + +# Expose port +EXPOSE 3000 + +# Disable react-refresh for Docker environment +ENV SKIP_PREFLIGHT_CHECK=true +ENV DISABLE_ESLINT_PLUGIN=true +ENV FAST_REFRESH=false + +# Start development server +CMD ["npm", "start"] diff --git a/sut/frontend/ENV_URL_SETUP.md b/sut/frontend/ENV_URL_SETUP.md new file mode 100644 index 0000000..f47aefa --- /dev/null +++ b/sut/frontend/ENV_URL_SETUP.md @@ -0,0 +1,169 @@ +# Environment-Aware URL Configuration + +This document explains how analytics and SEO URLs adapt to different deployment environments. + +## Overview + +The Fellowship Quest List uses environment-aware URLs in critical files: +- **`index.html`**: Meta tags (canonical, og:url, og:image, twitter:image) +- **`sitemap.xml`**: All routes and API endpoints + +This ensures that regardless of whether you're deploying to: +- Development: `http://localhost:5173` +- Staging: `https://lotr-staging.testingfantasy.com` +- Production: `https://lotr-prod.testingfantasy.com` + +The URLs in these files are always correct. + +## Environment Variables + +### Primary Variable +`VITE_APP_SITE_URL` - The full site URL without trailing slash +- Example: `https://lotr-prod.testingfantasy.com` +- Example: `https://lotr-staging.testingfantasy.com` +- Example: `http://localhost:5173` + +## How It Works + +### For `index.html` +URLs are set dynamically at **runtime** using JavaScript: +1. Base URLs in HTML use placeholders: `%VITE_APP_SITE_URL%` +2. At page load, JavaScript reads `window.location.origin` +3. Dynamic updates to `` and `` tags ensure they reflect the actual deployment URL +4. This works for all deployment scenarios without rebuilding + +### For `sitemap.xml` +URLs are substituted **at build time**: +1. Source file uses placeholders: `%VITE_APP_SITE_URL%` +2. Build script replaces placeholders with actual environment URL +3. Final `sitemap.xml` has concrete URLs for search engines + +## Setup Instructions + +### Development + +```bash +cd sut/frontend + +# Run dev server (uses http://localhost:5173 automatically) +npm run dev +``` + +### Build for Deployment + +```bash +cd sut/frontend + +# Set the environment-specific URL +export VITE_APP_SITE_URL="https://lotr-prod.testingfantasy.com" + +# Build the application +npm run build + +# Run setup script to update XML files with correct URLs +node scripts/setup-env-urls.js +``` + +### Docker Deployment + +In your Dockerfile: + +```dockerfile +ARG SITE_URL=https://lotr-prod.testingfantasy.com + +# ... build steps ... + +# Setup environment-aware URLs +ENV VITE_APP_SITE_URL=${SITE_URL} +RUN cd sut/frontend && node scripts/setup-env-urls.js +``` + +### CI/CD Pipeline + +Example GitHub Actions: + +```yaml +- name: Setup environment-aware URLs + env: + VITE_APP_SITE_URL: ${{ secrets.SITE_URL }} + run: | + cd sut/frontend + node scripts/setup-env-urls.js +``` + +## File Examples + +### index.html (Runtime Dynamic) +```html + + + + + + +``` + +### sitemap.xml (Build-time Substitution) +```xml + +%VITE_APP_SITE_URL%/login + + +https://lotr-prod.testingfantasy.com/login +``` + +## Testing URLs + +### Verify index.html Dynamic URLs +```bash +# Open browser DevTools and check the Console when page loads +# Meta tags should update to match your current URL + +# Example: If accessed at https://mysite.com +# - og:url should be "https://mysite.com/" +# - canonical should be "https://mysite.com/" +``` + +### Verify sitemap.xml +```bash +# Download sitemap.xml and check the URLs +curl https://lotr-prod.testingfantasy.com/sitemap.xml | head -20 + +# All entries should use the correct domain +``` + +## Benefits + +✅ **Single codebase** - Deploy to any environment without code changes +✅ **Search engines** - Correct canonical URLs prevent duplicate content penalties +✅ **Social media** - Correct og: tags for rich previews on any domain +✅ **Analytics** - Proper tracking in GA regardless of deployment URL +✅ **No rebuilds** - index.html works without rebuild for different domains + +## Troubleshooting + +### URLs not updating in sitemap.xml +- Ensure `VITE_APP_SITE_URL` is set before building +- Run `node scripts/setup-env-urls.js` after build +- Check that `public/sitemap.xml` contains your domain, not `%VITE_APP_SITE_URL%` + +### Meta tags not updating in index.html +- Open browser DevTools (F12) +- Go to Elements/Inspector and check `` etc. +- Verify JavaScript ran: check Console for any errors +- URL should match `window.location.origin` + +### Staging environment has wrong URLs +- Verify `VITE_APP_SITE_URL` environment variable is set +- Run setup script before deploying +- Check that sitemap.xml contains staging URL, not production + +## References + +- [Google Canonical URLs](https://developers.google.com/search/docs/beginner/seo-starter-guide#declare-the-canonical-version-of-a-page) +- [Open Graph Protocol](https://ogp.me/) +- [Sitemap Protocol](https://www.sitemaps.org/protocol.html) diff --git a/sut/frontend/build/leaflet/leaflet.css b/sut/frontend/build/leaflet/leaflet.css new file mode 100644 index 0000000..6593ca5 --- /dev/null +++ b/sut/frontend/build/leaflet/leaflet.css @@ -0,0 +1,767 @@ +/* required styles */ + +.leaflet-pane, +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-tile-container, +.leaflet-pane > svg, +.leaflet-pane > canvas, +.leaflet-zoom-box, +.leaflet-image-layer, +.leaflet-layer { + position: absolute; + left: 0; + top: 0; +} + +.leaflet-container { + overflow: hidden; +} + +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + -webkit-user-drag: none; +} + +/* Prevents IE11 from highlighting tiles in blue */ +.leaflet-tile::selection { + background: transparent; +} + +/* Safari renders non-retina tile on retina better with this, but Chrome is worse */ +.leaflet-safari .leaflet-tile { + image-rendering: -webkit-optimize-contrast; +} + +/* hack that prevents hw layers "stretching" when loading new tiles */ +.leaflet-safari .leaflet-tile-container { + width: 1600px; + height: 1600px; + -webkit-transform-origin: 0 0; +} + +.leaflet-marker-icon, +.leaflet-marker-shadow { + display: block; +} + +/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */ +/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */ +.leaflet-container .leaflet-overlay-pane svg { + max-width: none !important; + max-height: none !important; +} + +.leaflet-container .leaflet-marker-pane img, +.leaflet-container .leaflet-shadow-pane img, +.leaflet-container .leaflet-tile-pane img, +.leaflet-container img.leaflet-image-layer, +.leaflet-container .leaflet-tile { + max-width: none !important; + max-height: none !important; + width: auto; + padding: 0; +} + +.leaflet-container.leaflet-touch-zoom { + -ms-touch-action: pan-x pan-y; + touch-action: pan-x pan-y; +} + +.leaflet-container.leaflet-touch-drag { + -ms-touch-action: pinch-zoom; + /* Fallback for FF which doesn't support pinch-zoom */ + touch-action: none; + touch-action: pinch-zoom; +} + +.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom { + -ms-touch-action: none; + touch-action: none; +} + +.leaflet-container { + -webkit-tap-highlight-color: transparent; +} + +.leaflet-container a { + -webkit-tap-highlight-color: rgba(51, 181, 229, 0.4); +} + +.leaflet-tile { + filter: inherit; + visibility: hidden; +} + +.leaflet-tile-loaded { + visibility: inherit; +} + +.leaflet-zoom-box { + width: 0; + height: 0; + -moz-box-sizing: border-box; + box-sizing: border-box; + z-index: 800; +} + +/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */ +.leaflet-overlay-pane svg { + -moz-user-select: none; +} + +.leaflet-pane { + z-index: 400; +} + +.leaflet-tile-pane { + z-index: 200; +} + +.leaflet-overlay-pane { + z-index: 400; +} + +.leaflet-shadow-pane { + z-index: 500; +} + +.leaflet-marker-pane { + z-index: 600; +} + +.leaflet-tooltip-pane { + z-index: 650; +} + +.leaflet-popup-pane { + z-index: 700; +} + +.leaflet-map-pane canvas { + z-index: 100; +} + +.leaflet-map-pane svg { + z-index: 200; +} + +.leaflet-vml-shape { + width: 1px; + height: 1px; +} + +.lvml { + behavior: url(#default#VML); + display: inline-block; + position: absolute; +} + + +/* control positioning */ + +.leaflet-control { + position: relative; + z-index: 800; + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; +} + +.leaflet-top, +.leaflet-bottom { + position: absolute; + z-index: 1000; + pointer-events: none; +} + +.leaflet-top { + top: 0; +} + +.leaflet-right { + right: 0; +} + +.leaflet-bottom { + bottom: 0; +} + +.leaflet-left { + left: 0; +} + +.leaflet-control { + float: left; + clear: both; +} + +.leaflet-right .leaflet-control { + float: right; +} + +.leaflet-top .leaflet-control { + margin-top: 10px; +} + +.leaflet-bottom .leaflet-control { + margin-bottom: 10px; +} + +.leaflet-left .leaflet-control { + margin-left: 10px; +} + +.leaflet-right .leaflet-control { + margin-right: 10px; +} + + +/* zoom and fade animations */ + +.leaflet-fade-anim .leaflet-popup { + opacity: 0; + -webkit-transition: opacity 0.2s linear; + -moz-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; +} + +.leaflet-fade-anim .leaflet-map-pane .leaflet-popup { + opacity: 1; +} + +.leaflet-zoom-animated { + -webkit-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; +} + +svg.leaflet-zoom-animated { + will-change: transform; +} + +.leaflet-zoom-anim .leaflet-zoom-animated { + -webkit-transition: -webkit-transform 0.25s cubic-bezier(0, 0, 0.25, 1); + -moz-transition: -moz-transform 0.25s cubic-bezier(0, 0, 0.25, 1); + transition: transform 0.25s cubic-bezier(0, 0, 0.25, 1); +} + +.leaflet-zoom-anim .leaflet-tile, +.leaflet-pan-anim .leaflet-tile { + -webkit-transition: none; + -moz-transition: none; + transition: none; +} + +.leaflet-zoom-anim .leaflet-zoom-hide { + visibility: hidden; +} + + +/* cursors */ + +.leaflet-interactive { + cursor: pointer; +} + +.leaflet-grab { + cursor: -webkit-grab; + cursor: -moz-grab; + cursor: grab; +} + +.leaflet-crosshair, +.leaflet-crosshair .leaflet-interactive { + cursor: crosshair; +} + +.leaflet-popup-pane, +.leaflet-control { + cursor: auto; +} + +.leaflet-dragging .leaflet-grab, +.leaflet-dragging .leaflet-grab .leaflet-interactive, +.leaflet-dragging .leaflet-marker-draggable { + cursor: move; + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + cursor: grabbing; +} + +/* marker & overlays interactivity */ +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-image-layer, +.leaflet-pane > svg path, +.leaflet-tile-container { + pointer-events: none; +} + +.leaflet-marker-icon.leaflet-interactive, +.leaflet-image-layer.leaflet-interactive, +.leaflet-pane > svg path.leaflet-interactive, +svg.leaflet-image-layer.leaflet-interactive path { + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; +} + +/* visual tweaks */ + +.leaflet-container { + background: #ddd; + outline-offset: 1px; +} + +.leaflet-container a { + color: #0078A8; +} + +.leaflet-zoom-box { + border: 2px dotted #38f; + background: rgba(255, 255, 255, 0.5); +} + + +/* general typography */ +.leaflet-container { + font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; + font-size: 12px; + font-size: 0.75rem; + line-height: 1.5; +} + + +/* general toolbar styles */ + +.leaflet-bar { + box-shadow: 0 1px 5px rgba(0, 0, 0, 0.65); + border-radius: 4px; +} + +.leaflet-bar a { + background-color: #fff; + border-bottom: 1px solid #ccc; + width: 26px; + height: 26px; + line-height: 26px; + display: block; + text-align: center; + text-decoration: none; + color: black; +} + +.leaflet-bar a, +.leaflet-control-layers-toggle { + background-position: 50% 50%; + background-repeat: no-repeat; + display: block; +} + +.leaflet-bar a:hover, +.leaflet-bar a:focus { + background-color: #f4f4f4; +} + +.leaflet-bar a:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +.leaflet-bar a:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom: none; +} + +.leaflet-bar a.leaflet-disabled { + cursor: default; + background-color: #f4f4f4; + color: #bbb; +} + +.leaflet-touch .leaflet-bar a { + width: 30px; + height: 30px; + line-height: 30px; +} + +.leaflet-touch .leaflet-bar a:first-child { + border-top-left-radius: 2px; + border-top-right-radius: 2px; +} + +.leaflet-touch .leaflet-bar a:last-child { + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; +} + +/* zoom control */ + +.leaflet-control-zoom-in, +.leaflet-control-zoom-out { + font: bold 18px 'Lucida Console', Monaco, monospace; + text-indent: 1px; +} + +.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out { + font-size: 22px; +} + + +/* layers control */ + +.leaflet-control-layers { + box-shadow: 0 1px 5px rgba(0, 0, 0, 0.4); + background: #fff; + border-radius: 5px; +} + +.leaflet-control-layers-toggle { + background-image: url(assets/images/layers.png); + width: 36px; + height: 36px; +} + +.leaflet-retina .leaflet-control-layers-toggle { + background-image: url(assets/images/layers-2x.png); + background-size: 26px 26px; +} + +.leaflet-touch .leaflet-control-layers-toggle { + width: 44px; + height: 44px; +} + +.leaflet-control-layers .leaflet-control-layers-list, +.leaflet-control-layers-expanded .leaflet-control-layers-toggle { + display: none; +} + +.leaflet-control-layers-expanded .leaflet-control-layers-list { + display: block; + position: relative; +} + +.leaflet-control-layers-expanded { + padding: 6px 10px 6px 6px; + color: #333; + background: #fff; +} + +.leaflet-control-layers-scrollbar { + overflow-y: scroll; + overflow-x: hidden; + padding-right: 5px; +} + +.leaflet-control-layers-selector { + margin-top: 2px; + position: relative; + top: 1px; +} + +.leaflet-control-layers label { + display: block; + font-size: 13px; + font-size: 1.08333em; +} + +.leaflet-control-layers-separator { + height: 0; + border-top: 1px solid #ddd; + margin: 5px -10px 5px -6px; +} + +/* Default icon URLs */ +.leaflet-default-icon-path { /* used only in path-guessing heuristic, see L.Icon.Default */ + background-image: url(assets/images/marker-icon.png); +} + + +/* attribution and scale controls */ + +.leaflet-container .leaflet-control-attribution { + background: #fff; + background: rgba(255, 255, 255, 0.8); + margin: 0; +} + +.leaflet-control-attribution, +.leaflet-control-scale-line { + padding: 0 5px; + color: #333; + line-height: 1.4; +} + +.leaflet-control-attribution a { + text-decoration: none; +} + +.leaflet-control-attribution a:hover, +.leaflet-control-attribution a:focus { + text-decoration: underline; +} + +.leaflet-attribution-flag { + display: inline !important; + vertical-align: baseline !important; + width: 1em; + height: 0.6669em; +} + +.leaflet-left .leaflet-control-scale { + margin-left: 5px; +} + +.leaflet-bottom .leaflet-control-scale { + margin-bottom: 5px; +} + +.leaflet-control-scale-line { + border: 2px solid #777; + border-top: none; + line-height: 1.1; + padding: 2px 5px 1px; + white-space: nowrap; + -moz-box-sizing: border-box; + box-sizing: border-box; + background: rgba(255, 255, 255, 0.8); + text-shadow: 1px 1px #fff; +} + +.leaflet-control-scale-line:not(:first-child) { + border-top: 2px solid #777; + border-bottom: none; + margin-top: -2px; +} + +.leaflet-control-scale-line:not(:first-child):not(:last-child) { + border-bottom: 2px solid #777; +} + +.leaflet-touch .leaflet-control-attribution, +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + box-shadow: none; +} + +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + border: 2px solid rgba(0, 0, 0, 0.2); + background-clip: padding-box; +} + + +/* popup */ + +.leaflet-popup { + position: absolute; + text-align: center; + margin-bottom: 20px; +} + +.leaflet-popup-content-wrapper { + padding: 1px; + text-align: left; + border-radius: 12px; +} + +.leaflet-popup-content { + margin: 13px 24px 13px 20px; + line-height: 1.3; + font-size: 13px; + font-size: 1.08333em; + min-height: 1px; +} + +.leaflet-popup-content p { + margin: 17px 0; + margin: 1.3em 0; +} + +.leaflet-popup-tip-container { + width: 40px; + height: 20px; + position: absolute; + left: 50%; + margin-top: -1px; + margin-left: -20px; + overflow: hidden; + pointer-events: none; +} + +.leaflet-popup-tip { + width: 17px; + height: 17px; + padding: 1px; + + margin: -10px auto 0; + pointer-events: auto; + + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); +} + +.leaflet-popup-content-wrapper, +.leaflet-popup-tip { + background: white; + color: #333; + box-shadow: 0 3px 14px rgba(0, 0, 0, 0.4); +} + +.leaflet-container a.leaflet-popup-close-button { + position: absolute; + top: 0; + right: 0; + border: none; + text-align: center; + width: 24px; + height: 24px; + font: 16px/24px Tahoma, Verdana, sans-serif; + color: #757575; + text-decoration: none; + background: transparent; +} + +.leaflet-container a.leaflet-popup-close-button:hover, +.leaflet-container a.leaflet-popup-close-button:focus { + color: #585858; +} + +.leaflet-popup-scrolled { + overflow: auto; +} + +.leaflet-oldie .leaflet-popup-content-wrapper { + -ms-zoom: 1; +} + +.leaflet-oldie .leaflet-popup-tip { + width: 24px; + margin: 0 auto; + + -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)"; + filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678); +} + +.leaflet-oldie .leaflet-control-zoom, +.leaflet-oldie .leaflet-control-layers, +.leaflet-oldie .leaflet-popup-content-wrapper, +.leaflet-oldie .leaflet-popup-tip { + border: 1px solid #999; +} + + +/* div icon */ + +.leaflet-div-icon { + background: #fff; + border: 1px solid #666; +} + + +/* Tooltip */ +/* Base styles for the element that has a tooltip */ +.leaflet-tooltip { + position: absolute; + padding: 6px; + background-color: #fff; + border: 1px solid #fff; + border-radius: 3px; + color: #222; + white-space: nowrap; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + pointer-events: none; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); +} + +.leaflet-tooltip.leaflet-interactive { + cursor: pointer; + pointer-events: auto; +} + +.leaflet-tooltip-top:before, +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + position: absolute; + pointer-events: none; + border: 6px solid transparent; + background: transparent; + content: ""; +} + +/* Directions */ + +.leaflet-tooltip-bottom { + margin-top: 6px; +} + +.leaflet-tooltip-top { + margin-top: -6px; +} + +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-top:before { + left: 50%; + margin-left: -6px; +} + +.leaflet-tooltip-top:before { + bottom: 0; + margin-bottom: -12px; + border-top-color: #fff; +} + +.leaflet-tooltip-bottom:before { + top: 0; + margin-top: -12px; + margin-left: -6px; + border-bottom-color: #fff; +} + +.leaflet-tooltip-left { + margin-left: -6px; +} + +.leaflet-tooltip-right { + margin-left: 6px; +} + +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + top: 50%; + margin-top: -6px; +} + +.leaflet-tooltip-left:before { + right: 0; + margin-right: -12px; + border-left-color: #fff; +} + +.leaflet-tooltip-right:before { + left: 0; + margin-left: -12px; + border-right-color: #fff; +} + +/* Printing */ + +@media print { + /* Prevent printers from removing background-images of controls. */ + .leaflet-control { + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + } +} diff --git a/sut/frontend/build/leaflet/leaflet.js b/sut/frontend/build/leaflet/leaflet.js new file mode 100644 index 0000000..047bfe7 --- /dev/null +++ b/sut/frontend/build/leaflet/leaflet.js @@ -0,0 +1,6 @@ +/* @preserve + * Leaflet 1.9.3, a JS library for interactive maps. https://leafletjs.com + * (c) 2010-2022 Vladimir Agafonkin, (c) 2010-2011 CloudMade + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).leaflet={})}(this,function(t){"use strict";function l(t){for(var e,i,n=1,o=arguments.length;n=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=_(t);var e=this.min,i=this.max,n=t.min,t=t.max,o=t.x>=e.x&&n.x<=i.x,t=t.y>=e.y&&n.y<=i.y;return o&&t},overlaps:function(t){t=_(t);var e=this.min,i=this.max,n=t.min,t=t.max,o=t.x>e.x&&n.xe.y&&n.y=n.lat&&i.lat<=o.lat&&e.lng>=n.lng&&i.lng<=o.lng},intersects:function(t){t=g(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),t=t.getNorthEast(),o=t.lat>=e.lat&&n.lat<=i.lat,t=t.lng>=e.lng&&n.lng<=i.lng;return o&&t},overlaps:function(t){t=g(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),t=t.getNorthEast(),o=t.lat>e.lat&&n.late.lng&&n.lng","http://www.w3.org/2000/svg"===(Ft.firstChild&&Ft.firstChild.namespaceURI));function y(t){return 0<=navigator.userAgent.toLowerCase().indexOf(t)}var b={ie:pt,ielt9:mt,edge:n,webkit:ft,android:gt,android23:vt,androidStock:yt,opera:xt,chrome:wt,gecko:bt,safari:Pt,phantom:Lt,opera12:o,win:Tt,ie3d:Mt,webkit3d:zt,gecko3d:_t,any3d:Ct,mobile:Zt,mobileWebkit:St,mobileWebkit3d:Et,msPointer:kt,pointer:Ot,touch:Bt,touchNative:At,mobileOpera:It,mobileGecko:Rt,retina:Nt,passiveEvents:Dt,canvas:jt,svg:Ht,vml:!Ht&&function(){try{var t=document.createElement("div"),e=(t.innerHTML='',t.firstChild);return e.style.behavior="url(#default#VML)",e&&"object"==typeof e.adj}catch(t){return!1}}(),inlineSvg:Ft,mac:0===navigator.platform.indexOf("Mac"),linux:0===navigator.platform.indexOf("Linux")},Wt=b.msPointer?"MSPointerDown":"pointerdown",Ut=b.msPointer?"MSPointerMove":"pointermove",Vt=b.msPointer?"MSPointerUp":"pointerup",qt=b.msPointer?"MSPointerCancel":"pointercancel",Gt={touchstart:Wt,touchmove:Ut,touchend:Vt,touchcancel:qt},Kt={touchstart:function(t,e){e.MSPOINTER_TYPE_TOUCH&&e.pointerType===e.MSPOINTER_TYPE_TOUCH&&O(e);ee(t,e)},touchmove:ee,touchend:ee,touchcancel:ee},Yt={},Xt=!1;function Jt(t,e,i){return"touchstart"!==e||Xt||(document.addEventListener(Wt,$t,!0),document.addEventListener(Ut,Qt,!0),document.addEventListener(Vt,te,!0),document.addEventListener(qt,te,!0),Xt=!0),Kt[e]?(i=Kt[e].bind(this,i),t.addEventListener(Gt[e],i,!1),i):(console.warn("wrong event specified:",e),u)}function $t(t){Yt[t.pointerId]=t}function Qt(t){Yt[t.pointerId]&&(Yt[t.pointerId]=t)}function te(t){delete Yt[t.pointerId]}function ee(t,e){if(e.pointerType!==(e.MSPOINTER_TYPE_MOUSE||"mouse")){for(var i in e.touches=[],Yt)e.touches.push(Yt[i]);e.changedTouches=[e],t(e)}}var ie=200;function ne(t,i){t.addEventListener("dblclick",i);var n,o=0;function e(t){var e;1!==t.detail?n=t.detail:"mouse"===t.pointerType||t.sourceCapabilities&&!t.sourceCapabilities.firesTouchEvents||((e=Ne(t)).some(function(t){return t instanceof HTMLLabelElement&&t.attributes.for})&&!e.some(function(t){return t instanceof HTMLInputElement||t instanceof HTMLSelectElement})||((e=Date.now())-o<=ie?2===++n&&i(function(t){var e,i,n={};for(i in t)e=t[i],n[i]=e&&e.bind?e.bind(t):e;return(t=n).type="dblclick",n.detail=2,n.isTrusted=!1,n._simulated=!0,n}(t)):n=1,o=e))}return t.addEventListener("click",e),{dblclick:i,simDblclick:e}}var oe,se,re,ae,he,le,ue=we(["transform","webkitTransform","OTransform","MozTransform","msTransform"]),ce=we(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),de="webkitTransition"===ce||"OTransition"===ce?ce+"End":"transitionend";function _e(t){return"string"==typeof t?document.getElementById(t):t}function pe(t,e){var i=t.style[e]||t.currentStyle&&t.currentStyle[e];return"auto"===(i=i&&"auto"!==i||!document.defaultView?i:(t=document.defaultView.getComputedStyle(t,null))?t[e]:null)?null:i}function P(t,e,i){t=document.createElement(t);return t.className=e||"",i&&i.appendChild(t),t}function T(t){var e=t.parentNode;e&&e.removeChild(t)}function me(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function fe(t){var e=t.parentNode;e&&e.lastChild!==t&&e.appendChild(t)}function ge(t){var e=t.parentNode;e&&e.firstChild!==t&&e.insertBefore(t,e.firstChild)}function ve(t,e){return void 0!==t.classList?t.classList.contains(e):0<(t=xe(t)).length&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(t)}function M(t,e){var i;if(void 0!==t.classList)for(var n=W(e),o=0,s=n.length;othis.options.maxZoom)?this.setZoom(t):this},panInsideBounds:function(t,e){this._enforcingBounds=!0;var i=this.getCenter(),t=this._limitCenter(i,this._zoom,g(t));return i.equals(t)||this.panTo(t,e),this._enforcingBounds=!1,this},panInside:function(t,e){var i=m((e=e||{}).paddingTopLeft||e.padding||[0,0]),n=m(e.paddingBottomRight||e.padding||[0,0]),o=this.project(this.getCenter()),t=this.project(t),s=this.getPixelBounds(),i=_([s.min.add(i),s.max.subtract(n)]),s=i.getSize();return i.contains(t)||(this._enforcingBounds=!0,n=t.subtract(i.getCenter()),i=i.extend(t).getSize().subtract(s),o.x+=n.x<0?-i.x:i.x,o.y+=n.y<0?-i.y:i.y,this.panTo(this.unproject(o),e),this._enforcingBounds=!1),this},invalidateSize:function(t){if(!this._loaded)return this;t=l({animate:!1,pan:!0},!0===t?{animate:!0}:t);var e=this.getSize(),i=(this._sizeChanged=!0,this._lastCenter=null,this.getSize()),n=e.divideBy(2).round(),o=i.divideBy(2).round(),n=n.subtract(o);return n.x||n.y?(t.animate&&t.pan?this.panBy(n):(t.pan&&this._rawPanBy(n),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(a(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:e,newSize:i})):this},stop:function(){return this.setZoom(this._limitZoom(this._zoom)),this.options.zoomSnap||this.fire("viewreset"),this._stop()},locate:function(t){var e,i;return t=this._locateOptions=l({timeout:1e4,watch:!1},t),"geolocation"in navigator?(e=a(this._handleGeolocationResponse,this),i=a(this._handleGeolocationError,this),t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t)):this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e;this._container._leaflet_id&&(e=t.code,t=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout"),this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+t+"."}))},_handleGeolocationResponse:function(t){if(this._container._leaflet_id){var e,i,n=new v(t.coords.latitude,t.coords.longitude),o=n.toBounds(2*t.coords.accuracy),s=this._locateOptions,r=(s.setView&&(e=this.getBoundsZoom(o),this.setView(n,s.maxZoom?Math.min(e,s.maxZoom):e)),{latlng:n,bounds:o,timestamp:t.timestamp});for(i in t.coords)"number"==typeof t.coords[i]&&(r[i]=t.coords[i]);this.fire("locationfound",r)}},addHandler:function(t,e){return e&&(e=this[t]=new e(this),this._handlers.push(e),this.options[t]&&e.enable()),this},remove:function(){if(this._initEvents(!0),this.options.maxBounds&&this.off("moveend",this._panInsideMaxBounds),this._containerId!==this._container._leaflet_id)throw new Error("Map container is being reused by another instance");try{delete this._container._leaflet_id,delete this._containerId}catch(t){this._container._leaflet_id=void 0,this._containerId=void 0}for(var t in void 0!==this._locationWatchId&&this.stopLocate(),this._stop(),T(this._mapPane),this._clearControlPos&&this._clearControlPos(),this._resizeRequest&&(r(this._resizeRequest),this._resizeRequest=null),this._clearHandlers(),this._loaded&&this.fire("unload"),this._layers)this._layers[t].remove();for(t in this._panes)T(this._panes[t]);return this._layers=[],this._panes=[],delete this._mapPane,delete this._renderer,this},createPane:function(t,e){e=P("div","leaflet-pane"+(t?" leaflet-"+t.replace("Pane","")+"-pane":""),e||this._mapPane);return t&&(this._panes[t]=e),e},getCenter:function(){return this._checkIfLoaded(),this._lastCenter&&!this._moved()?this._lastCenter.clone():this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds();return new s(this.unproject(t.getBottomLeft()),this.unproject(t.getTopRight()))},getMinZoom:function(){return void 0===this.options.minZoom?this._layersMinZoom||0:this.options.minZoom},getMaxZoom:function(){return void 0===this.options.maxZoom?void 0===this._layersMaxZoom?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,e,i){t=g(t),i=m(i||[0,0]);var n=this.getZoom()||0,o=this.getMinZoom(),s=this.getMaxZoom(),r=t.getNorthWest(),t=t.getSouthEast(),i=this.getSize().subtract(i),t=_(this.project(t,n),this.project(r,n)).getSize(),r=b.any3d?this.options.zoomSnap:1,a=i.x/t.x,i=i.y/t.y,t=e?Math.max(a,i):Math.min(a,i),n=this.getScaleZoom(t,n);return r&&(n=Math.round(n/(r/100))*(r/100),n=e?Math.ceil(n/r)*r:Math.floor(n/r)*r),Math.max(o,Math.min(s,n))},getSize:function(){return this._size&&!this._sizeChanged||(this._size=new p(this._container.clientWidth||0,this._container.clientHeight||0),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(t,e){t=this._getTopLeftPoint(t,e);return new f(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._pixelOrigin},getPixelWorldBounds:function(t){return this.options.crs.getProjectedBounds(void 0===t?this.getZoom():t)},getPane:function(t){return"string"==typeof t?this._panes[t]:t},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t,e){var i=this.options.crs;return e=void 0===e?this._zoom:e,i.scale(t)/i.scale(e)},getScaleZoom:function(t,e){var i=this.options.crs,t=(e=void 0===e?this._zoom:e,i.zoom(t*i.scale(e)));return isNaN(t)?1/0:t},project:function(t,e){return e=void 0===e?this._zoom:e,this.options.crs.latLngToPoint(w(t),e)},unproject:function(t,e){return e=void 0===e?this._zoom:e,this.options.crs.pointToLatLng(m(t),e)},layerPointToLatLng:function(t){t=m(t).add(this.getPixelOrigin());return this.unproject(t)},latLngToLayerPoint:function(t){return this.project(w(t))._round()._subtract(this.getPixelOrigin())},wrapLatLng:function(t){return this.options.crs.wrapLatLng(w(t))},wrapLatLngBounds:function(t){return this.options.crs.wrapLatLngBounds(g(t))},distance:function(t,e){return this.options.crs.distance(w(t),w(e))},containerPointToLayerPoint:function(t){return m(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return m(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){t=this.containerPointToLayerPoint(m(t));return this.layerPointToLatLng(t)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(w(t)))},mouseEventToContainerPoint:function(t){return De(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){t=this._container=_e(t);if(!t)throw new Error("Map container not found.");if(t._leaflet_id)throw new Error("Map container is already initialized.");S(t,"scroll",this._onScroll,this),this._containerId=h(t)},_initLayout:function(){var t=this._container,e=(this._fadeAnimated=this.options.fadeAnimation&&b.any3d,M(t,"leaflet-container"+(b.touch?" leaflet-touch":"")+(b.retina?" leaflet-retina":"")+(b.ielt9?" leaflet-oldie":"")+(b.safari?" leaflet-safari":"")+(this._fadeAnimated?" leaflet-fade-anim":"")),pe(t,"position"));"absolute"!==e&&"relative"!==e&&"fixed"!==e&&"sticky"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._paneRenderers={},this._mapPane=this.createPane("mapPane",this._container),Z(this._mapPane,new p(0,0)),this.createPane("tilePane"),this.createPane("overlayPane"),this.createPane("shadowPane"),this.createPane("markerPane"),this.createPane("tooltipPane"),this.createPane("popupPane"),this.options.markerZoomAnimation||(M(t.markerPane,"leaflet-zoom-hide"),M(t.shadowPane,"leaflet-zoom-hide"))},_resetView:function(t,e,i){Z(this._mapPane,new p(0,0));var n=!this._loaded,o=(this._loaded=!0,e=this._limitZoom(e),this.fire("viewprereset"),this._zoom!==e);this._moveStart(o,i)._move(t,e)._moveEnd(o),this.fire("viewreset"),n&&this.fire("load")},_moveStart:function(t,e){return t&&this.fire("zoomstart"),e||this.fire("movestart"),this},_move:function(t,e,i,n){void 0===e&&(e=this._zoom);var o=this._zoom!==e;return this._zoom=e,this._lastCenter=t,this._pixelOrigin=this._getNewPixelOrigin(t),n?i&&i.pinch&&this.fire("zoom",i):((o||i&&i.pinch)&&this.fire("zoom",i),this.fire("move",i)),this},_moveEnd:function(t){return t&&this.fire("zoomend"),this.fire("moveend")},_stop:function(){return r(this._flyToFrame),this._panAnim&&this._panAnim.stop(),this},_rawPanBy:function(t){Z(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){this._enforcingBounds||this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(t){this._targets={};var e=t?k:S;e((this._targets[h(this._container)]=this)._container,"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress keydown keyup",this._handleDOMEvent,this),this.options.trackResize&&e(window,"resize",this._onResize,this),b.any3d&&this.options.transform3DLimit&&(t?this.off:this.on).call(this,"moveend",this._onMoveEnd)},_onResize:function(){r(this._resizeRequest),this._resizeRequest=x(function(){this.invalidateSize({debounceMoveend:!0})},this)},_onScroll:function(){this._container.scrollTop=0,this._container.scrollLeft=0},_onMoveEnd:function(){var t=this._getMapPanePos();Math.max(Math.abs(t.x),Math.abs(t.y))>=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,e){for(var i,n=[],o="mouseout"===e||"mouseover"===e,s=t.target||t.srcElement,r=!1;s;){if((i=this._targets[h(s)])&&("click"===e||"preclick"===e)&&this._draggableMoved(i)){r=!0;break}if(i&&i.listens(e,!0)){if(o&&!Fe(s,t))break;if(n.push(i),o)break}if(s===this._container)break;s=s.parentNode}return n=n.length||r||o||!this.listens(e,!0)?n:[this]},_isClickDisabled:function(t){for(;t&&t!==this._container;){if(t._leaflet_disable_click)return!0;t=t.parentNode}},_handleDOMEvent:function(t){var e,i=t.target||t.srcElement;!this._loaded||i._leaflet_disable_events||"click"===t.type&&this._isClickDisabled(i)||("mousedown"===(e=t.type)&&Me(i),this._fireDOMEvent(t,e))},_mouseEvents:["click","dblclick","mouseover","mouseout","contextmenu"],_fireDOMEvent:function(t,e,i){"click"===t.type&&((a=l({},t)).type="preclick",this._fireDOMEvent(a,a.type,i));var n=this._findEventTargets(t,e);if(i){for(var o=[],s=0;sthis.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),n=this._getCenterOffset(t)._divideBy(1-1/n);if(!0!==i.animate&&!this.getSize().contains(n))return!1;x(function(){this._moveStart(!0,!1)._animateZoom(t,e,!0)},this)}return!0},_animateZoom:function(t,e,i,n){this._mapPane&&(i&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=e,M(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:t,zoom:e,noUpdate:n}),this._tempFireZoomEvent||(this._tempFireZoomEvent=this._zoom!==this._animateToZoom),this._move(this._animateToCenter,this._animateToZoom,void 0,!0),setTimeout(a(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&z(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom,void 0,!0),this._tempFireZoomEvent&&this.fire("zoom"),delete this._tempFireZoomEvent,this.fire("move"),this._moveEnd(!0))}});function Ue(t){return new B(t)}var Ve,B=et.extend({options:{position:"topright"},initialize:function(t){c(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this.remove(),this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),t=t._controlCorners[i];return M(e,"leaflet-control"),-1!==i.indexOf("bottom")?t.insertBefore(e,t.firstChild):t.appendChild(e),this._map.on("unload",this.remove,this),this},remove:function(){return this._map&&(T(this._container),this.onRemove&&this.onRemove(this._map),this._map.off("unload",this.remove,this),this._map=null),this},_refocusOnMap:function(t){this._map&&t&&0",e=document.createElement("div");return e.innerHTML=t,e.firstChild},_addItem:function(t){var e,i=document.createElement("label"),n=this._map.hasLayer(t.layer),n=(t.overlay?((e=document.createElement("input")).type="checkbox",e.className="leaflet-control-layers-selector",e.defaultChecked=n):e=this._createRadioElement("leaflet-base-layers_"+h(this),n),this._layerControlInputs.push(e),e.layerId=h(t.layer),S(e,"click",this._onInputClick,this),document.createElement("span")),o=(n.innerHTML=" "+t.name,document.createElement("span"));return i.appendChild(o),o.appendChild(e),o.appendChild(n),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(i),this._checkDisabledLayers(),i},_onInputClick:function(){var t,e,i=this._layerControlInputs,n=[],o=[];this._handlingClick=!0;for(var s=i.length-1;0<=s;s--)t=i[s],e=this._getLayer(t.layerId).layer,t.checked?n.push(e):t.checked||o.push(e);for(s=0;se.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expandSafely:function(){var t=this._section;S(t,"click",O),this.expand(),setTimeout(function(){k(t,"click",O)})}})),Ge=B.extend({options:{position:"topleft",zoomInText:'',zoomInTitle:"Zoom in",zoomOutText:'',zoomOutTitle:"Zoom out"},onAdd:function(t){var e="leaflet-control-zoom",i=P("div",e+" leaflet-bar"),n=this.options;return this._zoomInButton=this._createButton(n.zoomInText,n.zoomInTitle,e+"-in",i,this._zoomIn),this._zoomOutButton=this._createButton(n.zoomOutText,n.zoomOutTitle,e+"-out",i,this._zoomOut),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(t){!this._disabled&&this._map._zoomthis._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(t.shiftKey?3:1))},_createButton:function(t,e,i,n,o){i=P("a",i,n);return i.innerHTML=t,i.href="#",i.title=e,i.setAttribute("role","button"),i.setAttribute("aria-label",e),Ie(i),S(i,"click",Re),S(i,"click",o,this),S(i,"click",this._refocusOnMap,this),i},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";z(this._zoomInButton,e),z(this._zoomOutButton,e),this._zoomInButton.setAttribute("aria-disabled","false"),this._zoomOutButton.setAttribute("aria-disabled","false"),!this._disabled&&t._zoom!==t.getMinZoom()||(M(this._zoomOutButton,e),this._zoomOutButton.setAttribute("aria-disabled","true")),!this._disabled&&t._zoom!==t.getMaxZoom()||(M(this._zoomInButton,e),this._zoomInButton.setAttribute("aria-disabled","true"))}}),Ke=(A.mergeOptions({zoomControl:!0}),A.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new Ge,this.addControl(this.zoomControl))}),B.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var e="leaflet-control-scale",i=P("div",e),n=this.options;return this._addScales(n,e+"-line",i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=P("div",e,i)),t.imperial&&(this._iScale=P("div",e,i))},_update:function(){var t=this._map,e=t.getSize().y/2,t=t.distance(t.containerPointToLatLng([0,e]),t.containerPointToLatLng([this.options.maxWidth,e]));this._updateScales(t)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var e=this._getRoundNum(t);this._updateScale(this._mScale,e<1e3?e+" m":e/1e3+" km",e/t)},_updateImperial:function(t){var e,i,t=3.2808399*t;5280'+(b.inlineSvg?' ':"")+"Leaflet"},initialize:function(t){c(this,t),this._attributions={}},onAdd:function(t){for(var e in(t.attributionControl=this)._container=P("div","leaflet-control-attribution"),Ie(this._container),t._layers)t._layers[e].getAttribution&&this.addAttribution(t._layers[e].getAttribution());return this._update(),t.on("layeradd",this._addAttribution,this),this._container},onRemove:function(t){t.off("layeradd",this._addAttribution,this)},_addAttribution:function(t){t.layer.getAttribution&&(this.addAttribution(t.layer.getAttribution()),t.layer.once("remove",function(){this.removeAttribution(t.layer.getAttribution())},this))},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t&&(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update()),this},removeAttribution:function(t){return t&&this._attributions[t]&&(this._attributions[t]--,this._update()),this},_update:function(){if(this._map){var t,e=[];for(t in this._attributions)this._attributions[t]&&e.push(t);var i=[];this.options.prefix&&i.push(this.options.prefix),e.length&&i.push(e.join(", ")),this._container.innerHTML=i.join(' ')}}}),n=(A.mergeOptions({attributionControl:!0}),A.addInitHook(function(){this.options.attributionControl&&(new Ye).addTo(this)}),B.Layers=qe,B.Zoom=Ge,B.Scale=Ke,B.Attribution=Ye,Ue.layers=function(t,e,i){return new qe(t,e,i)},Ue.zoom=function(t){return new Ge(t)},Ue.scale=function(t){return new Ke(t)},Ue.attribution=function(t){return new Ye(t)},et.extend({initialize:function(t){this._map=t},enable:function(){return this._enabled||(this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled&&(this._enabled=!1,this.removeHooks()),this},enabled:function(){return!!this._enabled}})),ft=(n.addTo=function(t,e){return t.addHandler(e,this),this},{Events:e}),Xe=b.touch?"touchstart mousedown":"mousedown",Je=it.extend({options:{clickTolerance:3},initialize:function(t,e,i,n){c(this,n),this._element=t,this._dragStartTarget=e||t,this._preventOutline=i},enable:function(){this._enabled||(S(this._dragStartTarget,Xe,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(Je._dragging===this&&this.finishDrag(!0),k(this._dragStartTarget,Xe,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(t){var e,i;this._enabled&&(this._moved=!1,ve(this._element,"leaflet-zoom-anim")||(t.touches&&1!==t.touches.length?Je._dragging===this&&this.finishDrag():Je._dragging||t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||((Je._dragging=this)._preventOutline&&Me(this._element),Le(),re(),this._moving||(this.fire("down"),i=t.touches?t.touches[0]:t,e=Ce(this._element),this._startPoint=new p(i.clientX,i.clientY),this._startPos=Pe(this._element),this._parentScale=Ze(e),i="mousedown"===t.type,S(document,i?"mousemove":"touchmove",this._onMove,this),S(document,i?"mouseup":"touchend touchcancel",this._onUp,this)))))},_onMove:function(t){var e;this._enabled&&(t.touches&&1e&&(i.push(t[n]),o=n);oe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i}function ni(t,e,i,n){var o=e.x,e=e.y,s=i.x-o,r=i.y-e,a=s*s+r*r;return 0this._layersMaxZoom&&this.setZoom(this._layersMaxZoom),void 0===this.options.minZoom&&this._layersMinZoom&&this.getZoom()t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(l=!l);return l||vi.prototype._containsPoint.call(this,t,!0)}});var xi=ui.extend({initialize:function(t,e){c(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,o=d(t)?t:t.features;if(o){for(e=0,i=o.length;es.x&&(r=i.x+a-s.x+o.x),i.x-r-n.x<(a=0)&&(r=i.x-n.x),i.y+e+o.y>s.y&&(a=i.y+e-s.y+o.y),i.y-a-n.y<0&&(a=i.y-n.y),(r||a)&&(this.options.keepInView&&(this._autopanning=!0),t.fire("autopanstart").panBy([r,a]))))},_getAnchor:function(){return m(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}})),Bi=(A.mergeOptions({closePopupOnClick:!0}),A.include({openPopup:function(t,e,i){return this._initOverlay(Ai,t,e,i).openOn(this),this},closePopup:function(t){return(t=arguments.length?t:this._popup)&&t.close(),this}}),o.include({bindPopup:function(t,e){return this._popup=this._initOverlay(Ai,this._popup,t,e),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(t){return this._popup&&(this instanceof ui||(this._popup._source=this),this._popup._prepareOpen(t||this._latlng)&&this._popup.openOn(this._map)),this},closePopup:function(){return this._popup&&this._popup.close(),this},togglePopup:function(){return this._popup&&this._popup.toggle(this),this},isPopupOpen:function(){return!!this._popup&&this._popup.isOpen()},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},getPopup:function(){return this._popup},_openPopup:function(t){var e;this._popup&&this._map&&(Re(t),e=t.layer||t.target,this._popup._source!==e||e instanceof mi?(this._popup._source=e,this.openPopup(t.latlng)):this._map.hasLayer(this._popup)?this.closePopup():this.openPopup(t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)},_onKeyPress:function(t){13===t.originalEvent.keyCode&&this._openPopup(t)}}),Oi.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,opacity:.9},onAdd:function(t){Oi.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire("tooltipopen",{tooltip:this}),this._source&&(this.addEventParent(this._source),this._source.fire("tooltipopen",{tooltip:this},!0))},onRemove:function(t){Oi.prototype.onRemove.call(this,t),t.fire("tooltipclose",{tooltip:this}),this._source&&(this.removeEventParent(this._source),this._source.fire("tooltipclose",{tooltip:this},!0))},getEvents:function(){var t=Oi.prototype.getEvents.call(this);return this.options.permanent||(t.preclick=this.close),t},_initLayout:function(){var t="leaflet-tooltip "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=P("div",t),this._container.setAttribute("role","tooltip"),this._container.setAttribute("id","leaflet-tooltip-"+h(this))},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var e,i=this._map,n=this._container,o=i.latLngToContainerPoint(i.getCenter()),i=i.layerPointToContainerPoint(t),s=this.options.direction,r=n.offsetWidth,a=n.offsetHeight,h=m(this.options.offset),l=this._getAnchor(),i="top"===s?(e=r/2,a):"bottom"===s?(e=r/2,0):(e="center"===s?r/2:"right"===s?0:"left"===s?r:i.xthis.options.maxZoom||nthis.options.maxZoom||void 0!==this.options.minZoom&&oi.max.x)||!e.wrapLat&&(t.yi.max.y))return!1}return!this.options.bounds||(e=this._tileCoordsToBounds(t),g(this.options.bounds).overlaps(e))},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToNwSe:function(t){var e=this._map,i=this.getTileSize(),n=t.scaleBy(i),i=n.add(i);return[e.unproject(n,t.z),e.unproject(i,t.z)]},_tileCoordsToBounds:function(t){t=this._tileCoordsToNwSe(t),t=new s(t[0],t[1]);return t=this.options.noWrap?t:this._map.wrapLatLngBounds(t)},_tileCoordsToKey:function(t){return t.x+":"+t.y+":"+t.z},_keyToTileCoords:function(t){var t=t.split(":"),e=new p(+t[0],+t[1]);return e.z=+t[2],e},_removeTile:function(t){var e=this._tiles[t];e&&(T(e.el),delete this._tiles[t],this.fire("tileunload",{tile:e.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){M(t,"leaflet-tile");var e=this.getTileSize();t.style.width=e.x+"px",t.style.height=e.y+"px",t.onselectstart=u,t.onmousemove=u,b.ielt9&&this.options.opacity<1&&C(t,this.options.opacity)},_addTile:function(t,e){var i=this._getTilePos(t),n=this._tileCoordsToKey(t),o=this.createTile(this._wrapCoords(t),a(this._tileReady,this,t));this._initTile(o),this.createTile.length<2&&x(a(this._tileReady,this,t,null,o)),Z(o,i),this._tiles[n]={el:o,coords:t,current:!0},e.appendChild(o),this.fire("tileloadstart",{tile:o,coords:t})},_tileReady:function(t,e,i){e&&this.fire("tileerror",{error:e,tile:i,coords:t});var n=this._tileCoordsToKey(t);(i=this._tiles[n])&&(i.loaded=+new Date,this._map._fadeAnimated?(C(i.el,0),r(this._fadeFrame),this._fadeFrame=x(this._updateOpacity,this)):(i.active=!0,this._pruneTiles()),e||(M(i.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:i.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),b.ielt9||!this._map._fadeAnimated?x(this._pruneTiles,this):setTimeout(a(this._pruneTiles,this),250)))},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var e=new p(this._wrapX?H(t.x,this._wrapX):t.x,this._wrapY?H(t.y,this._wrapY):t.y);return e.z=t.z,e},_pxBoundsToTileRange:function(t){var e=this.getTileSize();return new f(t.min.unscaleBy(e).floor(),t.max.unscaleBy(e).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}});var Ni=Ri.extend({options:{minZoom:0,maxZoom:18,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1,referrerPolicy:!1},initialize:function(t,e){this._url=t,(e=c(this,e)).detectRetina&&b.retina&&0')}}catch(t){}return function(t){return document.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}(),zt={_initContainer:function(){this._container=P("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(Hi.prototype._update.call(this),this.fire("update"))},_initPath:function(t){var e=t._container=Ui("shape");M(e,"leaflet-vml-shape "+(this.options.className||"")),e.coordsize="1 1",t._path=Ui("path"),e.appendChild(t._path),this._updateStyle(t),this._layers[h(t)]=t},_addPath:function(t){var e=t._container;this._container.appendChild(e),t.options.interactive&&t.addInteractiveTarget(e)},_removePath:function(t){var e=t._container;T(e),t.removeInteractiveTarget(e),delete this._layers[h(t)]},_updateStyle:function(t){var e=t._stroke,i=t._fill,n=t.options,o=t._container;o.stroked=!!n.stroke,o.filled=!!n.fill,n.stroke?(e=e||(t._stroke=Ui("stroke")),o.appendChild(e),e.weight=n.weight+"px",e.color=n.color,e.opacity=n.opacity,n.dashArray?e.dashStyle=d(n.dashArray)?n.dashArray.join(" "):n.dashArray.replace(/( *, *)/g," "):e.dashStyle="",e.endcap=n.lineCap.replace("butt","flat"),e.joinstyle=n.lineJoin):e&&(o.removeChild(e),t._stroke=null),n.fill?(i=i||(t._fill=Ui("fill")),o.appendChild(i),i.color=n.fillColor||n.color,i.opacity=n.fillOpacity):i&&(o.removeChild(i),t._fill=null)},_updateCircle:function(t){var e=t._point.round(),i=Math.round(t._radius),n=Math.round(t._radiusY||i);this._setPath(t,t._empty()?"M0 0":"AL "+e.x+","+e.y+" "+i+","+n+" 0,23592600")},_setPath:function(t,e){t._path.v=e},_bringToFront:function(t){fe(t._container)},_bringToBack:function(t){ge(t._container)}},Vi=b.vml?Ui:ct,qi=Hi.extend({_initContainer:function(){this._container=Vi("svg"),this._container.setAttribute("pointer-events","none"),this._rootGroup=Vi("g"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){T(this._container),k(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_update:function(){var t,e,i;this._map._animatingZoom&&this._bounds||(Hi.prototype._update.call(this),e=(t=this._bounds).getSize(),i=this._container,this._svgSize&&this._svgSize.equals(e)||(this._svgSize=e,i.setAttribute("width",e.x),i.setAttribute("height",e.y)),Z(i,t.min),i.setAttribute("viewBox",[t.min.x,t.min.y,e.x,e.y].join(" ")),this.fire("update"))},_initPath:function(t){var e=t._path=Vi("path");t.options.className&&M(e,t.options.className),t.options.interactive&&M(e,"leaflet-interactive"),this._updateStyle(t),this._layers[h(t)]=t},_addPath:function(t){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(t._path),t.addInteractiveTarget(t._path)},_removePath:function(t){T(t._path),t.removeInteractiveTarget(t._path),delete this._layers[h(t)]},_updatePath:function(t){t._project(),t._update()},_updateStyle:function(t){var e=t._path,t=t.options;e&&(t.stroke?(e.setAttribute("stroke",t.color),e.setAttribute("stroke-opacity",t.opacity),e.setAttribute("stroke-width",t.weight),e.setAttribute("stroke-linecap",t.lineCap),e.setAttribute("stroke-linejoin",t.lineJoin),t.dashArray?e.setAttribute("stroke-dasharray",t.dashArray):e.removeAttribute("stroke-dasharray"),t.dashOffset?e.setAttribute("stroke-dashoffset",t.dashOffset):e.removeAttribute("stroke-dashoffset")):e.setAttribute("stroke","none"),t.fill?(e.setAttribute("fill",t.fillColor||t.color),e.setAttribute("fill-opacity",t.fillOpacity),e.setAttribute("fill-rule",t.fillRule||"evenodd")):e.setAttribute("fill","none"))},_updatePoly:function(t,e){this._setPath(t,dt(t._parts,e))},_updateCircle:function(t){var e=t._point,i=Math.max(Math.round(t._radius),1),n="a"+i+","+(Math.max(Math.round(t._radiusY),1)||i)+" 0 1,0 ",e=t._empty()?"M0 0":"M"+(e.x-i)+","+e.y+n+2*i+",0 "+n+2*-i+",0 ";this._setPath(t,e)},_setPath:function(t,e){t._path.setAttribute("d",e)},_bringToFront:function(t){fe(t._path)},_bringToBack:function(t){ge(t._path)}});function Gi(t){return b.svg||b.vml?new qi(t):null}b.vml&&qi.include(zt),A.include({getRenderer:function(t){t=(t=t.options.renderer||this._getPaneRenderer(t.options.pane)||this.options.renderer||this._renderer)||(this._renderer=this._createRenderer());return this.hasLayer(t)||this.addLayer(t),t},_getPaneRenderer:function(t){var e;return"overlayPane"!==t&&void 0!==t&&(void 0===(e=this._paneRenderers[t])&&(e=this._createRenderer({pane:t}),this._paneRenderers[t]=e),e)},_createRenderer:function(t){return this.options.preferCanvas&&Wi(t)||Gi(t)}});var Ki=yi.extend({initialize:function(t,e){yi.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){return this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return[(t=g(t)).getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}});qi.create=Vi,qi.pointsToPath=dt,xi.geometryToLayer=wi,xi.coordsToLatLng=Pi,xi.coordsToLatLngs=Li,xi.latLngToCoords=Ti,xi.latLngsToCoords=Mi,xi.getFeature=zi,xi.asFeature=Ci,A.mergeOptions({boxZoom:!0});var _t=n.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){S(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){k(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){T(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),re(),Le(),this._startPoint=this._map.mouseEventToContainerPoint(t),S(document,{contextmenu:Re,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=P("div","leaflet-zoom-box",this._container),M(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t);var t=new f(this._point,this._startPoint),e=t.getSize();Z(this._box,t.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(T(this._box),z(this._container,"leaflet-crosshair")),ae(),Te(),k(document,{contextmenu:Re,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){1!==t.which&&1!==t.button||(this._finish(),this._moved&&(this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(a(this._resetState,this),0),t=new s(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point)),this._map.fitBounds(t).fire("boxzoomend",{boxZoomBounds:t})))},_onKeyDown:function(t){27===t.keyCode&&(this._finish(),this._clearDeferredResetState(),this._resetState())}}),Ct=(A.addInitHook("addHandler","boxZoom",_t),A.mergeOptions({doubleClickZoom:!0}),n.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var e=this._map,i=e.getZoom(),n=e.options.zoomDelta,i=t.originalEvent.shiftKey?i-n:i+n;"center"===e.options.doubleClickZoom?e.setZoom(i):e.setZoomAround(t.containerPoint,i)}})),Zt=(A.addInitHook("addHandler","doubleClickZoom",Ct),A.mergeOptions({dragging:!0,inertia:!0,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0}),n.extend({addHooks:function(){var t;this._draggable||(t=this._map,this._draggable=new Je(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on("predrag",this._onPreDragLimit,this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDragWrap,this),t.on("zoomend",this._onZoomEnd,this),t.whenReady(this._onZoomEnd,this))),M(this._map._container,"leaflet-grab leaflet-touch-drag"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){z(this._map._container,"leaflet-grab"),z(this._map._container,"leaflet-touch-drag"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var t,e=this._map;e._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity?(t=g(this._map.options.maxBounds),this._offsetLimit=_(this._map.latLngToContainerPoint(t.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(t.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))):this._offsetLimit=null,e.fire("movestart").fire("dragstart"),e.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(t){var e,i;this._map.options.inertia&&(e=this._lastTime=+new Date,i=this._lastPos=this._draggable._absPos||this._draggable._newPos,this._positions.push(i),this._times.push(e),this._prunePositions(e)),this._map.fire("move",t).fire("drag",t)},_prunePositions:function(t){for(;1e.max.x&&(t.x=this._viscousLimit(t.x,e.max.x)),t.y>e.max.y&&(t.y=this._viscousLimit(t.y,e.max.y)),this._draggable._newPos=this._draggable._startPos.add(t))},_onPreDragWrap:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,n=(n+e+i)%t-e-i,t=Math.abs(o+i)e.getMaxZoom()&&1=i;)t=t.__parent;return this._currentShownBounds.contains(t.getLatLng())&&(this.options.animateAddingMarkers?this._animationAddLayer(e,t):this._animationAddLayerNonAnimated(e,t)),this},removeLayer:function(e){return e instanceof L.LayerGroup?this.removeLayers([e]):e.getLatLng?this._map?e.__parent?(this._unspiderfy&&(this._unspiderfy(),this._unspiderfyLayer(e)),this._removeLayer(e,!0),this.fire("layerremove",{layer:e}),this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons(),e.off(this._childMarkerEventHandlers,this),this._featureGroup.hasLayer(e)&&(this._featureGroup.removeLayer(e),e.clusterShow&&e.clusterShow()),this):this:(!this._arraySplice(this._needsClustering,e)&&this.hasLayer(e)&&this._needsRemoving.push({layer:e,latlng:e._latlng}),this.fire("layerremove",{layer:e}),this):(this._nonPointGroup.removeLayer(e),this.fire("layerremove",{layer:e}),this)},addLayers:function(e,t){if(!L.Util.isArray(e))return this.addLayer(e);var i,n=this._featureGroup,r=this._nonPointGroup,s=this.options.chunkedLoading,o=this.options.chunkInterval,a=this.options.chunkProgress,h=e.length,l=0,u=!0;if(this._map){var _=(new Date).getTime(),d=L.bind(function(){for(var c=(new Date).getTime();h>l;l++){if(s&&0===l%200){var p=(new Date).getTime()-c;if(p>o)break}if(i=e[l],i instanceof L.LayerGroup)u&&(e=e.slice(),u=!1),this._extractNonGroupLayers(i,e),h=e.length;else if(i.getLatLng){if(!this.hasLayer(i)&&(this._addLayer(i,this._maxZoom),t||this.fire("layeradd",{layer:i}),i.__parent&&2===i.__parent.getChildCount())){var f=i.__parent.getAllChildMarkers(),m=f[0]===i?f[1]:f[0];n.removeLayer(m)}}else r.addLayer(i),t||this.fire("layeradd",{layer:i})}a&&a(l,h,(new Date).getTime()-_),l===h?(this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons(),this._topClusterLevel._recursivelyAddChildrenToMap(null,this._zoom,this._currentShownBounds)):setTimeout(d,this.options.chunkDelay)},this);d()}else for(var c=this._needsClustering;h>l;l++)i=e[l],i instanceof L.LayerGroup?(u&&(e=e.slice(),u=!1),this._extractNonGroupLayers(i,e),h=e.length):i.getLatLng?this.hasLayer(i)||c.push(i):r.addLayer(i);return this},removeLayers:function(e){var t,i,n=e.length,r=this._featureGroup,s=this._nonPointGroup,o=!0;if(!this._map){for(t=0;n>t;t++)i=e[t],i instanceof L.LayerGroup?(o&&(e=e.slice(),o=!1),this._extractNonGroupLayers(i,e),n=e.length):(this._arraySplice(this._needsClustering,i),s.removeLayer(i),this.hasLayer(i)&&this._needsRemoving.push({layer:i,latlng:i._latlng}),this.fire("layerremove",{layer:i}));return this}if(this._unspiderfy){this._unspiderfy();var a=e.slice(),h=n;for(t=0;h>t;t++)i=a[t],i instanceof L.LayerGroup?(this._extractNonGroupLayers(i,a),h=a.length):this._unspiderfyLayer(i)}for(t=0;n>t;t++)i=e[t],i instanceof L.LayerGroup?(o&&(e=e.slice(),o=!1),this._extractNonGroupLayers(i,e),n=e.length):i.__parent?(this._removeLayer(i,!0,!0),this.fire("layerremove",{layer:i}),r.hasLayer(i)&&(r.removeLayer(i),i.clusterShow&&i.clusterShow())):(s.removeLayer(i),this.fire("layerremove",{layer:i}));return this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons(),this._topClusterLevel._recursivelyAddChildrenToMap(null,this._zoom,this._currentShownBounds),this},clearLayers:function(){return this._map||(this._needsClustering=[],this._needsRemoving=[],delete this._gridClusters,delete this._gridUnclustered),this._noanimationUnspiderfy&&this._noanimationUnspiderfy(),this._featureGroup.clearLayers(),this._nonPointGroup.clearLayers(),this.eachLayer(function(e){e.off(this._childMarkerEventHandlers,this),delete e.__parent},this),this._map&&this._generateInitialClusters(),this},getBounds:function(){var e=new L.LatLngBounds;this._topClusterLevel&&e.extend(this._topClusterLevel._bounds);for(var t=this._needsClustering.length-1;t>=0;t--)e.extend(this._needsClustering[t].getLatLng());return e.extend(this._nonPointGroup.getBounds()),e},eachLayer:function(e,t){var i,n,r,s=this._needsClustering.slice(),o=this._needsRemoving;for(this._topClusterLevel&&this._topClusterLevel.getAllChildMarkers(s),n=s.length-1;n>=0;n--){for(i=!0,r=o.length-1;r>=0;r--)if(o[r].layer===s[n]){i=!1;break}i&&e.call(t,s[n])}this._nonPointGroup.eachLayer(e,t)},getLayers:function(){var e=[];return this.eachLayer(function(t){e.push(t)}),e},getLayer:function(e){var t=null;return e=parseInt(e,10),this.eachLayer(function(i){L.stamp(i)===e&&(t=i)}),t},hasLayer:function(e){if(!e)return!1;var t,i=this._needsClustering;for(t=i.length-1;t>=0;t--)if(i[t]===e)return!0;for(i=this._needsRemoving,t=i.length-1;t>=0;t--)if(i[t].layer===e)return!1;return!(!e.__parent||e.__parent._group!==this)||this._nonPointGroup.hasLayer(e)},zoomToShowLayer:function(e,t){"function"!=typeof t&&(t=function(){});var i=function(){!e._icon&&!e.__parent._icon||this._inZoomAnimation||(this._map.off("moveend",i,this),this.off("animationend",i,this),e._icon?t():e.__parent._icon&&(this.once("spiderfied",t,this),e.__parent.spiderfy()))};e._icon&&this._map.getBounds().contains(e.getLatLng())?t():e.__parent._zoomt;t++)n=this._needsRemoving[t],n.newlatlng=n.layer._latlng,n.layer._latlng=n.latlng;for(t=0,i=this._needsRemoving.length;i>t;t++)n=this._needsRemoving[t],this._removeLayer(n.layer,!0),n.layer._latlng=n.newlatlng;this._needsRemoving=[],this._zoom=Math.round(this._map._zoom),this._currentShownBounds=this._getExpandedVisibleBounds(),this._map.on("zoomend",this._zoomEnd,this),this._map.on("moveend",this._moveEnd,this),this._spiderfierOnAdd&&this._spiderfierOnAdd(),this._bindEvents(),i=this._needsClustering,this._needsClustering=[],this.addLayers(i,!0)},onRemove:function(e){e.off("zoomend",this._zoomEnd,this),e.off("moveend",this._moveEnd,this),this._unbindEvents(),this._map._mapPane.className=this._map._mapPane.className.replace(" leaflet-cluster-anim",""),this._spiderfierOnRemove&&this._spiderfierOnRemove(),delete this._maxLat,this._hideCoverage(),this._featureGroup.remove(),this._nonPointGroup.remove(),this._featureGroup.clearLayers(),this._map=null},getVisibleParent:function(e){for(var t=e;t&&!t._icon;)t=t.__parent;return t||null},_arraySplice:function(e,t){for(var i=e.length-1;i>=0;i--)if(e[i]===t)return e.splice(i,1),!0},_removeFromGridUnclustered:function(e,t){for(var i=this._map,n=this._gridUnclustered,r=Math.floor(this._map.getMinZoom());t>=r&&n[t].removeObject(e,i.project(e.getLatLng(),t));t--);},_childMarkerDragStart:function(e){e.target.__dragStart=e.target._latlng},_childMarkerMoved:function(e){if(!this._ignoreMove&&!e.target.__dragStart){var t=e.target._popup&&e.target._popup.isOpen();this._moveChild(e.target,e.oldLatLng,e.latlng),t&&e.target.openPopup()}},_moveChild:function(e,t,i){e._latlng=t,this.removeLayer(e),e._latlng=i,this.addLayer(e)},_childMarkerDragEnd:function(e){var t=e.target.__dragStart;delete e.target.__dragStart,t&&this._moveChild(e.target,t,e.target._latlng)},_removeLayer:function(e,t,i){var n=this._gridClusters,r=this._gridUnclustered,s=this._featureGroup,o=this._map,a=Math.floor(this._map.getMinZoom());t&&this._removeFromGridUnclustered(e,this._maxZoom);var h,l=e.__parent,u=l._markers;for(this._arraySplice(u,e);l&&(l._childCount--,l._boundsNeedUpdate=!0,!(l._zoomt?"small":100>t?"medium":"large",new L.DivIcon({html:"
"+t+"
",className:"marker-cluster"+i,iconSize:new L.Point(40,40)})},_bindEvents:function(){var e=this._map,t=this.options.spiderfyOnMaxZoom,i=this.options.showCoverageOnHover,n=this.options.zoomToBoundsOnClick;(t||n)&&this.on("clusterclick",this._zoomOrSpiderfy,this),i&&(this.on("clustermouseover",this._showCoverage,this),this.on("clustermouseout",this._hideCoverage,this),e.on("zoomend",this._hideCoverage,this))},_zoomOrSpiderfy:function(e){for(var t=e.layer,i=t;1===i._childClusters.length;)i=i._childClusters[0];i._zoom===this._maxZoom&&i._childCount===t._childCount&&this.options.spiderfyOnMaxZoom?t.spiderfy():this.options.zoomToBoundsOnClick&&t.zoomToBounds(),e.originalEvent&&13===e.originalEvent.keyCode&&this._map._container.focus()},_showCoverage:function(e){var t=this._map;this._inZoomAnimation||(this._shownPolygon&&t.removeLayer(this._shownPolygon),e.layer.getChildCount()>2&&e.layer!==this._spiderfied&&(this._shownPolygon=new L.Polygon(e.layer.getConvexHull(),this.options.polygonOptions),t.addLayer(this._shownPolygon)))},_hideCoverage:function(){this._shownPolygon&&(this._map.removeLayer(this._shownPolygon),this._shownPolygon=null)},_unbindEvents:function(){var e=this.options.spiderfyOnMaxZoom,t=this.options.showCoverageOnHover,i=this.options.zoomToBoundsOnClick,n=this._map;(e||i)&&this.off("clusterclick",this._zoomOrSpiderfy,this),t&&(this.off("clustermouseover",this._showCoverage,this),this.off("clustermouseout",this._hideCoverage,this),n.off("zoomend",this._hideCoverage,this))},_zoomEnd:function(){this._map&&(this._mergeSplitClusters(),this._zoom=Math.round(this._map._zoom),this._currentShownBounds=this._getExpandedVisibleBounds())},_moveEnd:function(){if(!this._inZoomAnimation){var e=this._getExpandedVisibleBounds();this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,Math.floor(this._map.getMinZoom()),this._zoom,e),this._topClusterLevel._recursivelyAddChildrenToMap(null,Math.round(this._map._zoom),e),this._currentShownBounds=e}},_generateInitialClusters:function(){var e=Math.ceil(this._map.getMaxZoom()),t=Math.floor(this._map.getMinZoom()),i=this.options.maxClusterRadius,n=i;"function"!=typeof i&&(n=function(){return i}),null!==this.options.disableClusteringAtZoom&&(e=this.options.disableClusteringAtZoom-1),this._maxZoom=e,this._gridClusters={},this._gridUnclustered={};for(var r=e;r>=t;r--)this._gridClusters[r]=new L.DistanceGrid(n(r)),this._gridUnclustered[r]=new L.DistanceGrid(n(r));this._topClusterLevel=new this._markerCluster(this,t-1)},_addLayer:function(e,t){var i,n,r=this._gridClusters,s=this._gridUnclustered,o=Math.floor(this._map.getMinZoom());for(this.options.singleMarkerMode&&this._overrideMarkerIcon(e),e.on(this._childMarkerEventHandlers,this);t>=o;t--){i=this._map.project(e.getLatLng(),t);var a=r[t].getNearObject(i);if(a)return a._addChild(e),e.__parent=a,void 0;if(a=s[t].getNearObject(i)){var h=a.__parent;h&&this._removeLayer(a,!1);var l=new this._markerCluster(this,t,a,e);r[t].addObject(l,this._map.project(l._cLatLng,t)),a.__parent=l,e.__parent=l;var u=l;for(n=t-1;n>h._zoom;n--)u=new this._markerCluster(this,n,u),r[n].addObject(u,this._map.project(a.getLatLng(),n));return h._addChild(u),this._removeFromGridUnclustered(a,t),void 0}s[t].addObject(e,i)}this._topClusterLevel._addChild(e),e.__parent=this._topClusterLevel},_refreshClustersIcons:function(){this._featureGroup.eachLayer(function(e){e instanceof L.MarkerCluster&&e._iconNeedsUpdate&&e._updateIcon()})},_enqueue:function(e){this._queue.push(e),this._queueTimeout||(this._queueTimeout=setTimeout(L.bind(this._processQueue,this),300))},_processQueue:function(){for(var e=0;ee?(this._animationStart(),this._animationZoomOut(this._zoom,e)):this._moveEnd()},_getExpandedVisibleBounds:function(){return this.options.removeOutsideVisibleBounds?L.Browser.mobile?this._checkBoundsMaxLat(this._map.getBounds()):this._checkBoundsMaxLat(this._map.getBounds().pad(1)):this._mapBoundsInfinite},_checkBoundsMaxLat:function(e){var t=this._maxLat;return void 0!==t&&(e.getNorth()>=t&&(e._northEast.lat=1/0),e.getSouth()<=-t&&(e._southWest.lat=-1/0)),e},_animationAddLayerNonAnimated:function(e,t){if(t===e)this._featureGroup.addLayer(e);else if(2===t._childCount){t._addToMap();var i=t.getAllChildMarkers();this._featureGroup.removeLayer(i[0]),this._featureGroup.removeLayer(i[1])}else t._updateIcon()},_extractNonGroupLayers:function(e,t){var i,n=e.getLayers(),r=0;for(t=t||[];r=0;i--)o=h[i],n.contains(o._latlng)||r.removeLayer(o)}),this._forceLayout(),this._topClusterLevel._recursivelyBecomeVisible(n,t),r.eachLayer(function(e){e instanceof L.MarkerCluster||!e._icon||e.clusterShow()}),this._topClusterLevel._recursively(n,e,t,function(e){e._recursivelyRestoreChildPositions(t)}),this._ignoreMove=!1,this._enqueue(function(){this._topClusterLevel._recursively(n,e,s,function(e){r.removeLayer(e),e.clusterShow()}),this._animationEnd()})},_animationZoomOut:function(e,t){this._animationZoomOutSingle(this._topClusterLevel,e-1,t),this._topClusterLevel._recursivelyAddChildrenToMap(null,t,this._getExpandedVisibleBounds()),this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,Math.floor(this._map.getMinZoom()),e,this._getExpandedVisibleBounds())},_animationAddLayer:function(e,t){var i=this,n=this._featureGroup;n.addLayer(e),t!==e&&(t._childCount>2?(t._updateIcon(),this._forceLayout(),this._animationStart(),e._setPos(this._map.latLngToLayerPoint(t.getLatLng())),e.clusterHide(),this._enqueue(function(){n.removeLayer(e),e.clusterShow(),i._animationEnd()})):(this._forceLayout(),i._animationStart(),i._animationZoomOutSingle(t,this._map.getMaxZoom(),this._zoom)))}},_animationZoomOutSingle:function(e,t,i){var n=this._getExpandedVisibleBounds(),r=Math.floor(this._map.getMinZoom());e._recursivelyAnimateChildrenInAndAddSelfToMap(n,r,t+1,i);var s=this;this._forceLayout(),e._recursivelyBecomeVisible(n,i),this._enqueue(function(){if(1===e._childCount){var o=e._markers[0];this._ignoreMove=!0,o.setLatLng(o.getLatLng()),this._ignoreMove=!1,o.clusterShow&&o.clusterShow()}else e._recursively(n,i,r,function(e){e._recursivelyRemoveChildrenFromMap(n,r,t+1)});s._animationEnd()})},_animationEnd:function(){this._map&&(this._map._mapPane.className=this._map._mapPane.className.replace(" leaflet-cluster-anim","")),this._inZoomAnimation--,this.fire("animationend")},_forceLayout:function(){L.Util.falseFn(document.body.offsetWidth)}}),L.markerClusterGroup=function(e){return new L.MarkerClusterGroup(e)};var i=L.MarkerCluster=L.Marker.extend({options:L.Icon.prototype.options,initialize:function(e,t,i,n){L.Marker.prototype.initialize.call(this,i?i._cLatLng||i.getLatLng():new L.LatLng(0,0),{icon:this,pane:e.options.clusterPane}),this._group=e,this._zoom=t,this._markers=[],this._childClusters=[],this._childCount=0,this._iconNeedsUpdate=!0,this._boundsNeedUpdate=!0,this._bounds=new L.LatLngBounds,i&&this._addChild(i),n&&this._addChild(n)},getAllChildMarkers:function(e,t){e=e||[];for(var i=this._childClusters.length-1;i>=0;i--)this._childClusters[i].getAllChildMarkers(e);for(var n=this._markers.length-1;n>=0;n--)t&&this._markers[n].__dragStart||e.push(this._markers[n]);return e},getChildCount:function(){return this._childCount},zoomToBounds:function(e){for(var t,i=this._childClusters.slice(),n=this._group._map,r=n.getBoundsZoom(this._bounds),s=this._zoom+1,o=n.getZoom();i.length>0&&r>s;){s++;var a=[];for(t=0;ts?this._group._map.setView(this._latlng,s):o>=r?this._group._map.setView(this._latlng,o+1):this._group._map.fitBounds(this._bounds,e)},getBounds:function(){var e=new L.LatLngBounds;return e.extend(this._bounds),e},_updateIcon:function(){this._iconNeedsUpdate=!0,this._icon&&this.setIcon(this)},createIcon:function(){return this._iconNeedsUpdate&&(this._iconObj=this._group.options.iconCreateFunction(this),this._iconNeedsUpdate=!1),this._iconObj.createIcon()},createShadow:function(){return this._iconObj.createShadow()},_addChild:function(e,t){this._iconNeedsUpdate=!0,this._boundsNeedUpdate=!0,this._setClusterCenter(e),e instanceof L.MarkerCluster?(t||(this._childClusters.push(e),e.__parent=this),this._childCount+=e._childCount):(t||this._markers.push(e),this._childCount++),this.__parent&&this.__parent._addChild(e,!0)},_setClusterCenter:function(e){this._cLatLng||(this._cLatLng=e._cLatLng||e._latlng)},_resetBounds:function(){var e=this._bounds;e._southWest&&(e._southWest.lat=1/0,e._southWest.lng=1/0),e._northEast&&(e._northEast.lat=-1/0,e._northEast.lng=-1/0)},_recalculateBounds:function(){var e,t,i,n,r=this._markers,s=this._childClusters,o=0,a=0,h=this._childCount;if(0!==h){for(this._resetBounds(),e=0;e=0;i--)n=r[i],n._icon&&(n._setPos(t),n.clusterHide())},function(e){var i,n,r=e._childClusters;for(i=r.length-1;i>=0;i--)n=r[i],n._icon&&(n._setPos(t),n.clusterHide())})},_recursivelyAnimateChildrenInAndAddSelfToMap:function(e,t,i,n){this._recursively(e,n,t,function(r){r._recursivelyAnimateChildrenIn(e,r._group._map.latLngToLayerPoint(r.getLatLng()).round(),i),r._isSingleParent()&&i-1===n?(r.clusterShow(),r._recursivelyRemoveChildrenFromMap(e,t,i)):r.clusterHide(),r._addToMap()})},_recursivelyBecomeVisible:function(e,t){this._recursively(e,this._group._map.getMinZoom(),t,null,function(e){e.clusterShow()})},_recursivelyAddChildrenToMap:function(e,t,i){this._recursively(i,this._group._map.getMinZoom()-1,t,function(n){if(t!==n._zoom)for(var r=n._markers.length-1;r>=0;r--){var s=n._markers[r];i.contains(s._latlng)&&(e&&(s._backupLatlng=s.getLatLng(),s.setLatLng(e),s.clusterHide&&s.clusterHide()),n._group._featureGroup.addLayer(s))}},function(t){t._addToMap(e)})},_recursivelyRestoreChildPositions:function(e){for(var t=this._markers.length-1;t>=0;t--){var i=this._markers[t];i._backupLatlng&&(i.setLatLng(i._backupLatlng),delete i._backupLatlng)}if(e-1===this._zoom)for(var n=this._childClusters.length-1;n>=0;n--)this._childClusters[n]._restorePosition();else for(var r=this._childClusters.length-1;r>=0;r--)this._childClusters[r]._recursivelyRestoreChildPositions(e)},_restorePosition:function(){this._backupLatlng&&(this.setLatLng(this._backupLatlng),delete this._backupLatlng)},_recursivelyRemoveChildrenFromMap:function(e,t,i,n){var r,s;this._recursively(e,t-1,i-1,function(e){for(s=e._markers.length-1;s>=0;s--)r=e._markers[s],n&&n.contains(r._latlng)||(e._group._featureGroup.removeLayer(r),r.clusterShow&&r.clusterShow())},function(e){for(s=e._childClusters.length-1;s>=0;s--)r=e._childClusters[s],n&&n.contains(r._latlng)||(e._group._featureGroup.removeLayer(r),r.clusterShow&&r.clusterShow())})},_recursively:function(e,t,i,n,r){var s,o,a=this._childClusters,h=this._zoom;if(h>=t&&(n&&n(this),r&&h===i&&r(this)),t>h||i>h)for(s=a.length-1;s>=0;s--)o=a[s],o._boundsNeedUpdate&&o._recalculateBounds(),e.intersects(o._bounds)&&o._recursively(e,t,i,n,r)},_isSingleParent:function(){return this._childClusters.length>0&&this._childClusters[0]._childCount===this._childCount}});L.Marker.include({clusterHide:function(){var e=this.options.opacity;return this.setOpacity(0),this.options.opacity=e,this},clusterShow:function(){return this.setOpacity(this.options.opacity)}}),L.DistanceGrid=function(e){this._cellSize=e,this._sqCellSize=e*e,this._grid={},this._objectPoint={}},L.DistanceGrid.prototype={addObject:function(e,t){var i=this._getCoord(t.x),n=this._getCoord(t.y),r=this._grid,s=r[n]=r[n]||{},o=s[i]=s[i]||[],a=L.Util.stamp(e);this._objectPoint[a]=t,o.push(e)},updateObject:function(e,t){this.removeObject(e),this.addObject(e,t)},removeObject:function(e,t){var i,n,r=this._getCoord(t.x),s=this._getCoord(t.y),o=this._grid,a=o[s]=o[s]||{},h=a[r]=a[r]||[];for(delete this._objectPoint[L.Util.stamp(e)],i=0,n=h.length;n>i;i++)if(h[i]===e)return h.splice(i,1),1===n&&delete a[r],!0},eachObject:function(e,t){var i,n,r,s,o,a,h,l=this._grid;for(i in l){o=l[i];for(n in o)for(a=o[n],r=0,s=a.length;s>r;r++)h=e.call(t,a[r]),h&&(r--,s--)}},getNearObject:function(e){var t,i,n,r,s,o,a,h,l=this._getCoord(e.x),u=this._getCoord(e.y),_=this._objectPoint,d=this._sqCellSize,c=null;for(t=u-1;u+1>=t;t++)if(r=this._grid[t])for(i=l-1;l+1>=i;i++)if(s=r[i])for(n=0,o=s.length;o>n;n++)a=s[n],h=this._sqDist(_[L.Util.stamp(a)],e),(d>h||d>=h&&null===c)&&(d=h,c=a);return c},_getCoord:function(e){var t=Math.floor(e/this._cellSize);return isFinite(t)?t:e},_sqDist:function(e,t){var i=t.x-e.x,n=t.y-e.y;return i*i+n*n}},function(){L.QuickHull={getDistant:function(e,t){var i=t[1].lat-t[0].lat,n=t[0].lng-t[1].lng;return n*(e.lat-t[0].lat)+i*(e.lng-t[0].lng)},findMostDistantPointFromBaseLine:function(e,t){var i,n,r,s=0,o=null,a=[];for(i=t.length-1;i>=0;i--)n=t[i],r=this.getDistant(n,e),r>0&&(a.push(n),r>s&&(s=r,o=n));return{maxPoint:o,newPoints:a}},buildConvexHull:function(e,t){var i=[],n=this.findMostDistantPointFromBaseLine(e,t);return n.maxPoint?(i=i.concat(this.buildConvexHull([e[0],n.maxPoint],n.newPoints)),i=i.concat(this.buildConvexHull([n.maxPoint,e[1]],n.newPoints))):[e[0]]},getConvexHull:function(e){var t,i=!1,n=!1,r=!1,s=!1,o=null,a=null,h=null,l=null,u=null,_=null;for(t=e.length-1;t>=0;t--){var d=e[t];(i===!1||d.lat>i)&&(o=d,i=d.lat),(n===!1||d.latr)&&(h=d,r=d.lng),(s===!1||d.lng=0;t--)e=i[t].getLatLng(),n.push(e);return L.QuickHull.getConvexHull(n)}}),L.MarkerCluster.include({_2PI:2*Math.PI,_circleFootSeparation:25,_circleStartAngle:0,_spiralFootSeparation:28,_spiralLengthStart:11,_spiralLengthFactor:5,_circleSpiralSwitchover:9,spiderfy:function(){if(this._group._spiderfied!==this&&!this._group._inZoomAnimation){var e,t=this.getAllChildMarkers(null,!0),i=this._group,n=i._map,r=n.latLngToLayerPoint(this._latlng);this._group._unspiderfy(),this._group._spiderfied=this,t.length>=this._circleSpiralSwitchover?e=this._generatePointsSpiral(t.length,r):(r.y+=10,e=this._generatePointsCircle(t.length,r)),this._animationSpiderfy(t,e)}},unspiderfy:function(e){this._group._inZoomAnimation||(this._animationUnspiderfy(e),this._group._spiderfied=null)},_generatePointsCircle:function(e,t){var i,n,r=this._group.options.spiderfyDistanceMultiplier*this._circleFootSeparation*(2+e),s=r/this._2PI,o=this._2PI/e,a=[];for(s=Math.max(s,35),a.length=e,i=0;e>i;i++)n=this._circleStartAngle+i*o,a[i]=new L.Point(t.x+s*Math.cos(n),t.y+s*Math.sin(n))._round();return a},_generatePointsSpiral:function(e,t){var i,n=this._group.options.spiderfyDistanceMultiplier,r=n*this._spiralLengthStart,s=n*this._spiralFootSeparation,o=n*this._spiralLengthFactor*this._2PI,a=0,h=[];for(h.length=e,i=e;i>=0;i--)e>i&&(h[i]=new L.Point(t.x+r*Math.cos(a),t.y+r*Math.sin(a))._round()),a+=s/r+5e-4*i,r+=o/a;return h},_noanimationUnspiderfy:function(){var e,t,i=this._group,n=i._map,r=i._featureGroup,s=this.getAllChildMarkers(null,!0);for(i._ignoreMove=!0,this.setOpacity(1),t=s.length-1;t>=0;t--)e=s[t],r.removeLayer(e),e._preSpiderfyLatlng&&(e.setLatLng(e._preSpiderfyLatlng),delete e._preSpiderfyLatlng),e.setZIndexOffset&&e.setZIndexOffset(0),e._spiderLeg&&(n.removeLayer(e._spiderLeg),delete e._spiderLeg);i.fire("unspiderfied",{cluster:this,markers:s}),i._ignoreMove=!1,i._spiderfied=null}}),L.MarkerClusterNonAnimated=L.MarkerCluster.extend({_animationSpiderfy:function(e,t){var i,n,r,s,o=this._group,a=o._map,h=o._featureGroup,l=this._group.options.spiderLegPolylineOptions;for(o._ignoreMove=!0,i=0;i=0;i--)a=u.layerPointToLatLng(t[i]),n=e[i],n._preSpiderfyLatlng=n._latlng,n.setLatLng(a),n.clusterShow&&n.clusterShow(),p&&(r=n._spiderLeg,s=r._path,s.style.strokeDashoffset=0,r.setStyle({opacity:m}));this.setOpacity(.3),l._ignoreMove=!1,setTimeout(function(){l._animationEnd(),l.fire("spiderfied",{cluster:h,markers:e})},200)},_animationUnspiderfy:function(e){var t,i,n,r,s,o,a=this,h=this._group,l=h._map,u=h._featureGroup,_=e?l._latLngToNewLayerPoint(this._latlng,e.zoom,e.center):l.latLngToLayerPoint(this._latlng),d=this.getAllChildMarkers(null,!0),c=L.Path.SVG;for(h._ignoreMove=!0,h._animationStart(),this.setOpacity(1),i=d.length-1;i>=0;i--)t=d[i],t._preSpiderfyLatlng&&(t.closePopup(),t.setLatLng(t._preSpiderfyLatlng),delete t._preSpiderfyLatlng,o=!0,t._setPos&&(t._setPos(_),o=!1),t.clusterHide&&(t.clusterHide(),o=!1),o&&u.removeLayer(t),c&&(n=t._spiderLeg,r=n._path,s=r.getTotalLength()+.1,r.style.strokeDashoffset=s,n.setStyle({opacity:0})));h._ignoreMove=!1,setTimeout(function(){var e=0;for(i=d.length-1;i>=0;i--)t=d[i],t._spiderLeg&&e++;for(i=d.length-1;i>=0;i--)t=d[i],t._spiderLeg&&(t.clusterShow&&t.clusterShow(),t.setZIndexOffset&&t.setZIndexOffset(0),e>1&&u.removeLayer(t),l.removeLayer(t._spiderLeg),delete t._spiderLeg);h._animationEnd(),h.fire("unspiderfied",{cluster:a,markers:d})},200)}}),L.MarkerClusterGroup.include({_spiderfied:null,unspiderfy:function(){this._unspiderfy.apply(this,arguments)},_spiderfierOnAdd:function(){this._map.on("click",this._unspiderfyWrapper,this),this._map.options.zoomAnimation&&this._map.on("zoomstart",this._unspiderfyZoomStart,this),this._map.on("zoomend",this._noanimationUnspiderfy,this),L.Browser.touch||this._map.getRenderer(this)},_spiderfierOnRemove:function(){this._map.off("click",this._unspiderfyWrapper,this),this._map.off("zoomstart",this._unspiderfyZoomStart,this),this._map.off("zoomanim",this._unspiderfyZoomAnim,this),this._map.off("zoomend",this._noanimationUnspiderfy,this),this._noanimationUnspiderfy() +},_unspiderfyZoomStart:function(){this._map&&this._map.on("zoomanim",this._unspiderfyZoomAnim,this)},_unspiderfyZoomAnim:function(e){L.DomUtil.hasClass(this._map._mapPane,"leaflet-touching")||(this._map.off("zoomanim",this._unspiderfyZoomAnim,this),this._unspiderfy(e))},_unspiderfyWrapper:function(){this._unspiderfy()},_unspiderfy:function(e){this._spiderfied&&this._spiderfied.unspiderfy(e)},_noanimationUnspiderfy:function(){this._spiderfied&&this._spiderfied._noanimationUnspiderfy()},_unspiderfyLayer:function(e){e._spiderLeg&&(this._featureGroup.removeLayer(e),e.clusterShow&&e.clusterShow(),e.setZIndexOffset&&e.setZIndexOffset(0),this._map.removeLayer(e._spiderLeg),delete e._spiderLeg)}}),L.MarkerClusterGroup.include({refreshClusters:function(e){return e?e instanceof L.MarkerClusterGroup?e=e._topClusterLevel.getAllChildMarkers():e instanceof L.LayerGroup?e=e._layers:e instanceof L.MarkerCluster?e=e.getAllChildMarkers():e instanceof L.Marker&&(e=[e]):e=this._topClusterLevel.getAllChildMarkers(),this._flagParentsIconsNeedUpdate(e),this._refreshClustersIcons(),this.options.singleMarkerMode&&this._refreshSingleMarkerModeMarkers(e),this},_flagParentsIconsNeedUpdate:function(e){var t,i;for(t in e)for(i=e[t].__parent;i;)i._iconNeedsUpdate=!0,i=i.__parent},_refreshSingleMarkerModeMarkers:function(e){var t,i;for(t in e)i=e[t],this.hasLayer(i)&&i.setIcon(this._overrideMarkerIcon(i))}}),L.Marker.include({refreshIconOptions:function(e,t){var i=this.options.icon;return L.setOptions(i,e),this.setIcon(i),t&&this.__parent&&this.__parent._group.refreshClusters(this),this}}),e.MarkerClusterGroup=t,e.MarkerCluster=i}); +//# sourceMappingURL=leaflet.markercluster.js.map \ No newline at end of file diff --git a/sut/frontend/build/leaflet/marker_cluster/leaflet.markercluster.js.map b/sut/frontend/build/leaflet/marker_cluster/leaflet.markercluster.js.map new file mode 100644 index 0000000..a4b459c --- /dev/null +++ b/sut/frontend/build/leaflet/marker_cluster/leaflet.markercluster.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/MarkerClusterGroup.js","../src/MarkerCluster.js","../src/MarkerOpacity.js","../src/DistanceGrid.js","../src/MarkerCluster.QuickHull.js","../src/MarkerCluster.Spiderfier.js","../src/MarkerClusterGroup.Refresh.js"],"names":[],"mappings":"0PAIO,IAAI,GAAqB,EAAE,mBAAqB,EAAE,aAAa,QAErE,SACC,iBAAkB,GAClB,mBAAoB,KACpB,YAAa,EAAE,OAAO,UAAU,QAAQ,KAExC,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAElB,wBAAyB,KAIzB,4BAA4B,EAK5B,SAAS,EAIT,sBAAsB,EAGtB,2BAA4B,EAG5B,0BAA4B,OAAQ,IAAK,MAAO,OAAQ,QAAS,IAGjE,gBAAgB,EAChB,cAAe,IACf,WAAY,GACZ,cAAe,KAGf,mBAGD,WAAY,SAAU,GACrB,EAAE,KAAK,WAAW,KAAM,GACnB,KAAK,QAAQ,qBACjB,KAAK,QAAQ,mBAAqB,KAAK,4BAGxC,KAAK,cAAgB,EAAE,eACvB,KAAK,cAAc,eAAe,MAElC,KAAK,eAAiB,EAAE,eACxB,KAAK,eAAe,eAAe,MAEnC,KAAK,iBAAmB,EACxB,KAAK,oBACL,KAAK,kBAEL,KAAK,oBAAsB,KAE3B,KAAK,UAEL,KAAK,2BACJ,UAAa,KAAK,sBAClB,KAAQ,KAAK,kBACb,QAAW,KAAK,oBAIjB,IAAI,GAAU,EAAE,QAAQ,YAAc,KAAK,QAAQ,OACnD,GAAE,OAAO,KAAM,EAAU,KAAK,eAAiB,KAAK,cAEpD,KAAK,eAAiB,EAAU,EAAE,cAAgB,EAAE,0BAGrD,SAAU,SAAU,GAEnB,GAAI,YAAiB,GAAE,WACtB,MAAO,MAAK,WAAW,GAIxB,KAAK,EAAM,UAGV,MAFA,MAAK,eAAe,SAAS,GAC7B,KAAK,KAAK,YAAc,MAAO,IACxB,IAGR,KAAK,KAAK,KAGT,MAFA,MAAK,iBAAiB,KAAK,GAC3B,KAAK,KAAK,YAAc,MAAO,IACxB,IAGR,IAAI,KAAK,SAAS,GACjB,MAAO,KAMJ,MAAK,aACR,KAAK,cAGN,KAAK,UAAU,EAAO,KAAK,UAC3B,KAAK,KAAK,YAAc,MAAO,IAG/B,KAAK,iBAAiB,qBAEtB,KAAK,uBAGL,IAAI,GAAe,EACf,EAAc,KAAK,KACvB,IAAI,EAAM,SACT,KAAO,EAAa,SAAS,OAAS,GACrC,EAAe,EAAa,QAW9B,OAPI,MAAK,oBAAoB,SAAS,EAAa,eAC9C,KAAK,QAAQ,qBAChB,KAAK,mBAAmB,EAAO,GAE/B,KAAK,8BAA8B,EAAO,IAGrC,MAGR,YAAa,SAAU,GAEtB,MAAI,aAAiB,GAAE,WACf,KAAK,cAAc,IAItB,EAAM,UAMN,KAAK,KAQL,EAAM,UAIP,KAAK,cACR,KAAK,cACL,KAAK,iBAAiB,IAIvB,KAAK,aAAa,GAAO,GACzB,KAAK,KAAK,eAAiB,MAAO,IAGlC,KAAK,iBAAiB,qBAEtB,KAAK,wBAEL,EAAM,IAAI,KAAK,0BAA2B,MAEtC,KAAK,cAAc,SAAS,KAC/B,KAAK,cAAc,YAAY,GAC3B,EAAM,aACT,EAAM,eAID,MA1BC,OARF,KAAK,aAAa,KAAK,iBAAkB,IAAU,KAAK,SAAS,IACrE,KAAK,eAAe,MAAO,MAAO,EAAO,OAAQ,EAAM,UAExD,KAAK,KAAK,eAAiB,MAAO,IAC3B,OAVP,KAAK,eAAe,YAAY,GAChC,KAAK,KAAK,eAAiB,MAAO,IAC3B,OA0CT,UAAW,SAAU,EAAa,GACjC,IAAK,EAAE,KAAK,QAAQ,GACnB,MAAO,MAAK,SAAS,EAGtB,IAQI,GARA,EAAK,KAAK,cACV,EAAM,KAAK,eACX,EAAU,KAAK,QAAQ,eACvB,EAAgB,KAAK,QAAQ,cAC7B,EAAgB,KAAK,QAAQ,cAC7B,EAAI,EAAY,OAChB,EAAS,EACT,GAAgB,CAGpB,IAAI,KAAK,KAAM,CACd,GAAI,IAAU,GAAK,OAAQ,UACvB,EAAU,EAAE,KAAK,WAEpB,IADA,GAAI,IAAQ,GAAK,OAAQ,UACT,EAAT,EAAY,IAAU,CAC5B,GAAI,GAA4B,IAAjB,EAAS,IAAW,CAElC,GAAI,IAAU,GAAK,OAAQ,UAAY,CACvC,IAAI,EAAU,EACb,MAYF,GARA,EAAI,EAAY,GAQZ,YAAa,GAAE,WACd,IACH,EAAc,EAAY,QAC1B,GAAgB,GAEjB,KAAK,uBAAuB,EAAG,GAC/B,EAAI,EAAY,WAKjB,IAAK,EAAE,WAQP,IAAI,KAAK,SAAS,KAIlB,KAAK,UAAU,EAAG,KAAK,UAClB,GACJ,KAAK,KAAK,YAAc,MAAO,IAI5B,EAAE,UAC8B,IAA/B,EAAE,SAAS,iBAAuB,CACrC,GAAI,GAAU,EAAE,SAAS,qBACrB,EAAc,EAAQ,KAAO,EAAI,EAAQ,GAAK,EAAQ,EAC1D,GAAG,YAAY,QArBhB,GAAI,SAAS,GACR,GACJ,KAAK,KAAK,YAAc,MAAO,IAwB9B,GAEH,EAAc,EAAQ,GAAG,GAAK,OAAQ,UAAY,GAI/C,IAAW,GAGd,KAAK,iBAAiB,qBAEtB,KAAK,wBAEL,KAAK,iBAAiB,6BAA6B,KAAM,KAAK,MAAO,KAAK,sBAE1E,WAAW,EAAS,KAAK,QAAQ,aAEhC,KAEH,SAIA,KAFA,GAAI,GAAkB,KAAK,iBAEX,EAAT,EAAY,IAClB,EAAI,EAAY,GAGZ,YAAa,GAAE,YACd,IACH,EAAc,EAAY,QAC1B,GAAgB,GAEjB,KAAK,uBAAuB,EAAG,GAC/B,EAAI,EAAY,QAKZ,EAAE,UAKH,KAAK,SAAS,IAIlB,EAAgB,KAAK,GARpB,EAAI,SAAS,EAWhB,OAAO,OAIR,aAAc,SAAU,GACvB,GAAI,GAAG,EACH,EAAI,EAAY,OAChB,EAAK,KAAK,cACV,EAAM,KAAK,eACX,GAAgB,CAEpB,KAAK,KAAK,KAAM,CACf,IAAK,EAAI,EAAO,EAAJ,EAAO,IAClB,EAAI,EAAY,GAGZ,YAAa,GAAE,YACd,IACH,EAAc,EAAY,QAC1B,GAAgB,GAEjB,KAAK,uBAAuB,EAAG,GAC/B,EAAI,EAAY,SAIjB,KAAK,aAAa,KAAK,iBAAkB,GACzC,EAAI,YAAY,GACZ,KAAK,SAAS,IACjB,KAAK,eAAe,MAAO,MAAO,EAAG,OAAQ,EAAE,UAEhD,KAAK,KAAK,eAAiB,MAAO,IAEnC,OAAO,MAGR,GAAI,KAAK,YAAa,CACrB,KAAK,aAGL,IAAI,GAAe,EAAY,QAC3B,EAAK,CACT,KAAK,EAAI,EAAO,EAAJ,EAAQ,IACnB,EAAI,EAAa,GAGb,YAAa,GAAE,YAClB,KAAK,uBAAuB,EAAG,GAC/B,EAAK,EAAa,QAInB,KAAK,iBAAiB,GAIxB,IAAK,EAAI,EAAO,EAAJ,EAAO,IAClB,EAAI,EAAY,GAGZ,YAAa,GAAE,YACd,IACH,EAAc,EAAY,QAC1B,GAAgB,GAEjB,KAAK,uBAAuB,EAAG,GAC/B,EAAI,EAAY,QAIZ,EAAE,UAMP,KAAK,aAAa,GAAG,GAAM,GAC3B,KAAK,KAAK,eAAiB,MAAO,IAE9B,EAAG,SAAS,KACf,EAAG,YAAY,GACX,EAAE,aACL,EAAE,iBAXH,EAAI,YAAY,GAChB,KAAK,KAAK,eAAiB,MAAO,IAuBpC,OAPA,MAAK,iBAAiB,qBAEtB,KAAK,wBAGL,KAAK,iBAAiB,6BAA6B,KAAM,KAAK,MAAO,KAAK,qBAEnE,MAIR,YAAa,WA6BZ,MAzBK,MAAK,OACT,KAAK,oBACL,KAAK,wBACE,MAAK,oBACL,MAAK,kBAGT,KAAK,wBACR,KAAK,yBAIN,KAAK,cAAc,cACnB,KAAK,eAAe,cAEpB,KAAK,UAAU,SAAU,GACxB,EAAO,IAAI,KAAK,0BAA2B,YACpC,GAAO,UACZ,MAEC,KAAK,MAER,KAAK,2BAGC,MAIR,UAAW,WACV,GAAI,GAAS,GAAI,GAAE,YAEf,MAAK,kBACR,EAAO,OAAO,KAAK,iBAAiB,QAGrC,KAAK,GAAI,GAAI,KAAK,iBAAiB,OAAS,EAAG,GAAK,EAAG,IACtD,EAAO,OAAO,KAAK,iBAAiB,GAAG,YAKxC,OAFA,GAAO,OAAO,KAAK,eAAe,aAE3B,GAIR,UAAW,SAAU,EAAQ,GAC5B,GAEC,GAAmB,EAAG,EAFnB,EAAU,KAAK,iBAAiB,QACnC,EAAgB,KAAK,cAOtB,KAJI,KAAK,kBACR,KAAK,iBAAiB,mBAAmB,GAGrC,EAAI,EAAQ,OAAS,EAAG,GAAK,EAAG,IAAK,CAGzC,IAFA,GAAoB,EAEf,EAAI,EAAc,OAAS,EAAG,GAAK,EAAG,IAC1C,GAAI,EAAc,GAAG,QAAU,EAAQ,GAAI,CAC1C,GAAoB,CACpB,OAIE,GACH,EAAO,KAAK,EAAS,EAAQ,IAI/B,KAAK,eAAe,UAAU,EAAQ,IAIvC,UAAW,WACV,GAAI,KAIJ,OAHA,MAAK,UAAU,SAAU,GACxB,EAAO,KAAK,KAEN,GAIR,SAAU,SAAU,GACnB,GAAI,GAAS,IAUb,OARA,GAAK,SAAS,EAAI,IAElB,KAAK,UAAU,SAAU,GACpB,EAAE,MAAM,KAAO,IAClB,EAAS,KAIJ,GAIR,SAAU,SAAU,GACnB,IAAK,EACJ,OAAO,CAGR,IAAI,GAAG,EAAU,KAAK,gBAEtB,KAAK,EAAI,EAAQ,OAAS,EAAG,GAAK,EAAG,IACpC,GAAI,EAAQ,KAAO,EAClB,OAAO,CAKT,KADA,EAAU,KAAK,eACV,EAAI,EAAQ,OAAS,EAAG,GAAK,EAAG,IACpC,GAAI,EAAQ,GAAG,QAAU,EACxB,OAAO,CAIT,UAAU,EAAM,UAAY,EAAM,SAAS,SAAW,OAAS,KAAK,eAAe,SAAS,IAI7F,gBAAiB,SAAU,EAAO,GAET,kBAAb,KACV,EAAW,aAGZ,IAAI,GAAa,YACX,EAAM,QAAS,EAAM,SAAS,OAAW,KAAK,mBAClD,KAAK,KAAK,IAAI,UAAW,EAAY,MACrC,KAAK,IAAI,eAAgB,EAAY,MAEjC,EAAM,MACT,IACU,EAAM,SAAS,QACzB,KAAK,KAAK,aAAc,EAAU,MAClC,EAAM,SAAS,aAKd,GAAM,OAAS,KAAK,KAAK,YAAY,SAAS,EAAM,aAEvD,IACU,EAAM,SAAS,MAAQ,KAAK,MAAM,KAAK,KAAK,QAEtD,KAAK,KAAK,GAAG,UAAW,EAAY,MACpC,KAAK,KAAK,MAAM,EAAM,eAEtB,KAAK,KAAK,GAAG,UAAW,EAAY,MACpC,KAAK,GAAG,eAAgB,EAAY,MACpC,EAAM,SAAS,iBAKjB,MAAO,SAAU,GAChB,KAAK,KAAO,CACZ,IAAI,GAAG,EAAG,CAEV,KAAK,SAAS,KAAK,KAAK,cACvB,KAAM,8BAaP,KAVA,KAAK,cAAc,MAAM,GACzB,KAAK,eAAe,MAAM,GAErB,KAAK,eACT,KAAK,2BAGN,KAAK,QAAU,EAAI,QAAQ,IAAI,WAAW,aAGrC,EAAI,EAAG,EAAI,KAAK,eAAe,OAAY,EAAJ,EAAO,IAClD,EAAQ,KAAK,eAAe,GAC5B,EAAM,UAAY,EAAM,MAAM,QAC9B,EAAM,MAAM,QAAU,EAAM,MAG7B,KAAK,EAAI,EAAG,EAAI,KAAK,eAAe,OAAY,EAAJ,EAAO,IAClD,EAAQ,KAAK,eAAe,GAC5B,KAAK,aAAa,EAAM,OAAO,GAC/B,EAAM,MAAM,QAAU,EAAM,SAE7B,MAAK,kBAGL,KAAK,MAAQ,KAAK,MAAM,KAAK,KAAK,OAClC,KAAK,oBAAsB,KAAK,4BAEhC,KAAK,KAAK,GAAG,UAAW,KAAK,SAAU,MACvC,KAAK,KAAK,GAAG,UAAW,KAAK,SAAU,MAEnC,KAAK,kBACR,KAAK,mBAGN,KAAK,cAGL,EAAI,KAAK,iBACT,KAAK,oBACL,KAAK,UAAU,GAAG,IAInB,SAAU,SAAU,GACnB,EAAI,IAAI,UAAW,KAAK,SAAU,MAClC,EAAI,IAAI,UAAW,KAAK,SAAU,MAElC,KAAK,gBAGL,KAAK,KAAK,SAAS,UAAY,KAAK,KAAK,SAAS,UAAU,QAAQ,wBAAyB,IAEzF,KAAK,qBACR,KAAK,4BAGC,MAAK,QAGZ,KAAK,gBACL,KAAK,cAAc,SACnB,KAAK,eAAe,SAEpB,KAAK,cAAc,cAEnB,KAAK,KAAO,MAGb,iBAAkB,SAAU,GAE3B,IADA,GAAI,GAAU,EACP,IAAY,EAAQ,OAC1B,EAAU,EAAQ,QAEnB,OAAO,IAAW,MAInB,aAAc,SAAU,EAAS,GAChC,IAAK,GAAI,GAAI,EAAQ,OAAS,EAAG,GAAK,EAAG,IACxC,GAAI,EAAQ,KAAO,EAElB,MADA,GAAQ,OAAO,EAAG,IACX,GAWV,2BAA4B,SAAU,EAAQ,GAK7C,IAJA,GAAI,GAAM,KAAK,KACX,EAAkB,KAAK,iBAC1B,EAAU,KAAK,MAAM,KAAK,KAAK,cAEzB,GAAK,GACN,EAAgB,GAAG,aAAa,EAAQ,EAAI,QAAQ,EAAO,YAAa,IADzD,OAOtB,sBAAuB,SAAU,GAChC,EAAE,OAAO,YAAc,EAAE,OAAO,SAGjC,kBAAmB,SAAU,GAC5B,IAAK,KAAK,cAAgB,EAAE,OAAO,YAAa,CAC/C,GAAI,GAAc,EAAE,OAAO,QAAU,EAAE,OAAO,OAAO,QAErD,MAAK,WAAW,EAAE,OAAQ,EAAE,UAAW,EAAE,QAErC,GACH,EAAE,OAAO,cAKZ,WAAY,SAAU,EAAO,EAAM,GAClC,EAAM,QAAU,EAChB,KAAK,YAAY,GAEjB,EAAM,QAAU,EAChB,KAAK,SAAS,IAGf,oBAAqB,SAAU,GAC9B,GAAI,GAAY,EAAE,OAAO,kBAClB,GAAE,OAAO,YACZ,GACH,KAAK,WAAW,EAAE,OAAQ,EAAW,EAAE,OAAO,UAOhD,aAAc,SAAU,EAAQ,EAAwB,GACvD,GAAI,GAAe,KAAK,cACvB,EAAkB,KAAK,iBACvB,EAAK,KAAK,cACV,EAAM,KAAK,KACX,EAAU,KAAK,MAAM,KAAK,KAAK,aAG5B,IACH,KAAK,2BAA2B,EAAQ,KAAK,SAI9C,IAEC,GAFG,EAAU,EAAO,SACpB,EAAU,EAAQ,QAMnB,KAFA,KAAK,aAAa,EAAS,GAEpB,IACN,EAAQ,cACR,EAAQ,mBAAoB,IAExB,EAAQ,MAAQ,KAGT,GAA0B,EAAQ,aAAe,GAE3D,EAAc,EAAQ,SAAS,KAAO,EAAS,EAAQ,SAAS,GAAK,EAAQ,SAAS,GAGtF,EAAa,EAAQ,OAAO,aAAa,EAAS,EAAI,QAAQ,EAAQ,SAAU,EAAQ,QACxF,EAAgB,EAAQ,OAAO,UAAU,EAAa,EAAI,QAAQ,EAAY,YAAa,EAAQ,QAGnG,KAAK,aAAa,EAAQ,SAAS,eAAgB,GACnD,EAAQ,SAAS,SAAS,KAAK,GAC/B,EAAY,SAAW,EAAQ,SAE3B,EAAQ,QAEX,EAAG,YAAY,GACV,GACJ,EAAG,SAAS,KAId,EAAQ,kBAAmB,EAG5B,EAAU,EAAQ,eAGZ,GAAO,UAGf,cAAe,SAAU,EAAI,GAC5B,KAAO,GAAK,CACX,GAAI,IAAO,EACV,OAAO,CAER,GAAM,EAAI,WAEX,OAAO,GAIR,KAAM,SAAU,EAAM,EAAM,GAC3B,GAAI,GAAQ,EAAK,gBAAiB,GAAE,cAAe,CAElD,GAAI,EAAK,eAAiB,KAAK,cAAc,EAAK,MAAM,MAAO,EAAK,cAAc,eACjF,MAED,GAAO,UAAY,EAGpB,EAAE,aAAa,UAAU,KAAK,KAAK,KAAM,EAAM,EAAM,IAItD,QAAS,SAAU,EAAM,GACxB,MAAO,GAAE,aAAa,UAAU,QAAQ,KAAK,KAAM,EAAM,IAAc,EAAE,aAAa,UAAU,QAAQ,KAAK,KAAM,UAAY,EAAM,IAItI,2BAA4B,SAAU,GACrC,GAAI,GAAa,EAAQ,gBAErB,EAAI,kBASR,OAPC,IADgB,GAAb,EACE,QACkB,IAAb,EACL,SAEA,QAGC,GAAI,GAAE,SAAU,KAAM,cAAgB,EAAa,gBAAiB,UAAW,iBAAmB,EAAG,SAAU,GAAI,GAAE,MAAM,GAAI,OAGvI,YAAa,WACZ,GAAI,GAAM,KAAK,KACX,EAAoB,KAAK,QAAQ,kBACjC,EAAsB,KAAK,QAAQ,oBACnC,EAAsB,KAAK,QAAQ,qBAGnC,GAAqB,IACxB,KAAK,GAAG,eAAgB,KAAK,gBAAiB,MAI3C,IACH,KAAK,GAAG,mBAAoB,KAAK,cAAe,MAChD,KAAK,GAAG,kBAAmB,KAAK,cAAe,MAC/C,EAAI,GAAG,UAAW,KAAK,cAAe,QAIxC,gBAAiB,SAAU,GAI1B,IAHA,GAAI,GAAU,EAAE,MACZ,EAAgB,EAE2B,IAAxC,EAAc,eAAe,QACnC,EAAgB,EAAc,eAAe,EAG1C,GAAc,QAAU,KAAK,UAChC,EAAc,cAAgB,EAAQ,aACtC,KAAK,QAAQ,kBAGb,EAAQ,WACE,KAAK,QAAQ,qBACvB,EAAQ,eAIL,EAAE,eAA6C,KAA5B,EAAE,cAAc,SACtC,KAAK,KAAK,WAAW,SAIvB,cAAe,SAAU,GACxB,GAAI,GAAM,KAAK,IACX,MAAK,mBAGL,KAAK,eACR,EAAI,YAAY,KAAK,eAElB,EAAE,MAAM,gBAAkB,GAAK,EAAE,QAAU,KAAK,cACnD,KAAK,cAAgB,GAAI,GAAE,QAAQ,EAAE,MAAM,gBAAiB,KAAK,QAAQ,gBACzE,EAAI,SAAS,KAAK,kBAIpB,cAAe,WACV,KAAK,gBACR,KAAK,KAAK,YAAY,KAAK,eAC3B,KAAK,cAAgB,OAIvB,cAAe,WACd,GAAI,GAAoB,KAAK,QAAQ,kBACpC,EAAsB,KAAK,QAAQ,oBACnC,EAAsB,KAAK,QAAQ,oBACnC,EAAM,KAAK,MAER,GAAqB,IACxB,KAAK,IAAI,eAAgB,KAAK,gBAAiB,MAE5C,IACH,KAAK,IAAI,mBAAoB,KAAK,cAAe,MACjD,KAAK,IAAI,kBAAmB,KAAK,cAAe,MAChD,EAAI,IAAI,UAAW,KAAK,cAAe,QAIzC,SAAU,WACJ,KAAK,OAGV,KAAK,sBAEL,KAAK,MAAQ,KAAK,MAAM,KAAK,KAAK,OAClC,KAAK,oBAAsB,KAAK,8BAGjC,SAAU,WACT,IAAI,KAAK,iBAAT,CAIA,GAAI,GAAY,KAAK,2BAErB,MAAK,iBAAiB,kCAAkC,KAAK,oBAAqB,KAAK,MAAM,KAAK,KAAK,cAAe,KAAK,MAAO,GAClI,KAAK,iBAAiB,6BAA6B,KAAM,KAAK,MAAM,KAAK,KAAK,OAAQ,GAEtF,KAAK,oBAAsB,IAI5B,yBAA0B,WACzB,GAAI,GAAU,KAAK,KAAK,KAAK,KAAK,cACjC,EAAU,KAAK,MAAM,KAAK,KAAK,cAC/B,EAAS,KAAK,QAAQ,iBACtB,EAAW,CAKU,mBAAX,KACV,EAAW,WAAc,MAAO,KAGY,OAAzC,KAAK,QAAQ,0BAChB,EAAU,KAAK,QAAQ,wBAA0B,GAElD,KAAK,SAAW,EAChB,KAAK,iBACL,KAAK,mBAGL,KAAK,GAAI,GAAO,EAAS,GAAQ,EAAS,IACzC,KAAK,cAAc,GAAQ,GAAI,GAAE,aAAa,EAAS,IACvD,KAAK,iBAAiB,GAAQ,GAAI,GAAE,aAAa,EAAS,GAI3D,MAAK,iBAAmB,GAAI,MAAK,eAAe,KAAM,EAAU,IAIjE,UAAW,SAAU,EAAO,GAC3B,GAGI,GAAa,EAHb,EAAe,KAAK,cACpB,EAAkB,KAAK,iBAC1B,EAAU,KAAK,MAAM,KAAK,KAAK,aAUhC,KAPI,KAAK,QAAQ,kBAChB,KAAK,oBAAoB,GAG1B,EAAM,GAAG,KAAK,0BAA2B,MAGlC,GAAQ,EAAS,IAAQ,CAC/B,EAAc,KAAK,KAAK,QAAQ,EAAM,YAAa,EAGnD,IAAI,GAAU,EAAa,GAAM,cAAc,EAC/C,IAAI,EAGH,MAFA,GAAQ,UAAU,GAClB,EAAM,SAAW,EACjB,MAKD,IADA,EAAU,EAAgB,GAAM,cAAc,GACjC,CACZ,GAAI,GAAS,EAAQ,QACjB,IACH,KAAK,aAAa,GAAS,EAK5B,IAAI,GAAa,GAAI,MAAK,eAAe,KAAM,EAAM,EAAS,EAC9D,GAAa,GAAM,UAAU,EAAY,KAAK,KAAK,QAAQ,EAAW,SAAU,IAChF,EAAQ,SAAW,EACnB,EAAM,SAAW,CAGjB,IAAI,GAAa,CACjB,KAAK,EAAI,EAAO,EAAG,EAAI,EAAO,MAAO,IACpC,EAAa,GAAI,MAAK,eAAe,KAAM,EAAG,GAC9C,EAAa,GAAG,UAAU,EAAY,KAAK,KAAK,QAAQ,EAAQ,YAAa,GAO9E,OALA,GAAO,UAAU,GAGjB,KAAK,2BAA2B,EAAS,GAEzC,OAID,EAAgB,GAAM,UAAU,EAAO,GAIxC,KAAK,iBAAiB,UAAU,GAChC,EAAM,SAAW,KAAK,kBASvB,sBAAuB,WACtB,KAAK,cAAc,UAAU,SAAU,GAClC,YAAa,GAAE,eAAiB,EAAE,kBACrC,EAAE,iBAML,SAAU,SAAU,GACnB,KAAK,OAAO,KAAK,GACZ,KAAK,gBACT,KAAK,cAAgB,WAAW,EAAE,KAAK,KAAK,cAAe,MAAO,OAGpE,cAAe,WACd,IAAK,GAAI,GAAI,EAAG,EAAI,KAAK,OAAO,OAAQ,IACvC,KAAK,OAAO,GAAG,KAAK,KAErB,MAAK,OAAO,OAAS,EACrB,aAAa,KAAK,eAClB,KAAK,cAAgB,MAItB,oBAAqB,WACpB,GAAI,GAAU,KAAK,MAAM,KAAK,KAAK,MAGnC,MAAK,gBAED,KAAK,MAAQ,GAAW,KAAK,oBAAoB,WAAW,KAAK,8BACpE,KAAK,kBAEL,KAAK,iBAAiB,kCAAkC,KAAK,oBAAqB,KAAK,MAAM,KAAK,KAAK,cAAe,KAAK,MAAO,KAAK,6BAEvI,KAAK,iBAAiB,KAAK,MAAO,IAExB,KAAK,MAAQ,GACvB,KAAK,kBAEL,KAAK,kBAAkB,KAAK,MAAO,IAEnC,KAAK,YAKP,0BAA2B,WAC1B,MAAK,MAAK,QAAQ,2BAEP,EAAE,QAAQ,OACb,KAAK,mBAAmB,KAAK,KAAK,aAGnC,KAAK,mBAAmB,KAAK,KAAK,YAAY,IAAI,IALjD,KAAK,oBAkBd,mBAAoB,SAAU,GAC7B,GAAI,GAAS,KAAK,OAWlB,OATe,UAAX,IACC,EAAO,YAAc,IACxB,EAAO,WAAW,IAAM,KAErB,EAAO,aAAe,IACzB,EAAO,WAAW,KAAO,MAIpB,GAIR,8BAA+B,SAAU,EAAO,GAC/C,GAAI,IAAe,EAClB,KAAK,cAAc,SAAS,OACtB,IAA+B,IAA3B,EAAW,YAAmB,CACxC,EAAW,WAEX,IAAI,GAAU,EAAW,oBACzB,MAAK,cAAc,YAAY,EAAQ,IACvC,KAAK,cAAc,YAAY,EAAQ,QAEvC,GAAW,eAWb,uBAAwB,SAAU,EAAO,GACxC,GAEI,GAFA,EAAS,EAAM,YACf,EAAI,CAKR,KAFA,EAAS,MAEF,EAAI,EAAO,OAAQ,IACzB,EAAQ,EAAO,GAEX,YAAiB,GAAE,WACtB,KAAK,uBAAuB,EAAO,GAIpC,EAAO,KAAK,EAGb,OAAO,IASR,oBAAqB,SAAU,GAC9B,GAAI,GAAO,EAAM,QAAQ,KAAO,KAAK,QAAQ,oBAC5C,cAAe,WACd,MAAO,IAER,mBAAoB,WACnB,OAAQ,KAIV,OAAO,KAKT,GAAE,mBAAmB,SACpB,mBAAoB,GAAI,GAAE,aAAa,GAAI,GAAE,QAAQ,KAAW,KAAW,GAAI,GAAE,OAAO,IAAU,QAGnG,EAAE,mBAAmB,SACpB,cAEC,gBAAiB,aAGjB,iBAAkB,SAAU,EAAmB,GAC9C,KAAK,iBAAiB,kCAAkC,KAAK,oBAAqB,KAAK,MAAM,KAAK,KAAK,cAAe,GACtH,KAAK,iBAAiB,6BAA6B,KAAM,EAAc,KAAK,6BAG5E,KAAK,KAAK,iBAEX,kBAAmB,SAAU,EAAmB,GAC/C,KAAK,iBAAiB,kCAAkC,KAAK,oBAAqB,KAAK,MAAM,KAAK,KAAK,cAAe,GACtH,KAAK,iBAAiB,6BAA6B,KAAM,EAAc,KAAK,6BAG5E,KAAK,KAAK,iBAEX,mBAAoB,SAAU,EAAO,GACpC,KAAK,8BAA8B,EAAO,KAI5C,gBAEC,gBAAiB,WAChB,KAAK,KAAK,SAAS,WAAa,wBAChC,KAAK,oBAGN,iBAAkB,SAAU,EAAmB,GAC9C,GAGI,GAHA,EAAS,KAAK,4BACd,EAAK,KAAK,cACb,EAAU,KAAK,MAAM,KAAK,KAAK,aAGhC,MAAK,aAAc,EAGnB,KAAK,iBAAiB,aAAa,EAAQ,EAAmB,EAAS,SAAU,GAChF,GAEI,GAFA,EAAW,EAAE,QACb,EAAW,EAAE,QAkBjB,KAfK,EAAO,SAAS,KACpB,EAAW,MAGR,EAAE,mBAAqB,EAAoB,IAAM,GACpD,EAAG,YAAY,GACf,EAAE,6BAA6B,KAAM,EAAc,KAGnD,EAAE,cACF,EAAE,6BAA6B,EAAU,EAAc,IAKnD,EAAI,EAAQ,OAAS,EAAG,GAAK,EAAG,IACpC,EAAI,EAAQ,GACP,EAAO,SAAS,EAAE,UACtB,EAAG,YAAY,KAMlB,KAAK,eAGL,KAAK,iBAAiB,0BAA0B,EAAQ,GAExD,EAAG,UAAU,SAAU,GAChB,YAAa,GAAE,gBAAkB,EAAE,OACxC,EAAE,gBAKJ,KAAK,iBAAiB,aAAa,EAAQ,EAAmB,EAAc,SAAU,GACrF,EAAE,kCAAkC,KAGrC,KAAK,aAAc,EAGnB,KAAK,SAAS,WAEb,KAAK,iBAAiB,aAAa,EAAQ,EAAmB,EAAS,SAAU,GAChF,EAAG,YAAY,GACf,EAAE,gBAGH,KAAK,mBAIP,kBAAmB,SAAU,EAAmB,GAC/C,KAAK,wBAAwB,KAAK,iBAAkB,EAAoB,EAAG,GAG3E,KAAK,iBAAiB,6BAA6B,KAAM,EAAc,KAAK,6BAE5E,KAAK,iBAAiB,kCAAkC,KAAK,oBAAqB,KAAK,MAAM,KAAK,KAAK,cAAe,EAAmB,KAAK,8BAG/I,mBAAoB,SAAU,EAAO,GACpC,GAAI,GAAK,KACL,EAAK,KAAK,aAEd,GAAG,SAAS,GACR,IAAe,IACd,EAAW,YAAc,GAE5B,EAAW,cACX,KAAK,eACL,KAAK,kBAEL,EAAM,QAAQ,KAAK,KAAK,mBAAmB,EAAW,cACtD,EAAM,cAEN,KAAK,SAAS,WACb,EAAG,YAAY,GACf,EAAM,cAEN,EAAG,oBAIJ,KAAK,eAEL,EAAG,kBACH,EAAG,wBAAwB,EAAY,KAAK,KAAK,aAAc,KAAK,WAOxE,wBAAyB,SAAU,EAAS,EAAmB,GAC9D,GAAI,GAAS,KAAK,4BACjB,EAAU,KAAK,MAAM,KAAK,KAAK,aAGhC,GAAQ,6CAA6C,EAAQ,EAAS,EAAoB,EAAG,EAE7F,IAAI,GAAK,IAGT,MAAK,eACL,EAAQ,0BAA0B,EAAQ,GAI1C,KAAK,SAAS,WAGb,GAA4B,IAAxB,EAAQ,YAAmB,CAC9B,GAAI,GAAI,EAAQ,SAAS,EAEzB,MAAK,aAAc,EACnB,EAAE,UAAU,EAAE,aACd,KAAK,aAAc,EACf,EAAE,aACL,EAAE,kBAGH,GAAQ,aAAa,EAAQ,EAAc,EAAS,SAAU,GAC7D,EAAE,kCAAkC,EAAQ,EAAS,EAAoB,IAG3E,GAAG,mBAIL,cAAe,WACV,KAAK,OACR,KAAK,KAAK,SAAS,UAAY,KAAK,KAAK,SAAS,UAAU,QAAQ,wBAAyB,KAE9F,KAAK,mBACL,KAAK,KAAK,iBAKX,aAAc,WAIb,EAAE,KAAK,QAAQ,SAAS,KAAK,gBAI/B,EAAE,mBAAqB,SAAU,GAChC,MAAO,IAAI,GAAE,mBAAmB,GC51C1B,IAAI,GAAgB,EAAE,cAAgB,EAAE,OAAO,QACrD,QAAS,EAAE,KAAK,UAAU,QAE1B,WAAY,SAAU,EAAO,EAAM,EAAG,GAErC,EAAE,OAAO,UAAU,WAAW,KAAK,KAAM,EAAK,EAAE,UAAY,EAAE,YAAe,GAAI,GAAE,OAAO,EAAG,IACjF,KAAM,KAAM,KAAM,EAAM,QAAQ,cAE5C,KAAK,OAAS,EACd,KAAK,MAAQ,EAEb,KAAK,YACL,KAAK,kBACL,KAAK,YAAc,EACnB,KAAK,kBAAmB,EACxB,KAAK,mBAAoB,EAEzB,KAAK,QAAU,GAAI,GAAE,aAEjB,GACH,KAAK,UAAU,GAEZ,GACH,KAAK,UAAU,IAKjB,mBAAoB,SAAU,EAAc,GAC3C,EAAe,KAEf,KAAK,GAAI,GAAI,KAAK,eAAe,OAAS,EAAG,GAAK,EAAG,IACpD,KAAK,eAAe,GAAG,mBAAmB,EAG3C,KAAK,GAAI,GAAI,KAAK,SAAS,OAAS,EAAG,GAAK,EAAG,IAC1C,GAAuB,KAAK,SAAS,GAAG,aAG5C,EAAa,KAAK,KAAK,SAAS,GAGjC,OAAO,IAIR,cAAe,WACd,MAAO,MAAK,aAIb,aAAc,SAAU,GASvB,IARA,GAKC,GALG,EAAgB,KAAK,eAAe,QACvC,EAAM,KAAK,OAAO,KAClB,EAAa,EAAI,cAAc,KAAK,SACpC,EAAO,KAAK,MAAQ,EACpB,EAAU,EAAI,UAIR,EAAc,OAAS,GAAK,EAAa,GAAM,CACrD,GACA,IAAI,KACJ,KAAK,EAAI,EAAG,EAAI,EAAc,OAAQ,IACrC,EAAc,EAAY,OAAO,EAAc,GAAG,eAEnD,GAAgB,EAGb,EAAa,EAChB,KAAK,OAAO,KAAK,QAAQ,KAAK,QAAS,GACf,GAAd,EACV,KAAK,OAAO,KAAK,QAAQ,KAAK,QAAS,EAAU,GAEjD,KAAK,OAAO,KAAK,UAAU,KAAK,QAAS,IAI3C,UAAW,WACV,GAAI,GAAS,GAAI,GAAE,YAEnB,OADA,GAAO,OAAO,KAAK,SACZ,GAGR,YAAa,WACZ,KAAK,kBAAmB,EACpB,KAAK,OACR,KAAK,QAAQ,OAKf,WAAY,WAKX,MAJI,MAAK,mBACR,KAAK,SAAW,KAAK,OAAO,QAAQ,mBAAmB,MACvD,KAAK,kBAAmB,GAElB,KAAK,SAAS,cAEtB,aAAc,WACb,MAAO,MAAK,SAAS,gBAItB,UAAW,SAAU,EAAM,GAE1B,KAAK,kBAAmB,EAExB,KAAK,mBAAoB,EACzB,KAAK,kBAAkB,GAEnB,YAAgB,GAAE,eAChB,IACJ,KAAK,eAAe,KAAK,GACzB,EAAK,SAAW,MAEjB,KAAK,aAAe,EAAK,cAEpB,GACJ,KAAK,SAAS,KAAK,GAEpB,KAAK,eAGF,KAAK,UACR,KAAK,SAAS,UAAU,GAAM,IAShC,kBAAmB,SAAU,GACvB,KAAK,WAET,KAAK,SAAW,EAAM,UAAY,EAAM,UAU1C,aAAc,WACb,GAAI,GAAS,KAAK,OAEd,GAAO,aACV,EAAO,WAAW,IAAM,IACxB,EAAO,WAAW,IAAM,KAErB,EAAO,aACV,EAAO,WAAW,KAAO,IACzB,EAAO,WAAW,KAAO,MAI3B,mBAAoB,WACnB,GAKI,GAAG,EAAO,EAAa,EALvB,EAAU,KAAK,SACf,EAAgB,KAAK,eACrB,EAAS,EACT,EAAS,EACT,EAAa,KAAK,WAItB,IAAmB,IAAf,EAAJ,CAQA,IAHA,KAAK,eAGA,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAC/B,EAAc,EAAQ,GAAG,QAEzB,KAAK,QAAQ,OAAO,GAEpB,GAAU,EAAY,IACtB,GAAU,EAAY,GAIvB,KAAK,EAAI,EAAG,EAAI,EAAc,OAAQ,IACrC,EAAQ,EAAc,GAGlB,EAAM,mBACT,EAAM,qBAGP,KAAK,QAAQ,OAAO,EAAM,SAE1B,EAAc,EAAM,SACpB,EAAa,EAAM,YAEnB,GAAU,EAAY,IAAM,EAC5B,GAAU,EAAY,IAAM,CAG7B,MAAK,QAAU,KAAK,SAAW,GAAI,GAAE,OAAO,EAAS,EAAY,EAAS,GAG1E,KAAK,mBAAoB,IAI1B,UAAW,SAAU,GAChB,IACH,KAAK,cAAgB,KAAK,QAC1B,KAAK,UAAU,IAEhB,KAAK,OAAO,cAAc,SAAS,OAGpC,8BAA+B,SAAU,EAAQ,EAAQ,GACxD,KAAK,aAAa,EAAQ,KAAK,OAAO,KAAK,aAAc,EAAU,EAClE,SAAU,GACT,GACC,GAAG,EADA,EAAU,EAAE,QAEhB,KAAK,EAAI,EAAQ,OAAS,EAAG,GAAK,EAAG,IACpC,EAAI,EAAQ,GAGR,EAAE,QACL,EAAE,QAAQ,GACV,EAAE,gBAIL,SAAU,GACT,GACC,GAAG,EADA,EAAgB,EAAE,cAEtB,KAAK,EAAI,EAAc,OAAS,EAAG,GAAK,EAAG,IAC1C,EAAK,EAAc,GACf,EAAG,QACN,EAAG,QAAQ,GACX,EAAG,kBAOR,6CAA8C,SAAU,EAAQ,EAAY,EAAmB,GAC9F,KAAK,aAAa,EAAQ,EAAc,EACvC,SAAU,GACT,EAAE,8BAA8B,EAAQ,EAAE,OAAO,KAAK,mBAAmB,EAAE,aAAa,QAAS,GAI7F,EAAE,mBAAqB,EAAoB,IAAM,GACpD,EAAE,cACF,EAAE,kCAAkC,EAAQ,EAAY,IAExD,EAAE,cAGH,EAAE,eAKL,0BAA2B,SAAU,EAAQ,GAC5C,KAAK,aAAa,EAAQ,KAAK,OAAO,KAAK,aAAc,EAAW,KAAM,SAAU,GACnF,EAAE,iBAIJ,6BAA8B,SAAU,EAAU,EAAW,GAC5D,KAAK,aAAa,EAAQ,KAAK,OAAO,KAAK,aAAe,EAAG,EAC5D,SAAU,GACT,GAAI,IAAc,EAAE,MAKpB,IAAK,GAAI,GAAI,EAAE,SAAS,OAAS,EAAG,GAAK,EAAG,IAAK,CAChD,GAAI,GAAK,EAAE,SAAS,EAEf,GAAO,SAAS,EAAG,WAIpB,IACH,EAAG,cAAgB,EAAG,YAEtB,EAAG,UAAU,GACT,EAAG,aACN,EAAG,eAIL,EAAE,OAAO,cAAc,SAAS,MAGlC,SAAU,GACT,EAAE,UAAU,MAKf,kCAAmC,SAAU,GAE5C,IAAK,GAAI,GAAI,KAAK,SAAS,OAAS,EAAG,GAAK,EAAG,IAAK,CACnD,GAAI,GAAK,KAAK,SAAS,EACnB,GAAG,gBACN,EAAG,UAAU,EAAG,qBACT,GAAG,eAIZ,GAAI,EAAY,IAAM,KAAK,MAE1B,IAAK,GAAI,GAAI,KAAK,eAAe,OAAS,EAAG,GAAK,EAAG,IACpD,KAAK,eAAe,GAAG,uBAGxB,KAAK,GAAI,GAAI,KAAK,eAAe,OAAS,EAAG,GAAK,EAAG,IACpD,KAAK,eAAe,GAAG,kCAAkC,IAK5D,iBAAkB,WACb,KAAK,gBACR,KAAK,UAAU,KAAK,qBACb,MAAK,gBAKd,kCAAmC,SAAU,EAAgB,EAAY,EAAW,GACnF,GAAI,GAAG,CACP,MAAK,aAAa,EAAgB,EAAa,EAAG,EAAY,EAC7D,SAAU,GAET,IAAK,EAAI,EAAE,SAAS,OAAS,EAAG,GAAK,EAAG,IACvC,EAAI,EAAE,SAAS,GACV,GAAiB,EAAa,SAAS,EAAE,WAC7C,EAAE,OAAO,cAAc,YAAY,GAC/B,EAAE,aACL,EAAE,gBAKN,SAAU,GAET,IAAK,EAAI,EAAE,eAAe,OAAS,EAAG,GAAK,EAAG,IAC7C,EAAI,EAAE,eAAe,GAChB,GAAiB,EAAa,SAAS,EAAE,WAC7C,EAAE,OAAO,cAAc,YAAY,GAC/B,EAAE,aACL,EAAE,kBAcR,aAAc,SAAU,EAAiB,EAAkB,EAAiB,EAAiB,GAC5F,GAEI,GAAG,EAFH,EAAgB,KAAK,eACrB,EAAO,KAAK,KAYhB,IATwB,GAApB,IACC,GACH,EAAgB,MAEb,GAAoB,IAAS,GAChC,EAAiB,OAIR,EAAP,GAAkC,EAAP,EAC9B,IAAK,EAAI,EAAc,OAAS,EAAG,GAAK,EAAG,IAC1C,EAAI,EAAc,GACd,EAAE,mBACL,EAAE,qBAEC,EAAgB,WAAW,EAAE,UAChC,EAAE,aAAa,EAAiB,EAAkB,EAAiB,EAAiB,IAOxF,gBAAiB,WAEhB,MAAO,MAAK,eAAe,OAAS,GAAK,KAAK,eAAe,GAAG,cAAgB,KAAK,cC1YvF,GAAE,OAAO,SACR,YAAa,WACZ,GAAI,GAAS,KAAK,QAAQ,OAG1B,OAFA,MAAK,WAAW,GAChB,KAAK,QAAQ,QAAU,EAChB,MAGR,YAAa,WACZ,MAAO,MAAK,WAAW,KAAK,QAAQ,YChBtC,EAAE,aAAe,SAAU,GAC1B,KAAK,UAAY,EACjB,KAAK,YAAc,EAAW,EAC9B,KAAK,SACL,KAAK,iBAGN,EAAE,aAAa,WAEd,UAAW,SAAU,EAAK,GACzB,GAAI,GAAI,KAAK,UAAU,EAAM,GACzB,EAAI,KAAK,UAAU,EAAM,GACzB,EAAO,KAAK,MACZ,EAAM,EAAK,GAAK,EAAK,OACrB,EAAO,EAAI,GAAK,EAAI,OACpB,EAAQ,EAAE,KAAK,MAAM,EAEzB,MAAK,aAAa,GAAS,EAE3B,EAAK,KAAK,IAGX,aAAc,SAAU,EAAK,GAC5B,KAAK,aAAa,GAClB,KAAK,UAAU,EAAK,IAIrB,aAAc,SAAU,EAAK,GAC5B,GAKI,GAAG,EALH,EAAI,KAAK,UAAU,EAAM,GACzB,EAAI,KAAK,UAAU,EAAM,GACzB,EAAO,KAAK,MACZ,EAAM,EAAK,GAAK,EAAK,OACrB,EAAO,EAAI,GAAK,EAAI,MAKxB,WAFO,MAAK,aAAa,EAAE,KAAK,MAAM,IAEjC,EAAI,EAAG,EAAM,EAAK,OAAY,EAAJ,EAAS,IACvC,GAAI,EAAK,KAAO,EAQf,MANA,GAAK,OAAO,EAAG,GAEH,IAAR,SACI,GAAI,IAGL,GAMV,WAAY,SAAU,EAAI,GACzB,GAAI,GAAG,EAAG,EAAG,EAAK,EAAK,EAAM,EACzB,EAAO,KAAK,KAEhB,KAAK,IAAK,GAAM,CACf,EAAM,EAAK,EAEX,KAAK,IAAK,GAGT,IAFA,EAAO,EAAI,GAEN,EAAI,EAAG,EAAM,EAAK,OAAY,EAAJ,EAAS,IACvC,EAAU,EAAG,KAAK,EAAS,EAAK,IAC5B,IACH,IACA,OAOL,cAAe,SAAU,GACxB,GAEI,GAAG,EAAG,EAAG,EAAK,EAAM,EAAK,EAAK,EAF9B,EAAI,KAAK,UAAU,EAAM,GACzB,EAAI,KAAK,UAAU,EAAM,GAEzB,EAAc,KAAK,aACnB,EAAgB,KAAK,YACrB,EAAU,IAEd,KAAK,EAAI,EAAI,EAAQ,EAAI,GAAT,EAAY,IAE3B,GADA,EAAM,KAAK,MAAM,GAGhB,IAAK,EAAI,EAAI,EAAQ,EAAI,GAAT,EAAY,IAE3B,GADA,EAAO,EAAI,GAGV,IAAK,EAAI,EAAG,EAAM,EAAK,OAAY,EAAJ,EAAS,IACvC,EAAM,EAAK,GACX,EAAO,KAAK,QAAQ,EAAY,EAAE,KAAK,MAAM,IAAO,IACzC,EAAP,GACK,GAAR,GAAqC,OAAZ,KACzB,EAAgB,EAChB,EAAU,EAOhB,OAAO,IAGR,UAAW,SAAU,GACpB,GAAI,GAAQ,KAAK,MAAM,EAAI,KAAK,UAChC,OAAO,UAAS,GAAS,EAAQ,GAGlC,QAAS,SAAU,EAAG,GACrB,GAAI,GAAK,EAAG,EAAI,EAAE,EACd,EAAK,EAAG,EAAI,EAAE,CAClB,OAAO,GAAK,EAAK,EAAK,ICzFvB,WACA,EAAE,WAQD,WAAY,SAAU,EAAK,GAC1B,GAAI,GAAK,EAAG,GAAG,IAAM,EAAG,GAAG,IAC1B,EAAK,EAAG,GAAG,IAAM,EAAG,GAAG,GACxB,OAAQ,IAAM,EAAI,IAAM,EAAG,GAAG,KAAO,GAAM,EAAI,IAAM,EAAG,GAAG,MAU5D,iCAAkC,SAAU,EAAU,GACrD,GAGC,GAAG,EAAI,EAHJ,EAAO,EACV,EAAQ,KACR,IAGD,KAAK,EAAI,EAAQ,OAAS,EAAG,GAAK,EAAG,IACpC,EAAK,EAAQ,GACb,EAAI,KAAK,WAAW,EAAI,GAEpB,EAAI,IACP,EAAU,KAAK,GAKZ,EAAI,IACP,EAAO,EACP,EAAQ,GAIV,QAAS,SAAU,EAAO,UAAW,IAWtC,gBAAiB,SAAU,EAAU,GACpC,GAAI,MACH,EAAI,KAAK,iCAAiC,EAAU,EAErD,OAAI,GAAE,UACL,EACC,EAAoB,OACnB,KAAK,iBAAiB,EAAS,GAAI,EAAE,UAAW,EAAE,YAEpD,EACC,EAAoB,OACnB,KAAK,iBAAiB,EAAE,SAAU,EAAS,IAAK,EAAE,cAI5C,EAAS,KAWnB,cAAe,SAAU,GAExB,GAKC,GALG,GAAS,EAAO,GAAS,EAC5B,GAAS,EAAO,GAAS,EACzB,EAAW,KAAM,EAAW,KAC5B,EAAW,KAAM,EAAW,KAC5B,EAAQ,KAAM,EAAQ,IAGvB,KAAK,EAAI,EAAQ,OAAS,EAAG,GAAK,EAAG,IAAK,CACzC,GAAI,GAAK,EAAQ,IACb,KAAW,GAAS,EAAG,IAAM,KAChC,EAAW,EACX,EAAS,EAAG,MAET,KAAW,GAAS,EAAG,IAAM,KAChC,EAAW,EACX,EAAS,EAAG,MAET,KAAW,GAAS,EAAG,IAAM,KAChC,EAAW,EACX,EAAS,EAAG,MAET,KAAW,GAAS,EAAG,IAAM,KAChC,EAAW,EACX,EAAS,EAAG,KAIV,IAAW,GACd,EAAQ,EACR,EAAQ,IAER,EAAQ,EACR,EAAQ,EAGT,IAAI,MAAQ,OAAO,KAAK,iBAAiB,EAAO,GAAQ,GACnD,KAAK,iBAAiB,EAAO,GAAQ,GAC1C,OAAO,QAKV,EAAE,cAAc,SACf,cAAe,WACd,GAEC,GAAG,EAFA,EAAe,KAAK,qBACvB,IAGD,KAAK,EAAI,EAAa,OAAS,EAAG,GAAK,EAAG,IACzC,EAAI,EAAa,GAAG,YACpB,EAAO,KAAK,EAGb,OAAO,GAAE,UAAU,cAAc,MC/JnC,EAAE,cAAc,SAEf,KAAgB,EAAV,KAAK,GACX,sBAAuB,GACvB,kBAAmB,EAEnB,sBAAwB,GACxB,mBAAoB,GACpB,oBAAqB,EAErB,wBAAyB,EAGzB,SAAU,WACT,GAAI,KAAK,OAAO,cAAgB,OAAQ,KAAK,OAAO,iBAApD,CAIA,GAIC,GAJG,EAAe,KAAK,mBAAmB,MAAM,GAChD,EAAQ,KAAK,OACb,EAAM,EAAM,KACZ,EAAS,EAAI,mBAAmB,KAAK,QAGtC,MAAK,OAAO,cACZ,KAAK,OAAO,YAAc,KAItB,EAAa,QAAU,KAAK,wBAC/B,EAAY,KAAK,sBAAsB,EAAa,OAAQ,IAE5D,EAAO,GAAK,GACZ,EAAY,KAAK,sBAAsB,EAAa,OAAQ,IAG7D,KAAK,mBAAmB,EAAc,KAGvC,WAAY,SAAU,GAEjB,KAAK,OAAO,mBAGhB,KAAK,qBAAqB,GAE1B,KAAK,OAAO,YAAc,OAG3B,sBAAuB,SAAU,EAAO,GACvC,GAIC,GAAG,EAJA,EAAgB,KAAK,OAAO,QAAQ,2BAA6B,KAAK,uBAAyB,EAAI,GACtG,EAAY,EAAgB,KAAK,KACjC,EAAY,KAAK,KAAO,EACxB,IAOD,KAJA,EAAY,KAAK,IAAI,EAAW,IAEhC,EAAI,OAAS,EAER,EAAI,EAAO,EAAJ,EAAW,IACtB,EAAQ,KAAK,kBAAoB,EAAI,EACrC,EAAI,GAAK,GAAI,GAAE,MAAM,EAAS,EAAI,EAAY,KAAK,IAAI,GAAQ,EAAS,EAAI,EAAY,KAAK,IAAI,IAAQ,QAG1G,OAAO,IAGR,sBAAuB,SAAU,EAAO,GACvC,GAMC,GANG,EAA6B,KAAK,OAAO,QAAQ,2BACpD,EAAY,EAA6B,KAAK,mBAC9C,EAAa,EAA6B,KAAK,sBAC/C,EAAe,EAA6B,KAAK,oBAAsB,KAAK,KAC5E,EAAQ,EACR,IAMD,KAHA,EAAI,OAAS,EAGR,EAAI,EAAO,GAAK,EAAG,IAGf,EAAJ,IACH,EAAI,GAAK,GAAI,GAAE,MAAM,EAAS,EAAI,EAAY,KAAK,IAAI,GAAQ,EAAS,EAAI,EAAY,KAAK,IAAI,IAAQ,UAE1G,GAAS,EAAa,EAAgB,KAAJ,EAClC,GAAa,EAAe,CAE7B,OAAO,IAGR,uBAAwB,WACvB,GAIC,GAAG,EAJA,EAAQ,KAAK,OAChB,EAAM,EAAM,KACZ,EAAK,EAAM,cACX,EAAe,KAAK,mBAAmB,MAAM,EAM9C,KAHA,EAAM,aAAc,EAEpB,KAAK,WAAW,GACX,EAAI,EAAa,OAAS,EAAG,GAAK,EAAG,IACzC,EAAI,EAAa,GAEjB,EAAG,YAAY,GAEX,EAAE,qBACL,EAAE,UAAU,EAAE,0BACP,GAAE,oBAEN,EAAE,iBACL,EAAE,gBAAgB,GAGf,EAAE,aACL,EAAI,YAAY,EAAE,kBACX,GAAE,WAIX,GAAM,KAAK,gBACV,QAAS,KACT,QAAS,IAEV,EAAM,aAAc,EACpB,EAAM,YAAc,QAKtB,EAAE,yBAA2B,EAAE,cAAc,QAC5C,mBAAoB,SAAU,EAAc,GAC3C,GAIC,GAAG,EAAG,EAAK,EAJR,EAAQ,KAAK,OAChB,EAAM,EAAM,KACZ,EAAK,EAAM,cACX,EAAa,KAAK,OAAO,QAAQ,wBAOlC,KAJA,EAAM,aAAc,EAIf,EAAI,EAAG,EAAI,EAAa,OAAQ,IACpC,EAAS,EAAI,mBAAmB,EAAU,IAC1C,EAAI,EAAa,GAGjB,EAAM,GAAI,GAAE,UAAU,KAAK,QAAS,GAAS,GAC7C,EAAI,SAAS,GACb,EAAE,WAAa,EAGf,EAAE,mBAAqB,EAAE,QACzB,EAAE,UAAU,GACR,EAAE,iBACL,EAAE,gBAAgB,KAGnB,EAAG,SAAS,EAEb,MAAK,WAAW,IAEhB,EAAM,aAAc,EACpB,EAAM,KAAK,cACV,QAAS,KACT,QAAS,KAIX,qBAAsB,WACrB,KAAK,4BAKP,EAAE,cAAc,SAEf,mBAAoB,SAAU,EAAc,GAC3C,GASC,GAAG,EAAG,EAAK,EAAS,EAAW,EAT5B,EAAK,KACR,EAAQ,KAAK,OACb,EAAM,EAAM,KACZ,EAAK,EAAM,cACX,EAAkB,KAAK,QACvB,EAAe,EAAI,mBAAmB,GACtC,EAAM,EAAE,KAAK,IACb,EAAa,EAAE,UAAW,KAAK,OAAO,QAAQ,0BAC9C,EAAkB,EAAW,OAuB9B,KApBwB,SAApB,IACH,EAAkB,EAAE,mBAAmB,UAAU,QAAQ,yBAAyB,SAG/E,GAEH,EAAW,QAAU,EAGrB,EAAW,WAAa,EAAW,WAAa,IAAM,+BAGtD,EAAW,QAAU,EAGtB,EAAM,aAAc,EAKf,EAAI,EAAG,EAAI,EAAa,OAAQ,IACpC,EAAI,EAAa,GAEjB,EAAS,EAAI,mBAAmB,EAAU,IAG1C,EAAM,GAAI,GAAE,UAAU,EAAiB,GAAS,GAChD,EAAI,SAAS,GACb,EAAE,WAAa,EAIX,IACH,EAAU,EAAI,MACd,EAAY,EAAQ,iBAAmB,GACvC,EAAQ,MAAM,gBAAkB,EAChC,EAAQ,MAAM,iBAAmB,GAI9B,EAAE,iBACL,EAAE,gBAAgB,KAEf,EAAE,aACL,EAAE,cAIH,EAAG,SAAS,GAER,EAAE,SACL,EAAE,QAAQ,EAQZ,KAJA,EAAM,eACN,EAAM,kBAGD,EAAI,EAAa,OAAS,EAAG,GAAK,EAAG,IACzC,EAAS,EAAI,mBAAmB,EAAU,IAC1C,EAAI,EAAa,GAGjB,EAAE,mBAAqB,EAAE,QACzB,EAAE,UAAU,GAER,EAAE,aACL,EAAE,cAIC,IACH,EAAM,EAAE,WACR,EAAU,EAAI,MACd,EAAQ,MAAM,iBAAmB,EAEjC,EAAI,UAAU,QAAS,IAGzB,MAAK,WAAW,IAEhB,EAAM,aAAc,EAEpB,WAAW,WACV,EAAM,gBACN,EAAM,KAAK,cACV,QAAS,EACT,QAAS,KAER,MAGJ,qBAAsB,SAAU,GAC/B,GAOC,GAAG,EAAG,EAAK,EAAS,EAAW,EAP5B,EAAK,KACR,EAAQ,KAAK,OACb,EAAM,EAAM,KACZ,EAAK,EAAM,cACX,EAAe,EAAc,EAAI,uBAAuB,KAAK,QAAS,EAAY,KAAM,EAAY,QAAU,EAAI,mBAAmB,KAAK,SAC1I,EAAe,KAAK,mBAAmB,MAAM,GAC7C,EAAM,EAAE,KAAK,GAQd,KALA,EAAM,aAAc,EACpB,EAAM,kBAGN,KAAK,WAAW,GACX,EAAI,EAAa,OAAS,EAAG,GAAK,EAAG,IACzC,EAAI,EAAa,GAGZ,EAAE,qBAKP,EAAE,aAGF,EAAE,UAAU,EAAE,0BACP,GAAE,mBAGT,GAAgB,EACZ,EAAE,UACL,EAAE,QAAQ,GACV,GAAgB,GAEb,EAAE,cACL,EAAE,cACF,GAAgB,GAEb,GACH,EAAG,YAAY,GAIZ,IACH,EAAM,EAAE,WACR,EAAU,EAAI,MACd,EAAY,EAAQ,iBAAmB,GACvC,EAAQ,MAAM,iBAAmB,EACjC,EAAI,UAAU,QAAS,KAIzB,GAAM,aAAc,EAEpB,WAAW,WAEV,GAAI,GAAuB,CAC3B,KAAK,EAAI,EAAa,OAAS,EAAG,GAAK,EAAG,IACzC,EAAI,EAAa,GACb,EAAE,YACL,GAKF,KAAK,EAAI,EAAa,OAAS,EAAG,GAAK,EAAG,IACzC,EAAI,EAAa,GAEZ,EAAE,aAIH,EAAE,aACL,EAAE,cAEC,EAAE,iBACL,EAAE,gBAAgB,GAGf,EAAuB,GAC1B,EAAG,YAAY,GAGhB,EAAI,YAAY,EAAE,kBACX,GAAE,WAEV,GAAM,gBACN,EAAM,KAAK,gBACV,QAAS,EACT,QAAS,KAER,QAKL,EAAE,mBAAmB,SAEpB,YAAa,KAEb,WAAY,WACX,KAAK,YAAY,MAAM,KAAM,YAG9B,iBAAkB,WACjB,KAAK,KAAK,GAAG,QAAS,KAAK,mBAAoB,MAE3C,KAAK,KAAK,QAAQ,eACrB,KAAK,KAAK,GAAG,YAAa,KAAK,qBAAsB,MAGtD,KAAK,KAAK,GAAG,UAAW,KAAK,uBAAwB,MAEhD,EAAE,QAAQ,OACd,KAAK,KAAK,YAAY,OAOxB,oBAAqB,WACpB,KAAK,KAAK,IAAI,QAAS,KAAK,mBAAoB,MAChD,KAAK,KAAK,IAAI,YAAa,KAAK,qBAAsB,MACtD,KAAK,KAAK,IAAI,WAAY,KAAK,oBAAqB,MACpD,KAAK,KAAK,IAAI,UAAW,KAAK,uBAAwB,MAItD,KAAK;EAKN,qBAAsB,WAChB,KAAK,MAIV,KAAK,KAAK,GAAG,WAAY,KAAK,oBAAqB,OAGpD,oBAAqB,SAAU,GAE1B,EAAE,QAAQ,SAAS,KAAK,KAAK,SAAU,sBAI3C,KAAK,KAAK,IAAI,WAAY,KAAK,oBAAqB,MACpD,KAAK,YAAY,KAGlB,mBAAoB,WAEnB,KAAK,eAGN,YAAa,SAAU,GAClB,KAAK,aACR,KAAK,YAAY,WAAW,IAI9B,uBAAwB,WACnB,KAAK,aACR,KAAK,YAAY,0BAKnB,iBAAkB,SAAU,GACvB,EAAM,aACT,KAAK,cAAc,YAAY,GAE3B,EAAM,aACT,EAAM,cAGH,EAAM,iBACT,EAAM,gBAAgB,GAGvB,KAAK,KAAK,YAAY,EAAM,kBACrB,GAAM,eC/chB,EAAE,mBAAmB,SASpB,gBAAiB,SAAU,GAoB1B,MAnBK,GAEM,YAAkB,GAAE,mBAC9B,EAAS,EAAO,iBAAiB,qBACvB,YAAkB,GAAE,WAC9B,EAAS,EAAO,QACN,YAAkB,GAAE,cAC9B,EAAS,EAAO,qBACN,YAAkB,GAAE,SAC9B,GAAU,IARV,EAAS,KAAK,iBAAiB,qBAUhC,KAAK,4BAA4B,GACjC,KAAK,wBAGD,KAAK,QAAQ,kBAChB,KAAK,gCAAgC,GAG/B,MAQR,4BAA6B,SAAU,GACtC,GAAI,GAAI,CAGR,KAAK,IAAM,GAOV,IADA,EAAS,EAAO,GAAI,SACb,GACN,EAAO,kBAAmB,EAC1B,EAAS,EAAO,UAWnB,gCAAiC,SAAU,GAC1C,GAAI,GAAI,CAER,KAAK,IAAM,GACV,EAAQ,EAAO,GAGX,KAAK,SAAS,IAEjB,EAAM,QAAQ,KAAK,oBAAoB,OAM3C,EAAE,OAAO,SAQR,mBAAoB,SAAU,EAAS,GACtC,GAAI,GAAO,KAAK,QAAQ,IAcxB,OAZA,GAAE,WAAW,EAAM,GAEnB,KAAK,QAAQ,GAMT,GAA2B,KAAK,UACnC,KAAK,SAAS,OAAO,gBAAgB,MAG/B","file":"dist/leaflet.markercluster.js"} \ No newline at end of file diff --git a/sut/frontend/build/leaflet/smooth_bounce/BouncingMotion.js b/sut/frontend/build/leaflet/smooth_bounce/BouncingMotion.js new file mode 100644 index 0000000..b57377e --- /dev/null +++ b/sut/frontend/build/leaflet/smooth_bounce/BouncingMotion.js @@ -0,0 +1,307 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +var _leaflet = require("leaflet"); + +var _BouncingOptions = _interopRequireDefault(require("./BouncingOptions.js")); + +var _Cache = _interopRequireDefault(require("./Cache.js")); + +var _Styles = _interopRequireDefault(require("./Styles.js")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : {"default": obj}; +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, {value: value, enumerable: true, configurable: true, writable: true}); + } else { + obj[key] = value; + } + return obj; +} + +var bonceEndEvent = 'bounceend'; + +var BouncingMotion = /*#__PURE__*/function () { + // TODO: check if this cache working right (keys don't need prefix) + + /** + * Constructor. + * + * @param marker {Marker} marker + * @param position {Point} marker current position on the map canvas + * @param bouncingOptions {BouncingOptions} options of bouncing animation + */ + function BouncingMotion(marker, position, bouncingOptions) { + _classCallCheck(this, BouncingMotion); + + _defineProperty(this, "marker", void 0); + + _defineProperty(this, "position", void 0); + + _defineProperty(this, "bouncingOptions", void 0); + + _defineProperty(this, "moveSteps", void 0); + + _defineProperty(this, "moveDelays", void 0); + + _defineProperty(this, "resizeSteps", void 0); + + _defineProperty(this, "resizeDelays", void 0); + + _defineProperty(this, "isBouncing", false); + + _defineProperty(this, "iconStyles", void 0); + + _defineProperty(this, "shadowStyles", void 0); + + _defineProperty(this, "bouncingAnimationPlaying", false); + + this.marker = marker; + this.position = position; + this.updateBouncingOptions(bouncingOptions); + } + + _createClass(BouncingMotion, [{ + key: "updateBouncingOptions", + value: function updateBouncingOptions(options) { + this.bouncingOptions = options instanceof _BouncingOptions["default"] ? options : this.bouncingOptions.override(options); + var _this$bouncingOptions = this.bouncingOptions, + bounceHeight = _this$bouncingOptions.bounceHeight, + bounceSpeed = _this$bouncingOptions.bounceSpeed, + elastic = _this$bouncingOptions.elastic; + this.moveSteps = BouncingMotion.cache.get("moveSteps_".concat(bounceHeight), function () { + return BouncingMotion.calculateSteps(bounceHeight); + }); + this.moveDelays = BouncingMotion.cache.get("moveDelays_".concat(bounceHeight, "_").concat(bounceSpeed), function () { + return BouncingMotion.calculateDelays(bounceHeight, bounceSpeed); + }); + + if (elastic) { + var _this$bouncingOptions2 = this.bouncingOptions, + contractHeight = _this$bouncingOptions2.contractHeight, + contractSpeed = _this$bouncingOptions2.contractSpeed; + this.resizeSteps = BouncingMotion.cache.get("resizeSteps_".concat(contractHeight), function () { + return BouncingMotion.calculateSteps(contractHeight); + }); + this.resizeDelays = BouncingMotion.cache.get("resizeDelays_".concat(contractHeight, "_").concat(contractSpeed), function () { + return BouncingMotion.calculateDelays(contractHeight, contractSpeed); + }); + } + + this.recalculateMotion(this.position); + } + }, { + key: "resetStyles", + value: function resetStyles(marker) { + this.iconStyles = _Styles["default"].ofMarker(marker); + + if (marker._shadow) { + this.shadowStyles = _Styles["default"].parse(marker._shadow.style.cssText); + } + } + /** + * Recalculates bouncing motion for new marker position. + * @param position {Point} new marker position + */ + + }, { + key: "recalculateMotion", + value: function recalculateMotion(position) { + this.position = position; + } + /** + * @param times {number|null} + */ + + }, { + key: "bounce", + value: function bounce() { + var times = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + + if (this.bouncingAnimationPlaying) { + this.isBouncing = true; + return; + } + + this.isBouncing = true; + this.bouncingAnimationPlaying = true; + this.move(times); + } + }, { + key: "stopBouncing", + value: function stopBouncing() { + this.isBouncing = false; + } + /** + * @param times {number|null} + */ + + }, { + key: "move", + value: function move() { + var _this = this; + + var times = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + + if (times !== null) { + if (!--times) { + this.isBouncing = false; // this is the last bouncing + + this.bouncingAnimationPlaying = false; + } + } + /* Launch timeouts for every step of the movement animation */ + + + var i = this.moveSteps.length; + + while (i--) { + setTimeout(function (step) { + return _this.makeMoveStep(step); + }, this.moveDelays[i], this.moveSteps[i]); + } + + setTimeout(function () { + return _this.afterMove(times); + }, this.moveDelays[this.moveSteps.length - 1]); + } + }, { + key: "afterMove", + value: function afterMove(times) { + var _this2 = this; + + if (this.isBouncing) { + setTimeout(function () { + return _this2.move(times); + }, this.bouncingOptions.bounceSpeed); + } else { + this.bouncingAnimationPlaying = false; + this.marker.fire(bonceEndEvent); + } + } + /** + * @param step {number} + */ + + }, { + key: "makeMoveStep", + value: function makeMoveStep(step) { + this.marker._icon.style.cssText = this.iconStyles.toString(); + + if (this.marker._shadow) { + this.marker._shadow.style.cssText = this.shadowStyles.toString(); + } + } + /** + * Returns calculated array of animation steps. This function used to calculate both movement + * and resizing animations. + * + * @param height {number} height of movement or resizing (px) + * + * @return {number[]} array of animation steps + */ + + }], [{ + key: "calculateSteps", + value: function calculateSteps(height) { + /* Calculate the sequence of animation steps: + * steps = [1 .. height] concat [height-1 .. 0] + */ + var i = 1; + var steps = []; + + while (i <= height) { + steps.push(i++); + } + + i = height; + + while (i--) { + steps.push(i); + } + + return steps; + } + /** + * Returns calculated array of delays between animation start and the steps of animation. This + * function used to calculate both movement and resizing animations. Element with index i of + * this array contains the delay in milliseconds between animation start and the step number i. + * + * @param height {number} height of movement or resizing (px) + * @param speed {number} speed coefficient + * + * @return {number[]} array of delays before steps of animation + */ + + }, { + key: "calculateDelays", + value: function calculateDelays(height, speed) { + // Calculate delta time for bouncing animation + // Delta time to movement in one direction + var deltas = []; // time between steps of animation + + deltas[height] = speed; + deltas[0] = 0; + var i = height; + + while (--i) { + deltas[i] = Math.round(speed / (height - i)); + } // Delta time for movement in two directions + + + i = height; + + while (i--) { + deltas.push(deltas[i]); + } // Calculate move delays (cumulated deltas) + // TODO: instead of deltas.lenght write bounceHeight * 2 - 1 + + + var delays = []; // delays before steps from beginning of animation + + var totalDelay = 0; + + for (i = 0; i < deltas.length; i++) { + totalDelay += deltas[i]; + delays.push(totalDelay); + } + + return delays; + } + }]); + + return BouncingMotion; +}(); + +exports["default"] = BouncingMotion; + +_defineProperty(BouncingMotion, "cache", new _Cache["default"]()); \ No newline at end of file diff --git a/sut/frontend/build/leaflet/smooth_bounce/BouncingMotion3D.js b/sut/frontend/build/leaflet/smooth_bounce/BouncingMotion3D.js new file mode 100644 index 0000000..e3a623c --- /dev/null +++ b/sut/frontend/build/leaflet/smooth_bounce/BouncingMotion3D.js @@ -0,0 +1,373 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +var _leaflet = require("leaflet"); + +var _BouncingMotion2 = _interopRequireDefault(require("./BouncingMotion.js")); + +var _Matrix3D = _interopRequireDefault(require("./Matrix3D.js")); + +var _line = require("./line.js"); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : {"default": obj}; +} + +function _typeof(obj) { + "@babel/helpers - typeof"; + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof(obj); +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +function _get(target, property, receiver) { + if (typeof Reflect !== "undefined" && Reflect.get) { + _get = Reflect.get; + } else { + _get = function _get(target, property, receiver) { + var base = _superPropBase(target, property); + if (!base) return; + var desc = Object.getOwnPropertyDescriptor(base, property); + if (desc.get) { + return desc.get.call(receiver); + } + return desc.value; + }; + } + return _get(target, property, receiver || target); +} + +function _superPropBase(object, property) { + while (!Object.prototype.hasOwnProperty.call(object, property)) { + object = _getPrototypeOf(object); + if (object === null) break; + } + return object; +} + +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf(subClass, superClass); +} + +function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); +} + +function _createSuper(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct(); + return function _createSuperInternal() { + var Super = _getPrototypeOf(Derived), result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn(this, result); + }; +} + +function _possibleConstructorReturn(self, call) { + if (call && (_typeof(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized(self); +} + +function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; +} + +function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Date.prototype.toString.call(Reflect.construct(Date, [], function () { + })); + return true; + } catch (e) { + return false; + } +} + +function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, {value: value, enumerable: true, configurable: true, writable: true}); + } else { + obj[key] = value; + } + return obj; +} + +var moveMatrixFormat = _Matrix3D["default"].identity().toFormat('d1', 'd2'); + +var resizeMatrixFormat = _Matrix3D["default"].identity().toFormat('b2', 'd1', 'd2'); + +var BouncingMotion3D = /*#__PURE__*/function (_BouncingMotion) { + _inherits(BouncingMotion3D, _BouncingMotion); + + var _super = _createSuper(BouncingMotion3D); + + /** + * Constructor. + * + * @param marker {Marker} marker + * @param position {Point} marker current position on the map canvas + * @param bouncingOptions {BouncingOptions} options of bouncing animation + */ + function BouncingMotion3D(marker, position, bouncingOptions) { + var _this; + + _classCallCheck(this, BouncingMotion3D); + + _this = _super.call(this, marker, position, bouncingOptions); + + _defineProperty(_assertThisInitialized(_this), "iconMoveTransforms", void 0); + + _defineProperty(_assertThisInitialized(_this), "iconResizeTransforms", void 0); + + _defineProperty(_assertThisInitialized(_this), "shadowMoveTransforms", void 0); + + _defineProperty(_assertThisInitialized(_this), "shadowResizeTransforms", void 0); + + _this.recalculateMotion(position); + + return _this; + } + + _createClass(BouncingMotion3D, [{ + key: "recalculateMotion", + value: function recalculateMotion(position) { + var _this$marker$getIcon, _this$marker$getIcon$, _this$marker, _this$marker$_iconObj, + _this$marker$_iconObj2; + + _get(_getPrototypeOf(BouncingMotion3D.prototype), "recalculateMotion", this).call(this, position); + + var iconHeight = ((_this$marker$getIcon = this.marker.getIcon()) === null || _this$marker$getIcon === void 0 ? void 0 : (_this$marker$getIcon$ = _this$marker$getIcon.options) === null || _this$marker$getIcon$ === void 0 ? void 0 : _this$marker$getIcon$.iconSize[1]) || ((_this$marker = this.marker) === null || _this$marker === void 0 ? void 0 : (_this$marker$_iconObj = _this$marker._iconObj) === null || _this$marker$_iconObj === void 0 ? void 0 : (_this$marker$_iconObj2 = _this$marker$_iconObj.options) === null || _this$marker$_iconObj2 === void 0 ? void 0 : _this$marker$_iconObj2.iconSize[1]); + var x = position.x, + y = position.y; + var _this$bouncingOptions = this.bouncingOptions, + bounceHeight = _this$bouncingOptions.bounceHeight, + contractHeight = _this$bouncingOptions.contractHeight, + shadowAngle = _this$bouncingOptions.shadowAngle; + this.iconMoveTransforms = BouncingMotion3D.calculateIconMoveTransforms(x, y, bounceHeight); + this.iconResizeTransforms = BouncingMotion3D.calculateResizeTransforms(x, y, iconHeight, contractHeight); + + if (this.marker._shadow) { + var _this$marker$getIcon2, _this$marker$getIcon3; + + this.shadowMoveTransforms = BouncingMotion3D.calculateShadowMoveTransforms(x, y, bounceHeight, shadowAngle); + var shadowHeight = (_this$marker$getIcon2 = this.marker.getIcon()) === null || _this$marker$getIcon2 === void 0 ? void 0 : (_this$marker$getIcon3 = _this$marker$getIcon2.options) === null || _this$marker$getIcon3 === void 0 ? void 0 : _this$marker$getIcon3.shadowSize[1]; + this.shadowResizeTransforms = BouncingMotion3D.calculateResizeTransforms(x, y, shadowHeight, contractHeight); + } + } + }, { + key: "afterMove", + value: function afterMove(times) { + if (this.bouncingOptions.elastic) { + this.resize(times); + } else { + _get(_getPrototypeOf(BouncingMotion3D.prototype), "afterMove", this).call(this, times); + } + } + }, { + key: "resize", + value: function resize(times) { + var _this2 = this; + + var nbResizeSteps = this.resizeSteps.length; + var i = nbResizeSteps; + + while (i--) { + setTimeout(function (step) { + return _this2.makeResizeStep(step); + }, this.resizeDelays[i], this.resizeSteps[i]); + } + + setTimeout(function () { + if (!_this2.isBouncing) { + _this2.bouncingAnimationPlaying = false; + } + }, this.resizeDelays[this.resizeSteps.length]); + setTimeout(function () { + if (_this2.isBouncing) { + _this2.move(times); + } else { + _this2.marker.fire('bounceend'); + } + }, this.resizeDelays[nbResizeSteps - 1]); + } + }, { + key: "makeMoveStep", + value: function makeMoveStep(step) { + this.marker._icon.style.cssText = this.iconStyles.withTransform(this.iconMoveTransforms[step]).toString(); + + if (this.marker._shadow) { + this.marker._shadow.style.cssText = this.shadowStyles.withTransform(this.shadowMoveTransforms[step]).toString(); + } + } + /** + * @param step {number} + */ + + }, { + key: "makeResizeStep", + value: function makeResizeStep(step) { + this.marker._icon.style.cssText = this.iconStyles.withTransform(this.iconResizeTransforms[step]).toString(); + + if (this.marker._shadow && this.bouncingOptions.shadowAngle) { + this.marker._shadow.style.cssText = this.shadowStyles.withTransform(this.shadowResizeTransforms[step]).toString(); + } + } + /** + * Returns calculated array of transformation definitions for the animation of icon movement. + * Function defines one transform for every pixel of shift of the icon from it's original y + * position. + * + * @param x {number} x coordinate of original position of the marker + * @param y {number} y coordinate of original position of the marker + * @param bounceHeight {number} height of bouncing (px) + * + * @return {string[]} array of transformation definitions + */ + + }], [{ + key: "calculateIconMoveTransforms", + value: function calculateIconMoveTransforms(x, y, bounceHeight) { + var transforms = []; + var deltaY = bounceHeight + 1; // Use fast inverse while loop to fill the array + + while (deltaY--) { + transforms[deltaY] = moveMatrixFormat(x, y - deltaY); + } + + return transforms; + } + /** + * Returns calculated array of transformation definitions for the animation of icon resizing. + * Function defines one transform for every pixel of resizing of marker from it's original + * height. + * + * @param x {number} x coordinate of original position of marker + * @param y {number} y coordinate of original position of marker + * @param height {number} original marker height (px) + * @param contractHeight {number} height of marker contraction (px) + * + * @return {string[]} array of transformation definitions + */ + + }, { + key: "calculateResizeTransforms", + value: function calculateResizeTransforms(x, y, height, contractHeight) { + var transforms = []; + var deltaHeight = contractHeight + 1; // Use fast inverse while loop to fill the array + + while (deltaHeight--) { + transforms[deltaHeight] = resizeMatrixFormat((height - deltaHeight) / height, x, y + deltaHeight); + } + + return transforms; + } + /** + * Returns calculated array of transformation definitions for the animation of shadow movement. + * Function defines one transform for every pixel of shift of the shadow from it's original + * position. + * + * @param x {number} x coordinate of original position of marker + * @param y {number} y coordinate of original position of marker + * @param bounceHeight {number} height of bouncing (px) + * @param angle {number|null} shadow inclination angle, if null shadow don't moves from it's + * initial position (radians) + * + * @return {string[]} array of transformation definitions + */ + + }, { + key: "calculateShadowMoveTransforms", + value: function calculateShadowMoveTransforms(x, y, bounceHeight) { + var angle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; + // TODO: check this method to know if bounceHeight + 1 is normal + var transforms = []; + var deltaY = bounceHeight + 1; + var points = []; + + if (angle != null) { + // important: 0 is not null + points = (0, _line.calculateLine)(x, y, angle, bounceHeight + 1); + } else { + for (var i = 0; i <= bounceHeight; i++) { + points[i] = [x, y]; + } + } // Use fast inverse while loop to fill the array + + + while (deltaY--) { + transforms[deltaY] = moveMatrixFormat(points[deltaY][0], points[deltaY][1]); + } + + return transforms; + } + }]); + + return BouncingMotion3D; +}(_BouncingMotion2["default"]); + +exports["default"] = BouncingMotion3D; \ No newline at end of file diff --git a/sut/frontend/build/leaflet/smooth_bounce/BouncingMotionCss3.js b/sut/frontend/build/leaflet/smooth_bounce/BouncingMotionCss3.js new file mode 100644 index 0000000..9d2bb65 --- /dev/null +++ b/sut/frontend/build/leaflet/smooth_bounce/BouncingMotionCss3.js @@ -0,0 +1,481 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +var _leaflet = require("leaflet"); + +var _line = require("./line.js"); + +require("./bouncing.css"); + +var _BouncingOptions = _interopRequireDefault(require("./BouncingOptions.js")); + +var _Styles = _interopRequireDefault(require("./Styles.js")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : {"default": obj}; +} + +function _slicedToArray(arr, i) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); +} + +function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + return arr2; +} + +function _iterableToArrayLimit(arr, i) { + var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; + if (_i == null) return; + var _arr = []; + var _n = true; + var _d = false; + var _s, _e; + try { + for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) _i["return"](); + } finally { + if (_d) throw _e; + } + } + return _arr; +} + +function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", {writable: false}); + return Constructor; +} + +function _classPrivateFieldInitSpec(obj, privateMap, value) { + _checkPrivateRedeclaration(obj, privateMap); + privateMap.set(obj, value); +} + +function _checkPrivateRedeclaration(obj, privateCollection) { + if (privateCollection.has(obj)) { + throw new TypeError("Cannot initialize the same private elements twice on an object"); + } +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, {value: value, enumerable: true, configurable: true, writable: true}); + } else { + obj[key] = value; + } + return obj; +} + +function _classPrivateFieldGet(receiver, privateMap) { + var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); + return _classApplyDescriptorGet(receiver, descriptor); +} + +function _classApplyDescriptorGet(receiver, descriptor) { + if (descriptor.get) { + return descriptor.get.call(receiver); + } + return descriptor.value; +} + +function _classPrivateFieldSet(receiver, privateMap, value) { + var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); + _classApplyDescriptorSet(receiver, descriptor, value); + return value; +} + +function _classExtractFieldDescriptor(receiver, privateMap, action) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to " + action + " private field on non-instance"); + } + return privateMap.get(receiver); +} + +function _classApplyDescriptorSet(receiver, descriptor, value) { + if (descriptor.set) { + descriptor.set.call(receiver, value); + } else { + if (!descriptor.writable) { + throw new TypeError("attempted to set read only private field"); + } + descriptor.value = value; + } +} + +var animationNamePrefix = 'l-smooth-marker-bouncing-'; +var moveAnimationName = animationNamePrefix + 'move'; +var contractAnimationName = animationNamePrefix + 'contract'; +/* + * CSS3 animation runs faster than transform-based animation. We need to reduce speed in order + * to be compatible with old API. + */ + +var speedCoefficient = 0.8; + +/** + * Removes and then resets required classes on the HTML element. + * Used as hack to restart CSS3 animation. + * + * @param element {HTMLElement} HTML element + * @param classes {string[]} names of classes + */ + +function resetClasses(element, classes) { + classes.forEach(function (className) { + return _leaflet.DomUtil.removeClass(element, className); + }); + void element.offsetWidth; + classes.forEach(function (className) { + return _leaflet.DomUtil.addClass(element, className); + }); +} + +var _lastAnimationName = /*#__PURE__*/new WeakMap(); + +var _classes = /*#__PURE__*/new WeakMap(); + +var _eventCounter = /*#__PURE__*/new WeakMap(); + +var _times = /*#__PURE__*/new WeakMap(); + +var _listener = /*#__PURE__*/new WeakMap(); + +var BouncingMotionCss3 = /*#__PURE__*/function () { + /** + * Constructor. + * + * @param marker {Marker} marker + * @param position {Point} marker current position on the map canvas + * @param bouncingOptions {BouncingOptions} options of bouncing animation + */ + function BouncingMotionCss3(marker, position, bouncingOptions) { + var _this = this; + + _classCallCheck(this, BouncingMotionCss3); + + _defineProperty(this, "marker", void 0); + + _defineProperty(this, "position", void 0); + + _defineProperty(this, "bouncingOptions", void 0); + + _defineProperty(this, "isBouncing", false); + + _defineProperty(this, "iconStyles", void 0); + + _defineProperty(this, "shadowStyles", void 0); + + _defineProperty(this, "bouncingAnimationPlaying", false); + + _classPrivateFieldInitSpec(this, _lastAnimationName, { + writable: true, + value: contractAnimationName + }); + + _classPrivateFieldInitSpec(this, _classes, { + writable: true, + value: ['bouncing'] + }); + + _classPrivateFieldInitSpec(this, _eventCounter, { + writable: true, + value: void 0 + }); + + _classPrivateFieldInitSpec(this, _times, { + writable: true, + value: void 0 + }); + + _classPrivateFieldInitSpec(this, _listener, { + writable: true, + value: function value(event) { + return _this.onAnimationEnd(event); + } + }); + + this.marker = marker; + this.position = position; + this.updateBouncingOptions(bouncingOptions); + } + + _createClass(BouncingMotionCss3, [{ + key: "updateBouncingOptions", + value: function updateBouncingOptions(options) { + this.bouncingOptions = options instanceof _BouncingOptions["default"] ? options : this.bouncingOptions.override(options); + + if (this.bouncingOptions.elastic) { + _classPrivateFieldSet(this, _lastAnimationName, contractAnimationName); + + var index = _classPrivateFieldGet(this, _classes).indexOf('simple'); + + if (index > -1) { + _classPrivateFieldGet(this, _classes).splice(index, 1); + } + + if (this.marker._icon) { + _leaflet.DomUtil.removeClass(this.marker._icon, 'simple'); + } + } else { + _classPrivateFieldSet(this, _lastAnimationName, moveAnimationName); + + _classPrivateFieldGet(this, _classes).push('simple'); + } + + if (this.marker._icon) { + this.resetStyles(this.marker); + } + } + }, { + key: "onAnimationEnd", + value: function onAnimationEnd(event) { + var _this2 = this; + + if (event.animationName === _classPrivateFieldGet(this, _lastAnimationName)) { + var _this$eventCounter, _this$eventCounter2; + + _classPrivateFieldSet(this, _eventCounter, (_this$eventCounter = _classPrivateFieldGet(this, _eventCounter), _this$eventCounter2 = _this$eventCounter++, _this$eventCounter)), _this$eventCounter2; + + _classPrivateFieldSet(this, _eventCounter, _classPrivateFieldGet(this, _eventCounter) % 2); + + if (!_classPrivateFieldGet(this, _eventCounter)) { + var _this$times; + + if (this.isBouncing && (_classPrivateFieldGet(this, _times) === null || _classPrivateFieldSet(this, _times, (_this$times = _classPrivateFieldGet(this, _times), --_this$times)))) { + resetClasses(this.marker._icon, _classPrivateFieldGet(this, _classes)); + + if (this.marker._shadow && this.bouncingOptions.shadowAngle) { + resetClasses(this.marker._shadow, _classPrivateFieldGet(this, _classes)); + } + } else { + _classPrivateFieldGet(this, _classes).forEach(function (className) { + _leaflet.DomUtil.removeClass(_this2.marker._icon, className); + + if (_this2.marker._shadow) { + _leaflet.DomUtil.removeClass(_this2.marker._shadow, className); + } + }); + + this.bouncingAnimationPlaying = false; + this.marker.fire('bounceend'); + } + } + } + } + }, { + key: "resetStyles", + value: function resetStyles(marker) { + var _this$marker$getIcon, + _this$marker$getIcon$, + _this$marker, + _this$marker$_iconObj, + _this$marker$_iconObj2, + _this3 = this; + + this.marker = marker; + this.iconStyles = _Styles["default"].ofMarker(marker); + + if (marker._shadow) { + this.shadowStyles = _Styles["default"].parse(marker._shadow.style.cssText); + } + + var iconHeight = ((_this$marker$getIcon = this.marker.getIcon()) === null || _this$marker$getIcon === void 0 ? void 0 : (_this$marker$getIcon$ = _this$marker$getIcon.options) === null || _this$marker$getIcon$ === void 0 ? void 0 : _this$marker$getIcon$.iconSize[1]) || ((_this$marker = this.marker) === null || _this$marker === void 0 ? void 0 : (_this$marker$_iconObj = _this$marker._iconObj) === null || _this$marker$_iconObj === void 0 ? void 0 : (_this$marker$_iconObj2 = _this$marker$_iconObj.options) === null || _this$marker$_iconObj2 === void 0 ? void 0 : _this$marker$_iconObj2.iconSize[1]); + var iconAnimationParams = BouncingMotionCss3.animationParams(this.position, this.bouncingOptions, iconHeight); + this.iconStyles = this.iconStyles.withStyles(iconAnimationParams); + this.marker._icon.style.cssText = this.iconStyles.toString(); + + if (this.bouncingAnimationPlaying) { + resetClasses(this.marker._icon, _classPrivateFieldGet(this, _classes)); + + this.marker._icon.addEventListener('animationend', _classPrivateFieldGet(this, _listener)); + } + + var _this$bouncingOptions = this.bouncingOptions, + bounceHeight = _this$bouncingOptions.bounceHeight, + contractHeight = _this$bouncingOptions.contractHeight, + shadowAngle = _this$bouncingOptions.shadowAngle; + + if (this.marker._shadow) { + if (shadowAngle) { + var _this$marker$getIcon2, _this$marker$getIcon3; + + var _this$position = this.position, + x = _this$position.x, + y = _this$position.y; + var points = (0, _line.calculateLine)(x, y, shadowAngle, bounceHeight + 1); + + var _points$bounceHeight = _slicedToArray(points[bounceHeight], 2), + posXJump = _points$bounceHeight[0], + posYJump = _points$bounceHeight[1]; + + var shadowHeight = (_this$marker$getIcon2 = this.marker.getIcon()) === null || _this$marker$getIcon2 === void 0 ? void 0 : (_this$marker$getIcon3 = _this$marker$getIcon2.options) === null || _this$marker$getIcon3 === void 0 ? void 0 : _this$marker$getIcon3.shadowSize[1]; + var shadowScaleContract = BouncingMotionCss3.contractScale(shadowHeight, contractHeight); + this.shadowStyles = this.shadowStyles.withStyles(iconAnimationParams).withStyles({ + '--pos-x-jump': "".concat(posXJump, "px"), + '--pos-y-jump': "".concat(posYJump, "px"), + '--scale-contract': shadowScaleContract + }); + this.marker._shadow.style.cssText = this.shadowStyles.toString(); + + if (this.bouncingAnimationPlaying) { + resetClasses(this.marker._shadow, _classPrivateFieldGet(this, _classes)); + } + } else { + _classPrivateFieldGet(this, _classes).forEach(function (className) { + _leaflet.DomUtil.removeClass(_this3.marker._shadow, className); + }); + } + } + } + }, { + key: "bounce", + value: function bounce() { + var times = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + + _classPrivateFieldSet(this, _times, times); + + this.isBouncing = true; + + if (this.bouncingAnimationPlaying) { + return; + } + + _classPrivateFieldSet(this, _eventCounter, 0); + + this.bouncingAnimationPlaying = true; + resetClasses(this.marker._icon, _classPrivateFieldGet(this, _classes)); + + if (this.marker._shadow && this.bouncingOptions.shadowAngle) { + resetClasses(this.marker._shadow, _classPrivateFieldGet(this, _classes)); + } + + this.marker._icon.addEventListener('animationend', _classPrivateFieldGet(this, _listener)); + } + }, { + key: "stopBouncing", + value: function stopBouncing() { + this.isBouncing = false; + } + /** + * Calculates parameters of CSS3 animation of bouncing. + * + * @param position {Point} marker current position on the map canvas + * @param bouncingOptions {BouncingOptions} options of bouncing animation + * @param height {number} icons height + * @return {object} CSS3 animation parameters + */ + + }], [{ + key: "animationParams", + value: function animationParams(position, bouncingOptions, height) { + var x = position.x, + y = position.y; + var bounceHeight = bouncingOptions.bounceHeight, + contractHeight = bouncingOptions.contractHeight, + bounceSpeed = bouncingOptions.bounceSpeed, + contractSpeed = bouncingOptions.contractSpeed; + var scaleContract = BouncingMotionCss3.contractScale(height, contractHeight); + var durationJump = BouncingMotionCss3.calculateDuration(bounceHeight, bounceSpeed); + var durationContract = BouncingMotionCss3.calculateDuration(contractHeight, contractSpeed); + var delays = [0, durationJump, durationJump * 2, durationJump * 2 + durationContract]; + return { + '--pos-x': "".concat(x, "px"), + '--pos-y': "".concat(y, "px"), + '--pos-y-jump': "".concat(y - bounceHeight, "px"), + '--pos-y-contract': "".concat(y + contractHeight, "px"), + '--scale-contract': scaleContract, + '--duration-jump': "".concat(durationJump, "ms"), + '--duration-contract': "".concat(durationContract, "ms"), + '--delays': "0ms, ".concat(delays[1], "ms, ").concat(delays[2], "ms, ").concat(delays[3], "ms") + }; + } + /** + * Calculates scale of contracting. + * + * @param {number} height original height + * @param {number} contractHeight how much it must contract + * @return {number} contracting scale between 0 and 1 + */ + + }, { + key: "contractScale", + value: function contractScale(height, contractHeight) { + return (height - contractHeight) / height; + } + /** + * Calculates duration of animation. + * + * @param height {number} height of movement or resizing (px) + * @param speed {number} speed coefficient + * + * @return {number} duration of animation (ms) + */ + + }, { + key: "calculateDuration", + value: function calculateDuration(height, speed) { + var duration = Math.round(speed * speedCoefficient); + var i = height; + + while (--i) { + duration += Math.round(speed / (height - i)); + } + + return duration; + } + }]); + + return BouncingMotionCss3; +}(); + +exports["default"] = BouncingMotionCss3; \ No newline at end of file diff --git a/sut/frontend/build/leaflet/smooth_bounce/BouncingMotionSimple.js b/sut/frontend/build/leaflet/smooth_bounce/BouncingMotionSimple.js new file mode 100644 index 0000000..c4ee740 --- /dev/null +++ b/sut/frontend/build/leaflet/smooth_bounce/BouncingMotionSimple.js @@ -0,0 +1,267 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +var _BouncingMotion2 = _interopRequireDefault(require("./BouncingMotion.js")); + +var _line = require("./line.js"); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : {"default": obj}; +} + +function _typeof(obj) { + "@babel/helpers - typeof"; + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof(obj); +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +function _get(target, property, receiver) { + if (typeof Reflect !== "undefined" && Reflect.get) { + _get = Reflect.get; + } else { + _get = function _get(target, property, receiver) { + var base = _superPropBase(target, property); + if (!base) return; + var desc = Object.getOwnPropertyDescriptor(base, property); + if (desc.get) { + return desc.get.call(receiver); + } + return desc.value; + }; + } + return _get(target, property, receiver || target); +} + +function _superPropBase(object, property) { + while (!Object.prototype.hasOwnProperty.call(object, property)) { + object = _getPrototypeOf(object); + if (object === null) break; + } + return object; +} + +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf(subClass, superClass); +} + +function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); +} + +function _createSuper(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct(); + return function _createSuperInternal() { + var Super = _getPrototypeOf(Derived), result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn(this, result); + }; +} + +function _possibleConstructorReturn(self, call) { + if (call && (_typeof(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized(self); +} + +function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; +} + +function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Date.prototype.toString.call(Reflect.construct(Date, [], function () { + })); + return true; + } catch (e) { + return false; + } +} + +function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, {value: value, enumerable: true, configurable: true, writable: true}); + } else { + obj[key] = value; + } + return obj; +} + +var BouncingMotionSimple = /*#__PURE__*/function (_BouncingMotion) { + _inherits(BouncingMotionSimple, _BouncingMotion); + + var _super = _createSuper(BouncingMotionSimple); + + /** + * Constructor. + * + * @param marker {Marker} marker + * @param position {Point} marker current position on the map canvas + * @param bouncingOptions {BouncingOptions} options of bouncing animation + */ + function BouncingMotionSimple(marker, position, bouncingOptions) { + var _this; + + _classCallCheck(this, BouncingMotionSimple); + + _this = _super.call(this, marker, position, bouncingOptions); + + _defineProperty(_assertThisInitialized(_this), "iconMovePoints", void 0); + + _defineProperty(_assertThisInitialized(_this), "shadowMovePoints", void 0); + + _this.recalculateMotion(position); + + return _this; + } + + _createClass(BouncingMotionSimple, [{ + key: "recalculateMotion", + value: function recalculateMotion(position) { + _get(_getPrototypeOf(BouncingMotionSimple.prototype), "recalculateMotion", this).call(this, position); + + var x = position.x, + y = position.y; + var _this$bouncingOptions = this.bouncingOptions, + bounceHeight = _this$bouncingOptions.bounceHeight, + shadowAngle = _this$bouncingOptions.shadowAngle; + this.iconMovePoints = BouncingMotionSimple.calculateIconMovePoints(x, y, bounceHeight); + this.shadowMovePoints = BouncingMotionSimple.calculateShadowMovePoints(x, y, bounceHeight, shadowAngle); + } + }, { + key: "makeMoveStep", + value: function makeMoveStep(step) { + _get(_getPrototypeOf(BouncingMotionSimple.prototype), "makeMoveStep", this).call(this, step); + + this.marker._icon.style.left = this.iconMovePoints[step][0] + 'px'; + this.marker._icon.style.top = this.iconMovePoints[step][1] + 'px'; + + if (this.marker._shadow) { + this.marker._shadow.style.left = this.shadowMovePoints[step][0] + 'px'; + this.marker._shadow.style.top = this.shadowMovePoints[step][1] + 'px'; + } + } + /** + * Returns calculated array of points for icon movement. Used to animate markers in browsers + * that doesn't support 'transform' attribute. + * + * @param x {number} x coordinate of original position of the marker + * @param y {number} y coordinate of original position of the marker + * @param bounceHeight {number} height of bouncing (px) + * + * @return {[number, number][]} array of points + */ + + }], [{ + key: "calculateIconMovePoints", + value: function calculateIconMovePoints(x, y, bounceHeight) { + var deltaHeight = bounceHeight + 1; + var points = []; // Use fast inverse while loop to fill the array + + while (deltaHeight--) { + points[deltaHeight] = [x, y - deltaHeight]; + } + + return points; + } + /** + * Returns calculated array of points for shadow movement. Used to animate markers in browsers + * that doesn't support 'transform' attribute. + * + * @param x {number} x coordinate of original position of the marker + * @param y {number} y coordinate of original position of the marker + * @param bounceHeight {number} height of bouncing (px) + * @param angle {number} shadow inclination angle, if null shadow don't moves from it's initial + * position (radians) + * + * @return {[number, number][]} array of points + */ + + }, { + key: "calculateShadowMovePoints", + value: function calculateShadowMovePoints(x, y, bounceHeight, angle) { + if (angle != null) { + // important: 0 is not null + return (0, _line.calculateLine)(x, y, angle, bounceHeight + 1); + } else { + var points = []; + + for (var i = 0; i <= bounceHeight; i++) { + points[i] = [x, y]; + } + + return points; + } + } + }]); + + return BouncingMotionSimple; +}(_BouncingMotion2["default"]); + +exports["default"] = BouncingMotionSimple; \ No newline at end of file diff --git a/sut/frontend/build/leaflet/smooth_bounce/BouncingOptions.js b/sut/frontend/build/leaflet/smooth_bounce/BouncingOptions.js new file mode 100644 index 0000000..6a377a0 --- /dev/null +++ b/sut/frontend/build/leaflet/smooth_bounce/BouncingOptions.js @@ -0,0 +1,105 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", {writable: false}); + return Constructor; +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, {value: value, enumerable: true, configurable: true, writable: true}); + } else { + obj[key] = value; + } + return obj; +} + +var BouncingOptions = /*#__PURE__*/function () { + /** + * How high marker can bounce (px) + * @type {number} + */ + + /** + * How much marker can contract (px) + * @type {number} + */ + + /** + * Bouncing speed coefficient + * @type {number} + */ + + /** + * Contracting speed coefficient + * @type {number} + */ + + /** + * Shadow inclination angle(radians); null to cancel shadow movement + * @type {number} + */ + + /** + * Activate contract animation + * @type {boolean} + */ + + /** + * Many markers can bounce in the same time + * @type {boolean} + */ + function BouncingOptions(options) { + _classCallCheck(this, BouncingOptions); + + _defineProperty(this, "bounceHeight", 15); + + _defineProperty(this, "contractHeight", 12); + + _defineProperty(this, "bounceSpeed", 52); + + _defineProperty(this, "contractSpeed", 52); + + _defineProperty(this, "shadowAngle", -Math.PI / 4); + + _defineProperty(this, "elastic", true); + + _defineProperty(this, "exclusive", false); + + options && Object.assign(this, options); + } + + _createClass(BouncingOptions, [{ + key: "override", + value: function override(options) { + return Object.assign(new BouncingOptions(this), options); + } + }]); + + return BouncingOptions; +}(); + +exports["default"] = BouncingOptions; \ No newline at end of file diff --git a/sut/frontend/build/leaflet/smooth_bounce/Cache.js b/sut/frontend/build/leaflet/smooth_bounce/Cache.js new file mode 100644 index 0000000..c1361be --- /dev/null +++ b/sut/frontend/build/leaflet/smooth_bounce/Cache.js @@ -0,0 +1,65 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, {value: value, enumerable: true, configurable: true, writable: true}); + } else { + obj[key] = value; + } + return obj; +} + +var Cache = /*#__PURE__*/function () { + function Cache() { + _classCallCheck(this, Cache); + + _defineProperty(this, "cache", {}); + } + + _createClass(Cache, [{ + key: "get", + + /** + * If item with supplied {@code key} is present in cache, returns it, otherwise executes + * {@code supplier} function and caches the result. + * + * @param key {String} key of the cache + * @param supplier {function} item supplier + * @return {Object} item + */ + value: function get(key, supplier) { + return this.cache[key] || (this.cache[key] = supplier.apply()); + } + }]); + + return Cache; +}(); + +exports["default"] = Cache; \ No newline at end of file diff --git a/sut/frontend/build/leaflet/smooth_bounce/MarkerPrototypeExt.js b/sut/frontend/build/leaflet/smooth_bounce/MarkerPrototypeExt.js new file mode 100644 index 0000000..a0e80ad --- /dev/null +++ b/sut/frontend/build/leaflet/smooth_bounce/MarkerPrototypeExt.js @@ -0,0 +1,121 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +var _leaflet = require("leaflet"); + +var _BouncingOptions = _interopRequireDefault(require("./BouncingOptions.js")); + +var _Orchestration = _interopRequireDefault(require("./Orchestration.js")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : {"default": obj}; +} + +var oldSetPos = _leaflet.Marker.prototype._setPos; +var oldOnAdd = _leaflet.Marker.prototype.onAdd; +var oldSetIcon = _leaflet.Marker.prototype.setIcon; +var _default = { + /** Bouncing options shared by all markers. */ + _bouncingOptions: new _BouncingOptions["default"](), + _orchestration: new _Orchestration["default"](), + + /** + * Registers options of bouncing animation for this marker. After registration of options for + * this marker, it will ignore changes of default options. Function automatically recalculates + * animation steps and delays. + * + * @param options {BouncingOptions|object} options object + * @return {Marker} this marker + */ + setBouncingOptions: function setBouncingOptions(options) { + this._bouncingMotion.updateBouncingOptions(options); + + return this; + }, + + /** + * Returns true if this marker is bouncing. If this marker is not bouncing returns false. + * @return {boolean} true if marker is bouncing, false if not + */ + isBouncing: function isBouncing() { + return this._bouncingMotion.isBouncing; + }, + + /** + * Starts bouncing of this marker. + * @param times {number|null} number of times the marker must to bounce + * @return {Marker} this marker + */ + bounce: function bounce() { + var times = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + + this._bouncingMotion.bounce(times); + + var exclusive = this._bouncingMotion.bouncingOptions.exclusive; + + _leaflet.Marker.prototype._orchestration.addBouncingMarker(this, exclusive); + + return this; + }, + + /** + * Stops bouncing of this marker. + * Note: the bouncing not stops immediately after the call of this method. + * Instead, the animation is executed until marker returns to it's original position and takes + * it's full size. + * + * @return {Marker} this marker + */ + stopBouncing: function stopBouncing() { + this._bouncingMotion.stopBouncing(); + + _leaflet.Marker.prototype._orchestration.removeBouncingMarker(this); + + return this; + }, + + /** + * Starts/stops bouncing of this marker. + * @return {Marker} marker + */ + toggleBouncing: function toggleBouncing() { + if (this._bouncingMotion.isBouncing) { + this.stopBouncing(); + } else { + this.bounce(); + } + + return this; + }, + isRealMarker: function isRealMarker() { + return this.__proto__ === _leaflet.Marker.prototype; + }, + _setPos: function _setPos(position) { + oldSetPos.call(this, position); + + if (this.isRealMarker()) { + this._bouncingMotion.position = position; + + this._bouncingMotion.resetStyles(this); + } + }, + onAdd: function onAdd(map) { + oldOnAdd.call(this, map); + + if (this.isRealMarker()) { + this._bouncingMotion.resetStyles(this); + } + }, + setIcon: function setIcon(icon) { + oldSetIcon.call(this, icon); + + if (this.isRealMarker() && this._icon) { + this._bouncingMotion.resetStyles(this); + } + } +}; +exports["default"] = _default; \ No newline at end of file diff --git a/sut/frontend/build/leaflet/smooth_bounce/Matrix3D.js b/sut/frontend/build/leaflet/smooth_bounce/Matrix3D.js new file mode 100644 index 0000000..c06f222 --- /dev/null +++ b/sut/frontend/build/leaflet/smooth_bounce/Matrix3D.js @@ -0,0 +1,166 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); +} + +function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _iterableToArray(iter) { + if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); +} + +function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return _arrayLikeToArray(arr); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + return arr2; +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +function _classPrivateFieldGet(receiver, privateMap) { + var descriptor = privateMap.get(receiver); + if (!descriptor) { + throw new TypeError("attempted to get private field on non-instance"); + } + if (descriptor.get) { + return descriptor.get.call(receiver); + } + return descriptor.value; +} + +function _classPrivateFieldSet(receiver, privateMap, value) { + var descriptor = privateMap.get(receiver); + if (!descriptor) { + throw new TypeError("attempted to set private field on non-instance"); + } + if (descriptor.set) { + descriptor.set.call(receiver, value); + } else { + if (!descriptor.writable) { + throw new TypeError("attempted to set read only private field"); + } + descriptor.value = value; + } + return value; +} + +var rowMap = { + 'a': 0, + 'b': 1, + 'c': 2, + 'd': 3 +}; +var zeros = Array(16).fill(0); +var _identity = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; +/** + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d + */ + +var _matrix = new WeakMap(); + +var Matrix3D = /*#__PURE__*/function () { + function Matrix3D() { + var matrix = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : zeros; + + _classCallCheck(this, Matrix3D); + + _matrix.set(this, { + writable: true, + value: void 0 + }); + + _classPrivateFieldSet(this, _matrix, _toConsumableArray(matrix)); + } + + _createClass(Matrix3D, [{ + key: "toFormat", + value: function toFormat() { + for (var _len = arguments.length, placeholders = new Array(_len), _key = 0; _key < _len; _key++) { + placeholders[_key] = arguments[_key]; + } + + placeholders = placeholders.map(Matrix3D.valueNameToIndex); + var nextPlaceholderIndex = 0; + + var fnBody = _classPrivateFieldGet(this, _matrix).map(function (value, index) { + return index === placeholders[nextPlaceholderIndex] ? "'+arguments[".concat(nextPlaceholderIndex++, "]+'") : value; + }).join(','); + + fnBody = "return ' matrix3d(".concat(fnBody, ") ';"); + + function formatFn() { + return Function.apply(this, [fnBody]); + } + + formatFn.prototype = Function.prototype; + return new formatFn(); + } + }, { + key: "toString", + value: function toString() { + return " matrix3d(".concat(_classPrivateFieldGet(this, _matrix).join(','), ") "); + } + }], [{ + key: "zeros", + value: function zeros() { + return new Matrix3D(); + } + }, { + key: "identity", + value: function identity() { + return new Matrix3D(_identity); + } + }, { + key: "valueNameToIndex", + value: function valueNameToIndex(valueName) { + return rowMap[valueName[0]] * 4 + parseInt(valueName[1]) - 1; + } + }]); + + return Matrix3D; +}(); + +exports["default"] = Matrix3D; \ No newline at end of file diff --git a/sut/frontend/build/leaflet/smooth_bounce/Orchestration.js b/sut/frontend/build/leaflet/smooth_bounce/Orchestration.js new file mode 100644 index 0000000..b9316da --- /dev/null +++ b/sut/frontend/build/leaflet/smooth_bounce/Orchestration.js @@ -0,0 +1,147 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +var _leaflet = require("leaflet"); + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", {writable: false}); + return Constructor; +} + +function _classPrivateFieldInitSpec(obj, privateMap, value) { + _checkPrivateRedeclaration(obj, privateMap); + privateMap.set(obj, value); +} + +function _checkPrivateRedeclaration(obj, privateCollection) { + if (privateCollection.has(obj)) { + throw new TypeError("Cannot initialize the same private elements twice on an object"); + } +} + +function _classPrivateFieldGet(receiver, privateMap) { + var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); + return _classApplyDescriptorGet(receiver, descriptor); +} + +function _classExtractFieldDescriptor(receiver, privateMap, action) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to " + action + " private field on non-instance"); + } + return privateMap.get(receiver); +} + +function _classApplyDescriptorGet(receiver, descriptor) { + if (descriptor.get) { + return descriptor.get.call(receiver); + } + return descriptor.value; +} + +var _bouncingMarkers = /*#__PURE__*/new WeakMap(); + +var Orchestration = /*#__PURE__*/function () { + function Orchestration() { + _classCallCheck(this, Orchestration); + + _classPrivateFieldInitSpec(this, _bouncingMarkers, { + writable: true, + value: [] + }); + } + + _createClass(Orchestration, [{ + key: "getBouncingMarkers", + value: function getBouncingMarkers() { + return _classPrivateFieldGet(this, _bouncingMarkers); + } + /** + * Adds the marker to the list of bouncing markers. + * If flag 'exclusive' is set to true, stops all bouncing markers before. + * + * @param marker {Marker} marker object + * @param exclusive {boolean} flag of exclusive bouncing. If set to true, stops the bouncing + * of all other markers. + */ + + }, { + key: "addBouncingMarker", + value: function addBouncingMarker(marker, exclusive) { + if (exclusive || marker._bouncingMotion.bouncingOptions.exclusive) { + this.stopAllBouncingMarkers(); + } else { + this.stopExclusiveMarkerBouncing(); + } + + _classPrivateFieldGet(this, _bouncingMarkers).push(marker); + } + /** + * Stops the bouncing of exclusive marker. + */ + + }, { + key: "stopExclusiveMarkerBouncing", + value: function stopExclusiveMarkerBouncing() { + var exclusiveMarker = _classPrivateFieldGet(this, _bouncingMarkers).find(function (marker) { + return marker._bouncingMotion.bouncingOptions.exclusive; + }); + + if (exclusiveMarker) { + exclusiveMarker.stopBouncing(); + } + } + /** + * Removes the marker from the list of bouncing markers. + * @param marker {Marker} marker + */ + + }, { + key: "removeBouncingMarker", + value: function removeBouncingMarker(marker) { + var i = _classPrivateFieldGet(this, _bouncingMarkers).indexOf(marker); + + if (~i) { + _classPrivateFieldGet(this, _bouncingMarkers).splice(i, 1); + } + } + /** + * Stops the bouncing of all currently bouncing markers. Purge the array of bouncing markers. + */ + + }, { + key: "stopAllBouncingMarkers", + value: function stopAllBouncingMarkers() { + var marker; + + while (marker = _classPrivateFieldGet(this, _bouncingMarkers).shift()) { + marker.stopBouncing(); + } + } + }]); + + return Orchestration; +}(); + +exports["default"] = Orchestration; \ No newline at end of file diff --git a/sut/frontend/build/leaflet/smooth_bounce/SmoothMarkerBouncing.js b/sut/frontend/build/leaflet/smooth_bounce/SmoothMarkerBouncing.js new file mode 100644 index 0000000..5905b86 --- /dev/null +++ b/sut/frontend/build/leaflet/smooth_bounce/SmoothMarkerBouncing.js @@ -0,0 +1,96 @@ +"use strict"; + +function _typeof(obj) { + "@babel/helpers - typeof"; + return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { + return typeof obj; + } : function (obj) { + return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }, _typeof(obj); +} + +var _leaflet = _interopRequireWildcard(require("leaflet")); + +var _BouncingOptions = _interopRequireDefault(require("./BouncingOptions.js")); + +var _MarkerPrototypeExt = _interopRequireDefault(require("./MarkerPrototypeExt.js")); + +var _BouncingMotionCss = _interopRequireDefault(require("./BouncingMotionCss3.js")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : {"default": obj}; +} + +function _getRequireWildcardCache(nodeInterop) { + if (typeof WeakMap !== "function") return null; + var cacheBabelInterop = new WeakMap(); + var cacheNodeInterop = new WeakMap(); + return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { + return nodeInterop ? cacheNodeInterop : cacheBabelInterop; + })(nodeInterop); +} + +function _interopRequireWildcard(obj, nodeInterop) { + if (!nodeInterop && obj && obj.__esModule) { + return obj; + } + if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { + return {"default": obj}; + } + var cache = _getRequireWildcardCache(nodeInterop); + if (cache && cache.has(obj)) { + return cache.get(obj); + } + var newObj = {}; + var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var key in obj) { + if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { + var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; + if (desc && (desc.get || desc.set)) { + Object.defineProperty(newObj, key, desc); + } else { + newObj[key] = obj[key]; + } + } + } + newObj["default"] = obj; + if (cache) { + cache.set(obj, newObj); + } + return newObj; +} + +_leaflet["default"].Marker.include(_MarkerPrototypeExt["default"]); +/** + * Registers default options of bouncing animation. + * @param options {BouncingOptions|object} object with options + */ + + +_leaflet["default"].Marker.setBouncingOptions = function (options) { + _leaflet.Marker.prototype._bouncingOptions = options instanceof _BouncingOptions["default"] ? options : new _BouncingOptions["default"](options); +}; +/** + * Returns array of currently bouncing markers. + * @return {Marker[]} array of bouncing markers + */ + + +_leaflet["default"].Marker.getBouncingMarkers = function () { + _leaflet.Marker.prototype._orchestration.getBouncingMarkers(); +}; +/** + * Stops the bouncing of all currently bouncing markers. Purge the array of bouncing markers. + */ + + +_leaflet["default"].Marker.stopAllBouncingMarkers = function () { + _leaflet.Marker.prototype._orchestration.stopAllBouncingMarkers(); +}; + +_leaflet["default"].Marker.addInitHook(function () { + if (this.isRealMarker()) { + var bouncingOptions = new _BouncingOptions["default"](_leaflet.Marker.prototype._bouncingOptions); + this._bouncingMotion = new _BouncingMotionCss["default"](this, new _leaflet.Point(0, 0), bouncingOptions); + } +}); \ No newline at end of file diff --git a/sut/frontend/build/leaflet/smooth_bounce/Styles.js b/sut/frontend/build/leaflet/smooth_bounce/Styles.js new file mode 100644 index 0000000..3b9d710 --- /dev/null +++ b/sut/frontend/build/leaflet/smooth_bounce/Styles.js @@ -0,0 +1,106 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", {writable: false}); + return Constructor; +} + +/** Regex to parse style definitions. */ +var regStyle = /([\w-]+): ([^;]+);/g; + +var Styles = /*#__PURE__*/function () { + function Styles(styles) { + _classCallCheck(this, Styles); + + styles && Object.assign(this, styles); + } + + _createClass(Styles, [{ + key: "findOpacity", + value: function findOpacity(options) { + this.opacity = (options === null || options === void 0 ? void 0 : options.opacityWhenUnclustered // used by cluster plugin + ) || (options === null || options === void 0 ? void 0 : options.opacity) || 1; + } + /** + * Creates a copy of styles merged with provided 'styles'. + * @param {Object} styles object with styles to merge + * @return {Styles} copy of styles + */ + + }, { + key: "withStyles", + value: function withStyles(styles) { + var copy = new Styles(this); + copy && Object.assign(copy, styles); + return copy; + } + }, { + key: "toString", + value: function toString() { + return Object.entries(this).map(function (entry) { + return "".concat(entry[0], ": ").concat(entry[1], ";"); + }).join(' '); + } + /** + * Parses cssText attribute into Styles object. + * @param cssText {string} cssText string + * @return {Styles} Styles object + */ + + }], [{ + key: "parse", + value: function parse(cssText) { + var styles = {}; + var match = regStyle.exec(cssText); + + while (match) { + styles[match[1]] = match[2]; + match = regStyle.exec(cssText); + } + + delete styles['z-index']; + delete styles['opacity']; + styles['outline'] = 'none'; + return new Styles(styles); + } + /** + * @param marker {Marker} + */ + + }, { + key: "ofMarker", + value: function ofMarker(marker) { + var styles = Styles.parse(marker._icon.style.cssText); + styles.findOpacity(marker.options); + styles['z-index'] = marker._zIndex; + return styles; + } + }]); + + return Styles; +}(); + +exports["default"] = Styles; \ No newline at end of file diff --git a/sut/frontend/build/leaflet/smooth_bounce/bundle.min.js b/sut/frontend/build/leaflet/smooth_bounce/bundle.min.js new file mode 100644 index 0000000..1395c41 --- /dev/null +++ b/sut/frontend/build/leaflet/smooth_bounce/bundle.min.js @@ -0,0 +1 @@ +!function(M){"use strict";function n(n){return n&&"object"==typeof n&&"default"in n?n:{default:n}}var t=n(M);function o(n,t){if(!(n instanceof t))throw new TypeError("Cannot call a class as a function")}function e(n,t){for(var i=0;in.length)&&(t=n.length);for(var i=0,e=new Array(t);i dy ? dx : -dy) / 2, + e2, + p = [], + i = 0; + + while (true) { + p.push([x, y]); + i++; + if (i === length) break; + e2 = err; + + if (e2 > -dx) { + err -= dy; + x += sx; + } + + if (e2 < dy) { + err += dx; + y += sy; + } + } + + return p; +} \ No newline at end of file diff --git a/sut/frontend/build/logo.png b/sut/frontend/build/logo.png new file mode 100644 index 0000000..1e407d5 Binary files /dev/null and b/sut/frontend/build/logo.png differ diff --git a/sut/frontend/build/logo_background.png b/sut/frontend/build/logo_background.png new file mode 100644 index 0000000..6a99a33 Binary files /dev/null and b/sut/frontend/build/logo_background.png differ diff --git a/sut/frontend/build/logo_old.png b/sut/frontend/build/logo_old.png new file mode 100644 index 0000000..e3eaad4 Binary files /dev/null and b/sut/frontend/build/logo_old.png differ diff --git a/sut/frontend/build/middle-earth-map.svg b/sut/frontend/build/middle-earth-map.svg new file mode 100644 index 0000000..7f3d0d6 --- /dev/null +++ b/sut/frontend/build/middle-earth-map.svg @@ -0,0 +1,65 @@ + + + + + + + Middle-earth + + + + + + Eriador + + + + Misty Mountains + + + + Rhovanion + + + + Mordor + + + + + The Shire + + + + Rivendell + + + + Moria + + + + Lothlórien + + + + Rohan + + + + Mordor + + + + + + + N + + + + + + + 300 Miles + diff --git a/sut/frontend/build/middle-earth-map.webp b/sut/frontend/build/middle-earth-map.webp new file mode 100644 index 0000000..df8728a Binary files /dev/null and b/sut/frontend/build/middle-earth-map.webp differ diff --git a/sut/frontend/build/middle-earth-map/data/markers.json b/sut/frontend/build/middle-earth-map/data/markers.json new file mode 100644 index 0000000..349d68f --- /dev/null +++ b/sut/frontend/build/middle-earth-map/data/markers.json @@ -0,0 +1,707 @@ +[ + { + "title": "Minas Tirith", + "description": "Minas Tirith was originally a fortress, Minas Anor, built in S.A. 3320 by the Faithful Númenóreans. From T.A. 1640 onwards it was the capital of the South-kingdom and the seat of its Kings and ruling Stewards.", + "infoLink": "https://tolkiengateway.net/wiki/Minas_Tirith", + "tags": { + "places": [ + "human" + ], + "quests": [ + "ring" + ] + }, + "x": 3279, + "y": 2707 + }, + { + "title": "Esgaroth (Lake-Town)", + "description": "Lake-Town was the township of the Lake-men in Wilderland. The town was constructed entirely of wood and stood upon wooden pillars sunk into the bed of the Long Lake, as a protection against the dragon Smaug, who dwelt nearby in the Lonely Mountain.", + "infoLink": "https://tolkiengateway.net/wiki/Lake-town", + "tags": { + "places": [ + "human" + ], + "quests": [ + "erebor" + ] + }, + "x": 3418, + "y": 885 + }, + { + "title": "Bree", + "description": "Bree was the chief village of Bree-land, a small wooded region near the intersection of the main north-south and east-west routes through Eriador. Bree-land was the only part of Middle-earth where Men and hobbits dwelt side by side and Bree had a large population of Hobbits.", + "infoLink": "https://tolkiengateway.net/wiki/Bree", + "tags": { + "places": [ + "human", + "hobbit" + ], + "quests": [ + "ring", + "erebor" + ] + }, + "x": 1793, + "y": 1163 + }, + { + "title": "Erebor", + "description": "The Longbeards had control of Erebor since at least the early Second Age. With the awakening of Durin's Bane in the capital of Khazad-dûm, Thráin I led a group of Dwarves to Erebor. Once there, the dwarves dug caves and halls to form an underground city, thus establishing the Kingdom under the Mountain in T.A. 1999.", + "infoLink": "https://tolkiengateway.net/wiki/Erebor", + "tags": { + "places": [ + "dwarven" + ], + "quests": [ + "erebor" + ] + }, + "x": 3405, + "y": 825 + }, + { + "title": "Rivendell", + "sindarinTitle": "Imladris", + "description": "Rivendell was established by Elrond in S.A. 1697 as a refuge from Sauron after the Fall of Eregion. It remained Elrond's seat throughout the remainder of the Second Age and until the end of the Third Age, when he took the White Ship for Valinor.", + "infoLink": "https://tolkiengateway.net/wiki/Rivendell", + "tags": { + "places": [ + "elven" + ], + "quests": [ + "erebor", + "ring" + ] + }, + "x": 2516, + "y": 1123 + }, + { + "title": "Mount Doom", + "sindarinTitle": "Orodruin, Amon Amarth", + "description": "Melkor created Mount Doom in the First Age. When Sauron chose the land of Mordor as his dwelling-place in the Second Age, Orodruin was the reason for his choice. The mountain erupted in S.A. 3429, signalling Sauron's attack on Gondor and it took the name Amon Amarth, \"Mount Doom\". This is where the One Ring was forged by Sauron, and where it was destroyed by Gollum.", + "infoLink": "https://tolkiengateway.net/wiki/Mount_Doom", + "tags": { + "places": [ + "dark" + ], + "quests": [ + "ring" + ] + }, + "x": 3606, + "y": 2603 + }, + { + "title": "Osgiliath", + "description": "Founded by Isildur and Anárion near the end of the Second Age, Osgiliath was designated the capital of the southern Númenórean kingdom in exile, Gondor. It stays so until the King's House was moved to the more secure Minas Anor in T.A. 1640.", + "infoLink": "https://tolkiengateway.net/wiki/Osgiliath", + "tags": { + "places": [ + "human" + ], + "quests": [ + "ring" + ] + }, + "x": 3330, + "y": 2700 + }, + { + "title": "Hobbiton", + "description": "Hobbiton was a hobbit village in the central regions of the Shire, within the borders of the Westfarthing.", + "infoLink": "https://tolkiengateway.net/wiki/Hobbiton", + "tags": { + "places": [ + "hobbit" + ], + "quests": [ + "erebor", + "ring" + ] + }, + "x": 1482, + "y": 1158 + }, + { + "title": "Helm's Deep", + "description": "Helm's Deep was a large valley gorge in the north-western Ered Nimrais (White Mountains) below the Thrihyrne. It was actually the name of the whole defensive system including its major defensive structure, the Hornburg.", + "infoLink": "https://tolkiengateway.net/wiki/Helm's_Deep", + "tags": { + "places": [ + "human" + ], + "quests": [ + "ring" + ] + }, + "x": 2423, + "y": 2321 + }, + { + "title": "Black Gate", + "sindarinTitle": "Morannon", + "description": "The Black Gate was the main entrance into the land of Mordor. It was built by Sauron after he chose Mordor as a land to make into a stronghold in S.A. 1000.", + "infoLink": "https://tolkiengateway.net/wiki/Black_Gate", + "tags": { + "places": [ + "dark" + ], + "quests": [ + "ring" + ] + }, + "x": 3389, + "y": 2377 + }, + { + "title": "Weathertop", + "sindarinTitle": "Amun Sûl", + "description": "In T.A.3018, Amun Sûl was the scene of two fights involving the Nazgûl: one with Gandalf on October 3 and one with the Ring-bearer three days later.", + "infoLink": "https://tolkiengateway.net/wiki/Weathertop", + "tags": { + "places": [ + "human" + ], + "quests": [ + "ring" + ] + }, + "x": 2000, + "y": 1158 + }, + { + "title": "Isengard", + "sindarinTitle": "Angrenost", + "description": "Isengard was one of the three major fortresses of Gondor, and held within it one of the realm's palantíri. In the latter half of the Third Age, the stronghold came into the possession of Saruman, becoming his home and personal domain until his defeat in the War of the Ring.", + "infoLink": "https://tolkiengateway.net/wiki/Isengard", + "tags": { + "places": [ + "dark" + ], + "quests": [ + "ring" + ] + }, + "x": 2335, + "y": 2117 + }, + { + "title": "Barad-dûr", + "description": "Barad-dûr, also known as the Dark Tower, was the chief fortress of Sauron, on the Plateau of Gorgoroth in Mordor. Sauron began to build Barad-dûr in around S.A. 1000, and completed his fortress after 600 years of the construction with the power of the Ring. It was partially destroyed after Sauron's defeat against Isildur, and began to be rebuilt in T.A. 2951.", + "infoLink": "https://tolkiengateway.net/wiki/Barad-dûr", + "tags": { + "places": [ + "dark" + ], + "quests": [ + "ring" + ] + }, + "x": 3750, + "y": 2553 + }, + { + "title": "Edoras", + "description": "Edoras was the capital of Rohan that held the Golden Hall of Meduseld. Rohan's first capital was at Aldburg in the Folde, until King Eorl the Young or his son Brego built Edoras in T.A. 2569. ", + "infoLink": "https://tolkiengateway.net/wiki/Edoras", + "tags": { + "places": [ + "human" + ], + "quests": [ + "ring" + ] + }, + "x": 2589, + "y": 2383 + }, + { + "title": "Moria", + "sindarinTitle": "Khazad-dûm", + "description": "Khazad-dûm was the grandest and most famous of the mansions of the Dwarves. There, for many thousands of years, a thriving Dwarvish community created the greatest city ever known.", + "infoLink": "https://tolkiengateway.net/wiki/Moria", + "tags": { + "places": [ + "dwarven" + ], + "quests": [ + "ring" + ] + }, + "x": 2492, + "y": 1505 + }, + { + "title": "Grey Havens", + "sindarinTitle": "Mithlond", + "description": "Founded by the Elves of Lindon in S.A. 1, the Grey Havens were known for their good harbourage and many ships; these were used by any of the Eldar to leave Middle-earth for Eressëa or Valinor.", + "infoLink": "https://tolkiengateway.net/wiki/Grey_Havens", + "tags": { + "places": [ + "elven" + ], + "quests": [ + "ring" + ] + }, + "x": 1047, + "y": 1186 + }, + { + "title": "Lothlórien", + "description": "Lothlórien (or Lórien) was a kingdom of Silvan Elves on the eastern side of the Hithaeglir. It was considered one of the most beautiful and \"elvish\" places in Middle-earth during the Third Age, and had the only mallorn-trees east of the sea.", + "infoLink": "https://tolkiengateway.net/wiki/Lothlórien", + "tags": { + "places": [ + "elven" + ], + "quests": [ + "ring" + ] + }, + "x": 2666, + "y": 1679 + }, + { + "title": "Elvenking's Hall", + "description": "Elvenking's Hall were a cave system in northern Mirkwood, in which King Thranduil and many of the Elves of Mirkwood lived during most of the Third Age and into the Fourth Age.", + "infoLink": "https://tolkiengateway.net/wiki/Elvenking's_Halls", + "tags": { + "places": [ + "elven" + ], + "quests": [ + "erebor" + ] + }, + "x": 3311, + "y": 849 + }, + { + "title": "Dol Guldur", + "description": "Dol Guldur (\"Hill of Sorcery\" in Sindarin), also called \"the dungeons of the Necromancer\", was a stronghold of Sauron located in the south of Mirkwood.", + "infoLink": "https://tolkiengateway.net/wiki/Dol_Guldur", + "tags": { + "places": [ + "dark" + ], + "quests": [ + "erebor", + "ring" + ] + }, + "x": 3014, + "y": 1629 + }, + { + "title": "Minas Morgul", + "description": "Minas Morgul (originally called Minas Ithil) was the twin city of Minas Tirith before its fall to the forces of Sauron in the Third Age. It then became the stronghold of the Witch-king of Angmar until Sauron's defeat.", + "infoLink": "https://tolkiengateway.net/wiki/Minas_Morgul", + "tags": { + "places": [ + "dark" + ], + "quests": [ + "ring" + ] + }, + "x": 3424, + "y": 2695 + }, + { + "title": "Paths of the Dead", + "description": "The Paths of the Dead was a haunted underground passage through the White Mountains that led from Harrowdale in Rohan to Blackroot Vale in Gondor.", + "infoLink": "https://tolkiengateway.net/wiki/Paths_of_the_Dead", + "tags": { + "places": [ + "human" + ], + "quests": [ + "ring" + ] + }, + "x": 2605, + "y": 2535 + }, + { + "title": "Mount Gram", + "description": "Mount Gram was inhabited by Orcs led by their King Golfimbul. In T.A. 2747 they attacked much of northern Eriador, but were defeated in the Battle of Greenfields.", + "infoLink": "https://tolkiengateway.net/wiki/Mount_Gram", + "tags": { + "places": [ + "dark" + ], + "quests": [ + "erebor" + ] + }, + "x": 2353, + "y": 746 + }, + { + "title": "Carn Dûm", + "description": "Carn Dûm was the chief fortress of the realm of Angmar and the seat of its king until its defeat against the combined armies of Gondor, Lindon and Arnor in T.A. 1974.", + "infoLink": "https://tolkiengateway.net/wiki/Carn_Dûm", + "tags": { + "places": [ + "dark" + ] + }, + "x": 2115, + "y": 523 + }, + { + "title": "Beorn's Hall", + "description": "Beorn's Hall was the home of Beorn, a powerful Skin-changer. Beorn hosted and aided Thorin and Company during their Quest for Erebor.", + "infoLink": "https://tolkiengateway.net/wiki/Beorn's_Hall", + "tags": { + "places": [ + "human" + ], + "quests": [ + "erebor" + ] + }, + "x": 2871, + "y": 1016 + }, + { + "title": "Goblin-town", + "description": "Goblin-town was a Goblin dwelling under the Misty Mountains, which was ruled by the Great Goblin. Goblin-town was a series of tunnels and caverns, which went all the way through the mountains, with a \"back door\" (the Goblin-gate) near the Eagle's Eyrie in Wilderland, which served as a means of escape, and an access to the Wilderland. A cave with a lake was deep beneath Goblin-town yet was connected to the Goblins' tunnels, with one passage leading to the \"back door\".", + "infoLink": "https://tolkiengateway.net/wiki/Goblin-town", + "tags": { + "places": [ + "dark" + ], + "quests": [ + "erebor" + ] + }, + "x": 2647, + "y": 980 + }, + { + "title": "Dale", + "description": "Dale was a great city of the Northmen which was destroyed by Smaug and rebuilt as the capital of a great kingdom after his demise.", + "infoLink": "https://tolkiengateway.net/wiki/Dale", + "tags": { + "places": [ + "human" + ], + "quests": [ + "erebor" + ] + }, + "x": 3430, + "y": 855 + }, + { + "title": "Smaug", + "date": "November 1, T.A. 2941", + "description": "Bard fired a Black Arrow into the vulnerable spot on the dragon's belly. Roaring in fury and pain, Smaug fell from the sky and plummeted into the flaming ruins of Lake-town, his death marked the end of the great dragons in Middle-earth.", + "infoLink": "https://tolkiengateway.net/wiki/Smaug", + "tags": { + "events": [ + "death" + ], + "quests": [ + "erebor" + ] + }, + "x": 3418, + "y": 885 + }, + { + "title": "Battle of Dagorlad", + "date": "3434 of the Second Age", + "description": "The Battle of Dagorlad was fought between the army of the Last Alliance under Gil-galad and Elendil and an army of Orcs and other creatures loyal to Sauron.", + "infoLink": "https://tolkiengateway.net/wiki/Battle_of_Dagorlad", + "tags": { + "events": [ + "battle" + ], + "quests": [ + "other" + ] + }, + "x": 3319, + "y": 2356 + }, + { + "title": "Battle of Isengard", + "date": "3 March, T.A. 3019", + "description": "Spurred on by Meriadoc Brandybuck and Peregrin Took, the Ents, followed by Huorns, invaded the Ring of Isengard from Fangorn Forest. It led the the drowning of Isengard and the defeat of Saruman.", + "infoLink": "https://tolkiengateway.net/wiki/Battle_of_Isengard", + "tags": { + "events": [ + "battle" + ], + "quests": [ + "ring" + ] + }, + "x": 2335, + "y": 2117 + }, + { + "title": "Battle of Five Armies", + "date": "November 23, T.A. 2941", + "description": "The five warring parties were the Goblins and the Wargs against Men, Elves and Dwarves on and near the Lonely Mountain.", + "infoLink": "https://tolkiengateway.net/wiki/Battle_of_Five_Armies", + "tags": { + "events": [ + "battle" + ], + "quests": [ + "erebor" + ] + }, + "x": 3405, + "y": 825 + }, + { + "title": "Thorin, Fíli and Kíli", + "date": "November 23, T.A. 2941", + "description": "When Bilbo regained consciousness, the battle was already over. Thorin II Oakenshield had been mortally wounded on the field, and his nephews Fíli and Kíli died defending him as he lay on the ground.", + "infoLink": "https://tolkiengateway.net/wiki/Battle_of_Five_Armies", + "tags": { + "events": [ + "death" + ], + "quests": [ + "erebor" + ] + }, + "x": 3405, + "y": 825 + }, + { + "title": "Battle of Pelennor Fields", + "date": "15 March, T.A. 3019", + "description": "The Battle of the Pelennor Fields was the greatest battle of the War of the Ring. This battle saw the siege of Minas Tirith by Mordor's troops widely outnumbering the defenders, but resulted in the loss of Sauron's armies after the Witch King was killed in combat.", + "infoLink": "https://tolkiengateway.net/wiki/Battle_of_the_Pelennor_Fields", + "tags": { + "events": [ + "battle" + ], + "quests": [ + "ring" + ] + }, + "x": 3279, + "y": 2707 + }, + { + "title": "Battle of the Morannon", + "date": "25 March, T.A. 3019", + "description": "The Battle of the Morannon was the last major battle against Sauron in the War of the Ring, fought at the Black Gate of Mordor on 25 March T.A. 3019. The army of the West, 6,000 strong by now, led by Aragorn marched on the gate as a diversionary feint to distract Sauron's attention from Frodo and Sam, who were carrying the One Ring through Mordor. It was hoped that Sauron would think Aragorn had the Ring and was now trying to use it to overthrow Mordor.", + "infoLink": "https://tolkiengateway.net/wiki/Battle_of_the_Morannon", + "tags": { + "events": [ + "battle" + ], + "quests": [ + "ring" + ] + }, + "x": 3389, + "y": 2377 + }, + { + "title": "Battle of the Hornburg", + "date": "3-4 March, T.A. 3019", + "description": "The Battle of the Hornburg took place at the mountain fortress of the Hornburg in the valley of Helm's Deep in Rohan. Taking place over the night of the 3-4 March T.A. 3019, it saw the attacking Uruk-hai of Saruman defeated by the Rohirrim led by Théoden and Erkenbrand.", + "infoLink": "https://tolkiengateway.net/wiki/Battle_of_the_Hornburg", + "tags": { + "events": [ + "battle" + ], + "quests": [ + "ring" + ] + }, + "x": 2423, + "y": 2321 + }, + { + "title": "Boromir", + "date": "February 26, T.A. 3019", + "description": "Boromir died at Amon Hen, the westernmost of the three peaks at the southern end of Nen Hithoel. He perished trying to defend Merry and Pippin from Saruman's Orcs, slaying at least 20 of them before perishing after being hit by many arrows.", + "infoLink": "https://tolkiengateway.net/wiki/Boromir", + "tags": { + "events": [ + "death" + ], + "quests": [ + "ring" + ] + }, + "x": 3037, + "y": 2377 + }, + { + "title": "Gandalf the Grey", + "date": "January 25, T.A. 3019", + "description": "Gandalf pursued the Balrog from the deepests dungeons of Moria to Durin's Tower, climbing through the whole Endless Stair, where they fought for three days and two nights. In the end, the Balrog was cast down and it broke the mountain-side as it fell. Gandalf himself died following this ordeal, but was later sent back to Middle-earth with even greater powers as Gandalf the White.", + "infoLink": "https://tolkiengateway.net/wiki/Battle_of_the_Peak", + "tags": { + "events": [ + "death" + ], + "quests": [ + "ring" + ] + }, + "x": 2500, + "y": 1558 + }, + { + "title": "Bilbo stole the Ring from Gollum", + "date": "July 12, T.A. 2941", + "description": "Bilbo picked up a strange golden ring in the dark passages under Goblin-town. He then met Gollum whom defied him to a riddle contest for his life. Bilbo won, but then Gollum went to get his magic ring to kill him anyway. He then discovered that his ring was missing, and understood that Bilbo took it. He chased Bilbo, but Bilbo unwittingly used the ring and escaped his notice.", + "infoLink": "https://tolkiengateway.net/wiki/Bilbo_Baggins#Over_the_Misty_Mountains", + "tags": { + "events": [ + "encounter" + ], + "quests": [ + "erebor" + ] + }, + "x": 2685, + "y": 962 + }, + { + "title": "Merry and Pippin meet Treebeard", + "date": "February 29, T.A. 3019", + "description": "Treebeard discovered Merry and Pippin in Fangorn Forest after they escaped from Saruman's Orcs, and welcomed them to the WellingHall.", + "infoLink": "https://tolkiengateway.net/wiki/Treebeard", + "tags": { + "events": [ + "encounter" + ], + "quests": [ + "ring" + ] + }, + "x": 2460, + "y": 2052 + }, + { + "title": "Tom Bombadil", + "date": "September 26, T.A. 3018", + "description": "Tom Bombadil, a mysterious creature living in the Dark Forst with his wife Goldberry, saved Frodo, Sam, Merry and Pippin from the Old Man Willow, an evil willow who cast a spell on them and trapped Merry and Pippin. He then hosted the hobbits for two nights, during which he told them many tales and songs.", + "infoLink": "https://tolkiengateway.net/wiki/Tom_Bombadil", + "tags": { + "events": [ + "encounter" + ], + "quests": [ + "ring" + ] + }, + "x": 1659, + "y": 1184 + }, + { + "title": "Shelob", + "date": "March 12, T.A. 3019", + "description": "Shelob was born as the last child of the spider-like demon Ungoliant. On March 12 T.A. 3019, Gollum led Sam and Frodo into the tunnels of Shelob's Lair and abandoned them in the dark. He planned that Shelob would eat Sam and Frodo so that he could find the One Ring among the bones and clothes.", + "infoLink": "https://tolkiengateway.net/wiki/Shelob", + "tags": { + "events": [ + "encounter" + ], + "quests": [ + "ring" + ] + }, + "x": 3456, + "y": 2680 + }, + { + "title": "Stone Trolls", + "date": "May 28, T.A. 2941", + "description": "Three Stone Trolls (William, Tom and Bert) captured Bilbo and the Company of Thorin. Thanks to Gandalf who tricked them, they kept fighting over how to cook the dwarves until the sun set up, frozing them into stone statues.", + "infoLink": "https://tolkiengateway.net/wiki/Roast_Mutton", + "tags": { + "events": [ + "encounter" + ], + "quests": [ + "erebor" + ] + }, + "x": 2320, + "y": 1120 + }, + { + "title": "Giant Spiders", + "date": "August, T.A. 2941", + "description": "Giant spiders (Ungolianth's spawns) managed to capture and entangle in webs each of the thirteen Dwarves. Only Bilbo's magic Ring and his Elven blade Sting allowed them to escape from being eaten, before being captured by Thranduil's elves.", + "infoLink": "https://tolkiengateway.net/wiki/Flies_and_Spiders", + "tags": { + "events": [ + "encounter" + ], + "quests": [ + "erebor" + ] + }, + "x": 3250, + "y": 937 + }, + { + "title": "Barrow-wights", + "date": "Septeùber 28, T.A. 3018", + "description": "The Barrow-wights were a kind of undead-like creatures, dead bones animated by evil spirits. Frodo, Sam, Merry an Pippin were trapped in the Barrow-downs by the spells of the Barrow-wights, and were nearly slain by the creatures. They were saved in the last minute by Tom, who seemed to have had complete authority over them.", + "infoLink": "https://tolkiengateway.net/wiki/Barrow-wights", + "tags": { + "events": [ + "encounter" + ], + "quests": [ + "ring" + ] + }, + "x": 1725, + "y": 1200 + }, + { + "title": "Old Man Willow", + "date": "September 26, T.A. 3018", + "description": "Old Man Willow was a willow tree in the Old Forest, who might have been an Ent who had become tree-like, or possibly a Huorn. Old Man Willow cast a spell on the Hobbits, Frodo, Sam, Merry and Pippin, causing them to fall asleep and trying to kill them. They were saved by the timely arrival of Tom Bombadil who knew \"the tune for him\".", + "infoLink": "https://tolkiengateway.net/wiki/Old_Man_Willow", + "tags": { + "events": [ + "encounter" + ], + "quests": [ + "ring" + ] + }, + "x": 1615, + "y": 1225 + }, + { + "title": "Battle of Bywater", + "date": "November 3, T.A. 3019", + "description": "The Battle of Bywater was a battle for control of the Shire and the final battle of the War of the Ring. After he fleed from the Battle of Isengard, Saruman took control over the Shire with a band of ruffians. When Frodo and his companions returned from the Coronation of Elessar, they rallied the hobbits wanting to resist and defeated the ruffians, then confronted Saruman. Wormtongue killed Saruman and was shot dead by the hobbits.", + "infoLink": "https://tolkiengateway.net/wiki/Battle_of_Bywater", + "tags": { + "events": [ + "battle" + ], + "quests": [ + "ring" + ] + }, + "x": 1507, + "y": 1163 + } +] + + diff --git a/sut/frontend/build/middle-earth-map/data/paths.json b/sut/frontend/build/middle-earth-map/data/paths.json new file mode 100644 index 0000000..1b06bfc --- /dev/null +++ b/sut/frontend/build/middle-earth-map/data/paths.json @@ -0,0 +1,21270 @@ +[ + { + "name": "Thorin and Company", + "id": "thorin", + "color": "red", + "distance": "950 miles / 1530 km", + "startDate": "April 27", + "endDate": "November 23, T.A. 2941", + "path": [ + [ + 1486.00, + 1164.00 + ], + [ + 1497.33, + 1177.33 + ], + [ + 1497.33, + 1177.33 + ], + [ + 1497.33, + 1177.33 + ], + [ + 1508.67, + 1174.67 + ], + [ + 1508.67, + 1174.67 + ], + [ + 1508.67, + 1174.67 + ], + [ + 1517.33, + 1168.67 + ], + [ + 1517.33, + 1168.67 + ], + [ + 1517.33, + 1168.67 + ], + [ + 1529.33, + 1162.67 + ], + [ + 1529.33, + 1162.67 + ], + [ + 1529.33, + 1162.67 + ], + [ + 1540.67, + 1158.67 + ], + [ + 1540.67, + 1158.67 + ], + [ + 1540.67, + 1158.67 + ], + [ + 1551.33, + 1154.00 + ], + [ + 1551.33, + 1154.00 + ], + [ + 1551.33, + 1154.00 + ], + [ + 1561.33, + 1151.33 + ], + [ + 1561.33, + 1151.33 + ], + [ + 1561.33, + 1151.33 + ], + [ + 1573.33, + 1148.00 + ], + [ + 1573.33, + 1148.00 + ], + [ + 1573.33, + 1148.00 + ], + [ + 1584.00, + 1143.33 + ], + [ + 1584.00, + 1143.33 + ], + [ + 1584.00, + 1143.33 + ], + [ + 1594.67, + 1142.00 + ], + [ + 1594.67, + 1141.33 + ], + [ + 1594.67, + 1140.67 + ], + [ + 1606.00, + 1136.00 + ], + [ + 1606.00, + 1136.00 + ], + [ + 1606.00, + 1136.00 + ], + [ + 1618.67, + 1132.67 + ], + [ + 1618.67, + 1132.67 + ], + [ + 1618.67, + 1132.67 + ], + [ + 1629.33, + 1132.00 + ], + [ + 1629.33, + 1132.00 + ], + [ + 1629.33, + 1132.00 + ], + [ + 1640.67, + 1130.67 + ], + [ + 1640.67, + 1130.67 + ], + [ + 1640.67, + 1130.67 + ], + [ + 1650.00, + 1128.67 + ], + [ + 1650.00, + 1128.67 + ], + [ + 1650.00, + 1128.67 + ], + [ + 1666.00, + 1128.00 + ], + [ + 1666.00, + 1128.00 + ], + [ + 1666.00, + 1128.00 + ], + [ + 1676.00, + 1128.00 + ], + [ + 1676.00, + 1128.00 + ], + [ + 1676.00, + 1128.00 + ], + [ + 1688.67, + 1127.33 + ], + [ + 1688.67, + 1127.33 + ], + [ + 1688.67, + 1127.33 + ], + [ + 1702.67, + 1127.33 + ], + [ + 1702.67, + 1127.33 + ], + [ + 1702.67, + 1127.33 + ], + [ + 1715.33, + 1128.67 + ], + [ + 1715.33, + 1128.67 + ], + [ + 1715.33, + 1128.67 + ], + [ + 1729.33, + 1132.67 + ], + [ + 1729.33, + 1132.67 + ], + [ + 1729.33, + 1132.67 + ], + [ + 1746.00, + 1136.00 + ], + [ + 1746.00, + 1136.00 + ], + [ + 1746.00, + 1136.00 + ], + [ + 1754.67, + 1139.33 + ], + [ + 1754.67, + 1139.33 + ], + [ + 1754.67, + 1139.33 + ], + [ + 1757.33, + 1152.00 + ], + [ + 1757.33, + 1152.00 + ], + [ + 1757.33, + 1152.00 + ], + [ + 1758.67, + 1162.00 + ], + [ + 1758.67, + 1162.00 + ], + [ + 1758.67, + 1162.00 + ], + [ + 1766.00, + 1171.33 + ], + [ + 1766.00, + 1171.33 + ], + [ + 1766.00, + 1171.33 + ], + [ + 1781.33, + 1172.67 + ], + [ + 1781.33, + 1172.67 + ], + [ + 1781.33, + 1172.67 + ], + [ + 1793.33, + 1170.67 + ], + [ + 1793.33, + 1170.67 + ], + [ + 1793.33, + 1170.67 + ], + [ + 1810.67, + 1168.00 + ], + [ + 1810.67, + 1168.00 + ], + [ + 1810.67, + 1168.00 + ], + [ + 1824.67, + 1167.33 + ], + [ + 1824.67, + 1167.33 + ], + [ + 1824.67, + 1167.33 + ], + [ + 1835.33, + 1162.00 + ], + [ + 1835.33, + 1162.00 + ], + [ + 1835.33, + 1162.00 + ], + [ + 1844.67, + 1158.67 + ], + [ + 1844.67, + 1158.67 + ], + [ + 1844.67, + 1158.67 + ], + [ + 1868.67, + 1162.67 + ], + [ + 1868.67, + 1162.67 + ], + [ + 1868.67, + 1162.67 + ], + [ + 1883.33, + 1164.67 + ], + [ + 1883.33, + 1164.67 + ], + [ + 1883.33, + 1164.67 + ], + [ + 1898.00, + 1168.67 + ], + [ + 1898.00, + 1168.67 + ], + [ + 1898.00, + 1168.67 + ], + [ + 1921.33, + 1175.33 + ], + [ + 1921.33, + 1175.33 + ], + [ + 1921.33, + 1175.33 + ], + [ + 1942.00, + 1178.00 + ], + [ + 1942.00, + 1178.00 + ], + [ + 1942.00, + 1178.00 + ], + [ + 1967.33, + 1178.00 + ], + [ + 1967.33, + 1178.00 + ], + [ + 1967.33, + 1178.00 + ], + [ + 1990.67, + 1176.67 + ], + [ + 1990.67, + 1176.67 + ], + [ + 1990.67, + 1176.67 + ], + [ + 2012.67, + 1172.67 + ], + [ + 2012.67, + 1172.67 + ], + [ + 2012.67, + 1172.67 + ], + [ + 2035.33, + 1166.00 + ], + [ + 2035.33, + 1166.00 + ], + [ + 2035.33, + 1166.00 + ], + [ + 2060.00, + 1160.67 + ], + [ + 2060.00, + 1160.67 + ], + [ + 2060.00, + 1160.67 + ], + [ + 2081.33, + 1153.33 + ], + [ + 2081.33, + 1153.33 + ], + [ + 2081.33, + 1153.33 + ], + [ + 2105.33, + 1146.00 + ], + [ + 2105.33, + 1146.00 + ], + [ + 2105.33, + 1146.00 + ], + [ + 2124.00, + 1140.67 + ], + [ + 2124.00, + 1140.67 + ], + [ + 2124.00, + 1140.67 + ], + [ + 2136.00, + 1138.00 + ], + [ + 2136.00, + 1138.00 + ], + [ + 2136.00, + 1138.00 + ], + [ + 2161.33, + 1134.67 + ], + [ + 2161.33, + 1134.67 + ], + [ + 2161.33, + 1134.67 + ], + [ + 2180.67, + 1132.00 + ], + [ + 2180.67, + 1132.00 + ], + [ + 2180.67, + 1132.00 + ], + [ + 2204.00, + 1128.00 + ], + [ + 2204.00, + 1128.00 + ], + [ + 2204.00, + 1128.00 + ], + [ + 2225.33, + 1125.33 + ], + [ + 2225.33, + 1125.33 + ], + [ + 2225.33, + 1125.33 + ], + [ + 2248.00, + 1128.00 + ], + [ + 2248.00, + 1128.00 + ], + [ + 2248.00, + 1128.00 + ], + [ + 2262.00, + 1128.67 + ], + [ + 2262.00, + 1128.67 + ], + [ + 2262.00, + 1128.67 + ], + [ + 2283.33, + 1131.33 + ], + [ + 2283.33, + 1131.33 + ], + [ + 2283.33, + 1131.33 + ], + [ + 2295.33, + 1121.33 + ], + [ + 2295.33, + 1121.33 + ], + [ + 2295.33, + 1121.33 + ], + [ + 2314.00, + 1097.33 + ], + [ + 2314.00, + 1097.33 + ], + [ + 2314.00, + 1097.33 + ], + [ + 2329.33, + 1112.00 + ], + [ + 2329.33, + 1112.00 + ], + [ + 2329.33, + 1112.00 + ], + [ + 2340.00, + 1128.00 + ], + [ + 2340.00, + 1128.00 + ], + [ + 2340.00, + 1128.00 + ], + [ + 2343.33, + 1138.00 + ], + [ + 2343.33, + 1138.00 + ], + [ + 2343.33, + 1138.00 + ], + [ + 2365.33, + 1141.33 + ], + [ + 2365.33, + 1141.33 + ], + [ + 2365.33, + 1141.33 + ], + [ + 2387.33, + 1144.67 + ], + [ + 2387.33, + 1144.67 + ], + [ + 2387.33, + 1144.67 + ], + [ + 2412.00, + 1148.00 + ], + [ + 2412.00, + 1148.00 + ], + [ + 2412.00, + 1148.00 + ], + [ + 2436.67, + 1150.67 + ], + [ + 2436.67, + 1150.67 + ], + [ + 2436.67, + 1150.67 + ], + [ + 2457.33, + 1153.33 + ], + [ + 2457.33, + 1153.33 + ], + [ + 2457.33, + 1153.33 + ], + [ + 2481.33, + 1154.67 + ], + [ + 2481.33, + 1154.67 + ], + [ + 2481.33, + 1154.67 + ], + [ + 2493.33, + 1154.00 + ], + [ + 2493.33, + 1154.00 + ], + [ + 2493.33, + 1154.00 + ], + [ + 2501.33, + 1142.67 + ], + [ + 2501.33, + 1142.67 + ], + [ + 2501.33, + 1142.67 + ], + [ + 2515.33, + 1130.00 + ], + [ + 2515.33, + 1130.00 + ], + [ + 2515.33, + 1130.00 + ], + [ + 2517.33, + 1113.33 + ], + [ + 2518.00, + 1112.67 + ], + [ + 2518.67, + 1112.00 + ], + [ + 2532.00, + 1104.67 + ], + [ + 2532.67, + 1104.67 + ], + [ + 2533.33, + 1104.67 + ], + [ + 2555.33, + 1100.67 + ], + [ + 2557.33, + 1100.67 + ], + [ + 2559.33, + 1100.67 + ], + [ + 2580.00, + 1100.67 + ], + [ + 2582.00, + 1100.67 + ], + [ + 2584.00, + 1100.67 + ], + [ + 2603.33, + 1097.33 + ], + [ + 2603.33, + 1097.33 + ], + [ + 2603.33, + 1097.33 + ], + [ + 2619.33, + 1098.67 + ], + [ + 2620.67, + 1098.67 + ], + [ + 2622.00, + 1098.67 + ], + [ + 2625.33, + 1084.67 + ], + [ + 2625.33, + 1080.00 + ], + [ + 2625.33, + 1075.33 + ], + [ + 2626.00, + 1064.00 + ], + [ + 2626.00, + 1062.00 + ], + [ + 2626.00, + 1060.00 + ], + [ + 2630.67, + 1046.00 + ], + [ + 2630.67, + 1045.33 + ], + [ + 2630.67, + 1044.67 + ], + [ + 2631.33, + 1024.67 + ], + [ + 2631.33, + 1024.00 + ], + [ + 2631.33, + 1023.33 + ], + [ + 2638.67, + 1000.67 + ], + [ + 2638.67, + 1000.67 + ], + [ + 2638.67, + 1000.67 + ], + [ + 2643.33, + 981.33 + ], + [ + 2643.33, + 981.33 + ], + [ + 2643.33, + 981.33 + ], + [ + 2654.67, + 968.67 + ], + [ + 2654.67, + 968.67 + ], + [ + 2654.67, + 968.67 + ], + [ + 2686.00, + 974.00 + ], + [ + 2686.00, + 974.00 + ], + [ + 2686.00, + 974.00 + ], + [ + 2711.33, + 980.00 + ], + [ + 2711.33, + 980.00 + ], + [ + 2711.33, + 980.00 + ], + [ + 2719.33, + 987.33 + ], + [ + 2719.33, + 987.33 + ], + [ + 2719.33, + 987.33 + ], + [ + 2738.00, + 998.00 + ], + [ + 2738.00, + 998.00 + ], + [ + 2738.00, + 998.00 + ], + [ + 2760.67, + 1003.33 + ], + [ + 2761.33, + 1003.33 + ], + [ + 2762.00, + 1003.33 + ], + [ + 2790.00, + 1008.00 + ], + [ + 2790.00, + 1008.00 + ], + [ + 2790.00, + 1008.00 + ], + [ + 2810.00, + 1011.33 + ], + [ + 2810.00, + 1011.33 + ], + [ + 2810.00, + 1011.33 + ], + [ + 2833.33, + 1014.00 + ], + [ + 2833.33, + 1014.00 + ], + [ + 2833.33, + 1014.00 + ], + [ + 2846.67, + 1016.67 + ], + [ + 2847.33, + 1016.67 + ], + [ + 2848.00, + 1016.67 + ], + [ + 2865.33, + 1017.33 + ], + [ + 2865.33, + 1017.33 + ], + [ + 2865.33, + 1017.33 + ], + [ + 2880.00, + 1018.67 + ], + [ + 2880.00, + 1018.67 + ], + [ + 2880.00, + 1018.67 + ], + [ + 2899.33, + 1020.00 + ], + [ + 2899.33, + 1020.00 + ], + [ + 2899.33, + 1020.00 + ], + [ + 2917.33, + 1020.67 + ], + [ + 2920.00, + 1020.67 + ], + [ + 2922.67, + 1020.67 + ], + [ + 2932.00, + 1022.00 + ], + [ + 2934.00, + 1022.00 + ], + [ + 2936.00, + 1022.00 + ], + [ + 2961.33, + 1023.33 + ], + [ + 2961.33, + 1023.33 + ], + [ + 2961.33, + 1023.33 + ], + [ + 2979.33, + 1026.67 + ], + [ + 2979.33, + 1026.67 + ], + [ + 2979.33, + 1026.67 + ], + [ + 3002.67, + 1018.00 + ], + [ + 3002.67, + 1018.00 + ], + [ + 3002.67, + 1018.00 + ], + [ + 3023.33, + 1010.67 + ], + [ + 3023.33, + 1010.67 + ], + [ + 3023.33, + 1010.67 + ], + [ + 3037.33, + 1004.67 + ], + [ + 3037.33, + 1004.67 + ], + [ + 3037.33, + 1004.67 + ], + [ + 3058.67, + 1002.67 + ], + [ + 3059.33, + 1002.00 + ], + [ + 3060.00, + 1001.33 + ], + [ + 3076.67, + 994.67 + ], + [ + 3076.67, + 994.67 + ], + [ + 3076.67, + 994.67 + ], + [ + 3096.00, + 988.00 + ], + [ + 3096.00, + 988.00 + ], + [ + 3096.00, + 988.00 + ], + [ + 3118.67, + 982.00 + ], + [ + 3118.67, + 982.00 + ], + [ + 3118.67, + 982.00 + ], + [ + 3131.33, + 978.00 + ], + [ + 3131.33, + 978.00 + ], + [ + 3131.33, + 978.00 + ], + [ + 3149.33, + 972.00 + ], + [ + 3149.33, + 972.00 + ], + [ + 3149.33, + 972.00 + ], + [ + 3174.67, + 969.33 + ], + [ + 3174.67, + 968.67 + ], + [ + 3174.67, + 968.00 + ], + [ + 3215.33, + 959.33 + ], + [ + 3215.33, + 959.33 + ], + [ + 3215.33, + 959.33 + ], + [ + 3232.00, + 946.67 + ], + [ + 3232.00, + 946.67 + ], + [ + 3232.00, + 946.67 + ], + [ + 3252.00, + 930.00 + ], + [ + 3252.00, + 929.33 + ], + [ + 3252.00, + 928.67 + ], + [ + 3264.67, + 916.67 + ], + [ + 3264.67, + 916.67 + ], + [ + 3264.67, + 916.67 + ], + [ + 3273.33, + 904.00 + ], + [ + 3273.33, + 904.00 + ], + [ + 3273.33, + 904.00 + ], + [ + 3281.33, + 890.67 + ], + [ + 3281.33, + 890.67 + ], + [ + 3281.33, + 890.67 + ], + [ + 3290.67, + 877.33 + ], + [ + 3290.67, + 877.33 + ], + [ + 3290.67, + 877.33 + ], + [ + 3302.00, + 870.00 + ], + [ + 3302.00, + 870.00 + ], + [ + 3302.00, + 870.00 + ], + [ + 3311.33, + 874.67 + ], + [ + 3311.33, + 874.67 + ], + [ + 3311.33, + 874.67 + ], + [ + 3314.00, + 880.00 + ], + [ + 3314.00, + 880.00 + ], + [ + 3314.00, + 880.00 + ], + [ + 3320.67, + 882.67 + ], + [ + 3320.67, + 882.67 + ], + [ + 3320.67, + 882.67 + ], + [ + 3334.67, + 882.67 + ], + [ + 3335.33, + 882.67 + ], + [ + 3336.00, + 882.67 + ], + [ + 3344.00, + 882.67 + ], + [ + 3344.67, + 883.33 + ], + [ + 3345.33, + 884.00 + ], + [ + 3354.67, + 884.67 + ], + [ + 3355.33, + 884.67 + ], + [ + 3356.00, + 884.67 + ], + [ + 3373.33, + 886.00 + ], + [ + 3373.33, + 886.00 + ], + [ + 3373.33, + 886.00 + ], + [ + 3388.00, + 886.67 + ], + [ + 3388.00, + 886.67 + ], + [ + 3388.00, + 886.67 + ], + [ + 3398.00, + 887.33 + ], + [ + 3398.00, + 887.33 + ], + [ + 3398.00, + 887.33 + ], + [ + 3408.00, + 886.67 + ], + [ + 3408.00, + 886.67 + ], + [ + 3408.00, + 886.67 + ], + [ + 3419.33, + 886.67 + ], + [ + 3419.33, + 886.67 + ], + [ + 3419.33, + 886.67 + ], + [ + 3425.33, + 874.67 + ], + [ + 3425.33, + 874.00 + ], + [ + 3425.33, + 873.33 + ], + [ + 3430.67, + 857.33 + ], + [ + 3430.67, + 857.33 + ], + [ + 3430.67, + 857.33 + ], + [ + 3431.33, + 842.00 + ], + [ + 3431.33, + 842.00 + ], + [ + 3431.33, + 842.00 + ], + [ + 3432.00, + 834.00 + ], + [ + 3432.00, + 834.00 + ], + [ + 3432.00, + 834.00 + ], + [ + 3422.00, + 836.67 + ], + [ + 3421.33, + 836.67 + ], + [ + 3420.67, + 836.67 + ], + [ + 3411.33, + 827.33 + ], + [ + 3411.33, + 827.33 + ], + [ + 3411.33, + 827.33 + ], + [ + 3406.00, + 816.67 + ], + [ + 3406.00, + 816.67 + ] + ] + }, + { + "name": "Frodo & Sam", + "id": "frodo_sam", + "color": "orange", + "distance": "1600 miles / 2600 km", + "startDate": "September 23, T.A. 3018", + "endDate": "March 25, T.A. 3019", + "path": [ + [ + 1484.00, + 1162.00 + ], + [ + 1492.00, + 1176.00 + ], + [ + 1492.00, + 1176.00 + ], + [ + 1492.00, + 1176.00 + ], + [ + 1502.00, + 1184.00 + ], + [ + 1502.00, + 1184.00 + ], + [ + 1502.00, + 1184.00 + ], + [ + 1511.00, + 1195.00 + ], + [ + 1511.00, + 1195.00 + ], + [ + 1511.00, + 1195.00 + ], + [ + 1532.00, + 1207.00 + ], + [ + 1532.00, + 1207.00 + ], + [ + 1532.00, + 1207.00 + ], + [ + 1554.00, + 1217.00 + ], + [ + 1554.00, + 1217.00 + ], + [ + 1554.00, + 1217.00 + ], + [ + 1574.00, + 1220.00 + ], + [ + 1574.00, + 1220.00 + ], + [ + 1574.00, + 1220.00 + ], + [ + 1588.00, + 1221.00 + ], + [ + 1588.00, + 1221.00 + ], + [ + 1588.00, + 1221.00 + ], + [ + 1597.00, + 1213.00 + ], + [ + 1597.00, + 1213.00 + ], + [ + 1597.00, + 1213.00 + ], + [ + 1608.00, + 1208.00 + ], + [ + 1608.00, + 1208.00 + ], + [ + 1608.00, + 1208.00 + ], + [ + 1618.00, + 1208.00 + ], + [ + 1618.00, + 1208.00 + ], + [ + 1618.00, + 1208.00 + ], + [ + 1639.00, + 1208.00 + ], + [ + 1639.00, + 1208.00 + ], + [ + 1639.00, + 1208.00 + ], + [ + 1652.00, + 1207.00 + ], + [ + 1652.00, + 1207.00 + ], + [ + 1652.00, + 1207.00 + ], + [ + 1659.00, + 1204.00 + ], + [ + 1661.00, + 1204.00 + ], + [ + 1663.00, + 1204.00 + ], + [ + 1682.00, + 1201.00 + ], + [ + 1683.00, + 1201.00 + ], + [ + 1684.00, + 1201.00 + ], + [ + 1692.00, + 1199.00 + ], + [ + 1693.00, + 1199.00 + ], + [ + 1694.00, + 1199.00 + ], + [ + 1704.00, + 1201.00 + ], + [ + 1704.00, + 1201.00 + ], + [ + 1704.00, + 1201.00 + ], + [ + 1716.00, + 1200.00 + ], + [ + 1717.00, + 1200.00 + ], + [ + 1718.00, + 1200.00 + ], + [ + 1744.00, + 1201.00 + ], + [ + 1744.00, + 1201.00 + ], + [ + 1744.00, + 1201.00 + ], + [ + 1757.00, + 1202.00 + ], + [ + 1757.00, + 1202.00 + ], + [ + 1757.00, + 1202.00 + ], + [ + 1772.00, + 1209.00 + ], + [ + 1772.00, + 1209.00 + ], + [ + 1772.00, + 1209.00 + ], + [ + 1786.00, + 1215.00 + ], + [ + 1786.00, + 1215.00 + ], + [ + 1786.00, + 1215.00 + ], + [ + 1781.00, + 1200.00 + ], + [ + 1781.00, + 1200.00 + ], + [ + 1781.00, + 1200.00 + ], + [ + 1780.00, + 1187.00 + ], + [ + 1780.00, + 1187.00 + ], + [ + 1780.00, + 1187.00 + ], + [ + 1773.00, + 1176.00 + ], + [ + 1776.00, + 1174.00 + ], + [ + 1779.00, + 1172.00 + ], + [ + 1792.00, + 1160.00 + ], + [ + 1792.00, + 1160.00 + ], + [ + 1792.00, + 1160.00 + ], + [ + 1800.00, + 1150.00 + ], + [ + 1802.00, + 1149.00 + ], + [ + 1804.00, + 1148.00 + ], + [ + 1818.00, + 1134.00 + ], + [ + 1818.00, + 1134.00 + ], + [ + 1818.00, + 1134.00 + ], + [ + 1830.00, + 1129.00 + ], + [ + 1839.00, + 1129.00 + ], + [ + 1848.00, + 1129.00 + ], + [ + 1879.00, + 1132.00 + ], + [ + 1879.00, + 1132.00 + ], + [ + 1879.00, + 1132.00 + ], + [ + 1900.00, + 1132.00 + ], + [ + 1901.00, + 1132.00 + ], + [ + 1902.00, + 1132.00 + ], + [ + 1951.00, + 1133.00 + ], + [ + 1951.00, + 1133.00 + ], + [ + 1951.00, + 1133.00 + ], + [ + 1965.00, + 1137.00 + ], + [ + 1965.00, + 1137.00 + ], + [ + 1965.00, + 1137.00 + ], + [ + 1978.00, + 1145.00 + ], + [ + 1978.00, + 1145.00 + ], + [ + 1978.00, + 1145.00 + ], + [ + 1999.00, + 1151.00 + ], + [ + 1999.00, + 1151.00 + ], + [ + 1999.00, + 1151.00 + ], + [ + 1999.00, + 1169.00 + ], + [ + 1999.00, + 1169.00 + ], + [ + 1999.00, + 1169.00 + ], + [ + 1999.00, + 1178.00 + ], + [ + 2000.00, + 1180.00 + ], + [ + 2001.00, + 1182.00 + ], + [ + 2006.00, + 1189.00 + ], + [ + 2009.00, + 1193.00 + ], + [ + 2012.00, + 1197.00 + ], + [ + 2018.00, + 1197.00 + ], + [ + 2025.00, + 1200.00 + ], + [ + 2032.00, + 1203.00 + ], + [ + 2055.00, + 1204.00 + ], + [ + 2055.00, + 1204.00 + ], + [ + 2055.00, + 1204.00 + ], + [ + 2088.00, + 1204.00 + ], + [ + 2089.00, + 1204.00 + ], + [ + 2090.00, + 1204.00 + ], + [ + 2106.00, + 1200.00 + ], + [ + 2108.00, + 1200.00 + ], + [ + 2110.00, + 1200.00 + ], + [ + 2129.00, + 1199.00 + ], + [ + 2134.00, + 1197.00 + ], + [ + 2139.00, + 1195.00 + ], + [ + 2168.00, + 1193.00 + ], + [ + 2172.00, + 1191.00 + ], + [ + 2176.00, + 1189.00 + ], + [ + 2184.00, + 1178.00 + ], + [ + 2190.00, + 1175.00 + ], + [ + 2196.00, + 1172.00 + ], + [ + 2208.00, + 1166.00 + ], + [ + 2211.00, + 1165.00 + ], + [ + 2214.00, + 1164.00 + ], + [ + 2222.00, + 1157.00 + ], + [ + 2226.00, + 1155.00 + ], + [ + 2230.00, + 1153.00 + ], + [ + 2240.00, + 1147.00 + ], + [ + 2243.00, + 1145.00 + ], + [ + 2246.00, + 1143.00 + ], + [ + 2262.00, + 1136.00 + ], + [ + 2262.00, + 1136.00 + ], + [ + 2262.00, + 1136.00 + ], + [ + 2273.00, + 1133.00 + ], + [ + 2274.00, + 1133.00 + ], + [ + 2275.00, + 1133.00 + ], + [ + 2287.00, + 1117.00 + ], + [ + 2287.00, + 1117.00 + ], + [ + 2287.00, + 1117.00 + ], + [ + 2289.00, + 1115.00 + ], + [ + 2293.00, + 1109.00 + ], + [ + 2297.00, + 1103.00 + ], + [ + 2304.00, + 1097.00 + ], + [ + 2304.00, + 1096.00 + ], + [ + 2304.00, + 1095.00 + ], + [ + 2306.00, + 1094.00 + ], + [ + 2309.00, + 1086.00 + ], + [ + 2312.00, + 1078.00 + ], + [ + 2324.00, + 1055.00 + ], + [ + 2324.00, + 1055.00 + ], + [ + 2324.00, + 1055.00 + ], + [ + 2334.00, + 1045.00 + ], + [ + 2334.00, + 1045.00 + ], + [ + 2334.00, + 1045.00 + ], + [ + 2336.00, + 1059.00 + ], + [ + 2335.00, + 1060.00 + ], + [ + 2334.00, + 1061.00 + ], + [ + 2331.00, + 1072.00 + ], + [ + 2331.00, + 1073.00 + ], + [ + 2331.00, + 1074.00 + ], + [ + 2328.00, + 1079.00 + ], + [ + 2328.00, + 1084.00 + ], + [ + 2328.00, + 1089.00 + ], + [ + 2336.00, + 1109.00 + ], + [ + 2337.00, + 1109.00 + ], + [ + 2338.00, + 1109.00 + ], + [ + 2338.00, + 1110.00 + ], + [ + 2339.00, + 1115.00 + ], + [ + 2351.00, + 1129.00 + ], + [ + 2360.00, + 1132.00 + ], + [ + 2361.00, + 1133.00 + ], + [ + 2362.00, + 1134.00 + ], + [ + 2385.00, + 1144.00 + ], + [ + 2385.00, + 1144.00 + ], + [ + 2385.00, + 1144.00 + ], + [ + 2391.00, + 1145.00 + ], + [ + 2395.00, + 1145.00 + ], + [ + 2399.00, + 1145.00 + ], + [ + 2404.00, + 1145.00 + ], + [ + 2407.00, + 1146.00 + ], + [ + 2410.00, + 1147.00 + ], + [ + 2421.00, + 1145.00 + ], + [ + 2421.00, + 1145.00 + ], + [ + 2421.00, + 1145.00 + ], + [ + 2443.00, + 1148.00 + ], + [ + 2443.00, + 1148.00 + ], + [ + 2443.00, + 1148.00 + ], + [ + 2453.00, + 1149.00 + ], + [ + 2454.00, + 1150.00 + ], + [ + 2455.00, + 1151.00 + ], + [ + 2470.00, + 1151.00 + ], + [ + 2470.00, + 1151.00 + ], + [ + 2470.00, + 1151.00 + ], + [ + 2484.00, + 1156.00 + ], + [ + 2484.00, + 1156.00 + ], + [ + 2484.00, + 1156.00 + ], + [ + 2492.00, + 1152.00 + ], + [ + 2492.00, + 1152.00 + ], + [ + 2492.00, + 1152.00 + ], + [ + 2507.00, + 1148.00 + ], + [ + 2507.00, + 1148.00 + ], + [ + 2507.00, + 1148.00 + ], + [ + 2514.00, + 1133.00 + ], + [ + 2514.00, + 1133.00 + ], + [ + 2501.00, + 1163.00 + ], + [ + 2500.00, + 1164.00 + ], + [ + 2505.00, + 1179.00 + ], + [ + 2505.00, + 1179.00 + ], + [ + 2505.00, + 1179.00 + ], + [ + 2510.00, + 1190.00 + ], + [ + 2510.00, + 1190.00 + ], + [ + 2510.00, + 1190.00 + ], + [ + 2515.00, + 1203.00 + ], + [ + 2516.00, + 1207.00 + ], + [ + 2517.00, + 1211.00 + ], + [ + 2509.00, + 1232.00 + ], + [ + 2509.00, + 1232.00 + ], + [ + 2509.00, + 1232.00 + ], + [ + 2509.00, + 1234.00 + ], + [ + 2507.00, + 1238.00 + ], + [ + 2505.00, + 1242.00 + ], + [ + 2494.00, + 1272.00 + ], + [ + 2492.00, + 1274.00 + ], + [ + 2490.00, + 1276.00 + ], + [ + 2493.00, + 1282.00 + ], + [ + 2491.00, + 1288.00 + ], + [ + 2471.00, + 1332.00 + ], + [ + 2473.00, + 1333.00 + ], + [ + 2470.00, + 1341.00 + ], + [ + 2467.00, + 1349.00 + ], + [ + 2466.00, + 1349.00 + ], + [ + 2463.00, + 1356.00 + ], + [ + 2457.00, + 1368.00 + ], + [ + 2448.00, + 1377.00 + ], + [ + 2448.00, + 1377.00 + ], + [ + 2448.00, + 1377.00 + ], + [ + 2462.00, + 1388.00 + ], + [ + 2462.00, + 1388.00 + ], + [ + 2462.00, + 1388.00 + ], + [ + 2485.00, + 1394.00 + ], + [ + 2485.00, + 1394.00 + ], + [ + 2485.00, + 1394.00 + ], + [ + 2499.00, + 1399.00 + ], + [ + 2501.00, + 1399.00 + ], + [ + 2503.00, + 1399.00 + ], + [ + 2517.00, + 1403.00 + ], + [ + 2516.00, + 1404.00 + ], + [ + 2515.00, + 1405.00 + ], + [ + 2498.00, + 1405.00 + ], + [ + 2498.00, + 1405.00 + ], + [ + 2498.00, + 1405.00 + ], + [ + 2484.00, + 1405.00 + ], + [ + 2476.00, + 1403.00 + ], + [ + 2468.00, + 1401.00 + ], + [ + 2465.00, + 1401.00 + ], + [ + 2460.00, + 1402.00 + ], + [ + 2455.00, + 1403.00 + ], + [ + 2441.00, + 1405.00 + ], + [ + 2440.00, + 1407.00 + ], + [ + 2439.00, + 1409.00 + ], + [ + 2436.00, + 1416.00 + ], + [ + 2434.00, + 1420.00 + ], + [ + 2432.00, + 1424.00 + ], + [ + 2427.00, + 1438.00 + ], + [ + 2426.00, + 1439.00 + ], + [ + 2425.00, + 1440.00 + ], + [ + 2421.00, + 1450.00 + ], + [ + 2419.00, + 1454.00 + ], + [ + 2417.00, + 1458.00 + ], + [ + 2411.00, + 1469.00 + ], + [ + 2410.00, + 1472.00 + ], + [ + 2409.00, + 1475.00 + ], + [ + 2405.00, + 1481.00 + ], + [ + 2403.00, + 1489.00 + ], + [ + 2401.00, + 1497.00 + ], + [ + 2400.00, + 1506.00 + ], + [ + 2399.00, + 1508.00 + ], + [ + 2398.00, + 1510.00 + ], + [ + 2394.00, + 1524.00 + ], + [ + 2394.00, + 1527.00 + ], + [ + 2394.00, + 1530.00 + ], + [ + 2401.00, + 1534.00 + ], + [ + 2404.00, + 1536.00 + ], + [ + 2407.00, + 1538.00 + ], + [ + 2426.00, + 1541.00 + ], + [ + 2427.00, + 1541.00 + ], + [ + 2428.00, + 1541.00 + ], + [ + 2439.00, + 1539.00 + ], + [ + 2439.00, + 1539.00 + ], + [ + 2439.00, + 1539.00 + ], + [ + 2457.00, + 1538.00 + ], + [ + 2457.00, + 1538.00 + ], + [ + 2457.00, + 1538.00 + ], + [ + 2469.00, + 1534.00 + ], + [ + 2473.00, + 1534.00 + ], + [ + 2477.00, + 1534.00 + ], + [ + 2503.00, + 1536.00 + ], + [ + 2503.00, + 1536.00 + ], + [ + 2503.00, + 1536.00 + ], + [ + 2512.00, + 1535.00 + ], + [ + 2513.00, + 1535.00 + ], + [ + 2514.00, + 1535.00 + ], + [ + 2526.00, + 1538.00 + ], + [ + 2526.00, + 1538.00 + ], + [ + 2526.00, + 1538.00 + ], + [ + 2536.00, + 1544.00 + ], + [ + 2537.00, + 1545.00 + ], + [ + 2538.00, + 1546.00 + ], + [ + 2551.00, + 1557.00 + ], + [ + 2551.00, + 1557.00 + ], + [ + 2551.00, + 1557.00 + ], + [ + 2558.00, + 1574.00 + ], + [ + 2558.00, + 1574.00 + ], + [ + 2558.00, + 1574.00 + ], + [ + 2565.00, + 1594.00 + ], + [ + 2565.00, + 1594.00 + ], + [ + 2565.00, + 1594.00 + ], + [ + 2576.00, + 1604.00 + ], + [ + 2576.00, + 1604.00 + ], + [ + 2576.00, + 1604.00 + ], + [ + 2593.00, + 1611.00 + ], + [ + 2593.00, + 1611.00 + ], + [ + 2593.00, + 1611.00 + ], + [ + 2601.00, + 1628.00 + ], + [ + 2601.00, + 1628.00 + ], + [ + 2601.00, + 1628.00 + ], + [ + 2598.00, + 1646.00 + ], + [ + 2598.00, + 1647.00 + ], + [ + 2598.00, + 1648.00 + ], + [ + 2611.00, + 1652.00 + ], + [ + 2612.00, + 1653.00 + ], + [ + 2613.00, + 1654.00 + ], + [ + 2624.00, + 1666.00 + ], + [ + 2624.00, + 1667.00 + ], + [ + 2624.00, + 1668.00 + ], + [ + 2632.00, + 1676.00 + ], + [ + 2634.00, + 1678.00 + ], + [ + 2636.00, + 1680.00 + ], + [ + 2644.00, + 1684.00 + ], + [ + 2645.00, + 1685.00 + ], + [ + 2646.00, + 1686.00 + ], + [ + 2658.00, + 1694.00 + ], + [ + 2659.00, + 1694.00 + ], + [ + 2660.00, + 1694.00 + ], + [ + 2673.00, + 1700.00 + ], + [ + 2673.00, + 1700.00 + ], + [ + 2673.00, + 1700.00 + ], + [ + 2696.00, + 1713.00 + ], + [ + 2696.00, + 1713.00 + ], + [ + 2696.00, + 1713.00 + ], + [ + 2720.00, + 1723.00 + ], + [ + 2720.00, + 1723.00 + ], + [ + 2720.00, + 1723.00 + ], + [ + 2744.00, + 1727.00 + ], + [ + 2744.00, + 1728.00 + ], + [ + 2744.00, + 1729.00 + ], + [ + 2770.00, + 1732.00 + ], + [ + 2770.00, + 1732.00 + ], + [ + 2770.00, + 1732.00 + ], + [ + 2787.00, + 1745.00 + ], + [ + 2787.00, + 1746.00 + ], + [ + 2787.00, + 1747.00 + ], + [ + 2778.00, + 1761.00 + ], + [ + 2784.00, + 1767.00 + ], + [ + 2790.00, + 1773.00 + ], + [ + 2791.00, + 1784.00 + ], + [ + 2791.00, + 1786.00 + ], + [ + 2791.00, + 1788.00 + ], + [ + 2794.00, + 1803.00 + ], + [ + 2794.00, + 1803.00 + ], + [ + 2794.00, + 1803.00 + ], + [ + 2799.00, + 1810.00 + ], + [ + 2801.00, + 1811.00 + ], + [ + 2803.00, + 1812.00 + ], + [ + 2815.00, + 1819.00 + ], + [ + 2818.00, + 1820.00 + ], + [ + 2821.00, + 1821.00 + ], + [ + 2836.00, + 1827.00 + ], + [ + 2837.00, + 1828.00 + ], + [ + 2838.00, + 1829.00 + ], + [ + 2849.00, + 1837.00 + ], + [ + 2850.00, + 1837.00 + ], + [ + 2851.00, + 1837.00 + ], + [ + 2864.00, + 1845.00 + ], + [ + 2866.00, + 1847.00 + ], + [ + 2868.00, + 1849.00 + ], + [ + 2876.00, + 1854.00 + ], + [ + 2881.00, + 1858.00 + ], + [ + 2886.00, + 1862.00 + ], + [ + 2899.00, + 1873.00 + ], + [ + 2900.00, + 1874.00 + ], + [ + 2901.00, + 1875.00 + ], + [ + 2907.00, + 1879.00 + ], + [ + 2910.00, + 1880.00 + ], + [ + 2913.00, + 1881.00 + ], + [ + 2934.00, + 1888.00 + ], + [ + 2934.00, + 1888.00 + ], + [ + 2934.00, + 1888.00 + ], + [ + 2939.00, + 1886.00 + ], + [ + 2943.00, + 1890.00 + ], + [ + 2947.00, + 1894.00 + ], + [ + 2956.00, + 1900.00 + ], + [ + 2956.00, + 1901.00 + ], + [ + 2956.00, + 1902.00 + ], + [ + 2955.00, + 1909.00 + ], + [ + 2955.00, + 1910.00 + ], + [ + 2955.00, + 1911.00 + ], + [ + 2950.00, + 1920.00 + ], + [ + 2949.00, + 1922.00 + ], + [ + 2948.00, + 1924.00 + ], + [ + 2941.00, + 1932.00 + ], + [ + 2941.00, + 1934.00 + ], + [ + 2941.00, + 1936.00 + ], + [ + 2938.00, + 1957.00 + ], + [ + 2938.00, + 1957.00 + ], + [ + 2938.00, + 1957.00 + ], + [ + 2944.00, + 1967.00 + ], + [ + 2945.00, + 1969.00 + ], + [ + 2946.00, + 1971.00 + ], + [ + 2948.00, + 1976.00 + ], + [ + 2954.00, + 1980.00 + ], + [ + 2960.00, + 1984.00 + ], + [ + 2966.00, + 1985.00 + ], + [ + 2966.00, + 1985.00 + ], + [ + 2966.00, + 1985.00 + ], + [ + 2973.00, + 1985.00 + ], + [ + 2973.00, + 1985.00 + ], + [ + 2973.00, + 1985.00 + ], + [ + 2990.00, + 1983.00 + ], + [ + 2990.00, + 1983.00 + ], + [ + 2990.00, + 1983.00 + ], + [ + 3007.00, + 1976.00 + ], + [ + 3007.00, + 1976.00 + ], + [ + 3007.00, + 1976.00 + ], + [ + 3027.00, + 1984.00 + ], + [ + 3027.00, + 1985.00 + ], + [ + 3027.00, + 1986.00 + ], + [ + 3031.00, + 1999.00 + ], + [ + 3031.00, + 2001.00 + ], + [ + 3031.00, + 2003.00 + ], + [ + 3022.00, + 2020.00 + ], + [ + 3021.00, + 2021.00 + ], + [ + 3020.00, + 2022.00 + ], + [ + 3011.00, + 2038.00 + ], + [ + 3010.00, + 2039.00 + ], + [ + 3009.00, + 2040.00 + ], + [ + 3003.00, + 2048.00 + ], + [ + 3003.00, + 2052.00 + ], + [ + 3003.00, + 2056.00 + ], + [ + 3004.00, + 2070.00 + ], + [ + 3005.00, + 2071.00 + ], + [ + 3006.00, + 2072.00 + ], + [ + 3025.00, + 2081.00 + ], + [ + 3025.00, + 2081.00 + ], + [ + 3025.00, + 2081.00 + ], + [ + 3043.00, + 2090.00 + ], + [ + 3043.00, + 2090.00 + ], + [ + 3043.00, + 2090.00 + ], + [ + 3054.00, + 2100.00 + ], + [ + 3054.00, + 2100.00 + ], + [ + 3054.00, + 2100.00 + ], + [ + 3054.00, + 2113.00 + ], + [ + 3054.00, + 2114.00 + ], + [ + 3054.00, + 2115.00 + ], + [ + 3053.00, + 2130.00 + ], + [ + 3052.00, + 2131.00 + ], + [ + 3051.00, + 2132.00 + ], + [ + 3046.00, + 2149.00 + ], + [ + 3046.00, + 2150.00 + ], + [ + 3046.00, + 2151.00 + ], + [ + 3043.00, + 2164.00 + ], + [ + 3043.00, + 2164.00 + ], + [ + 3043.00, + 2164.00 + ], + [ + 3039.00, + 2176.00 + ], + [ + 3039.00, + 2177.00 + ], + [ + 3039.00, + 2178.00 + ], + [ + 3034.00, + 2188.00 + ], + [ + 3033.00, + 2191.00 + ], + [ + 3032.00, + 2194.00 + ], + [ + 3030.00, + 2208.00 + ], + [ + 3029.00, + 2212.00 + ], + [ + 3028.00, + 2216.00 + ], + [ + 3024.00, + 2226.00 + ], + [ + 3024.00, + 2229.00 + ], + [ + 3024.00, + 2232.00 + ], + [ + 3028.00, + 2247.00 + ], + [ + 3028.00, + 2250.00 + ], + [ + 3028.00, + 2253.00 + ], + [ + 3031.00, + 2267.00 + ], + [ + 3031.00, + 2269.00 + ], + [ + 3031.00, + 2271.00 + ], + [ + 3033.00, + 2283.00 + ], + [ + 3035.00, + 2286.00 + ], + [ + 3037.00, + 2289.00 + ], + [ + 3039.00, + 2303.00 + ], + [ + 3039.00, + 2303.00 + ], + [ + 3039.00, + 2303.00 + ], + [ + 3042.00, + 2321.00 + ], + [ + 3042.00, + 2321.00 + ], + [ + 3042.00, + 2321.00 + ], + [ + 3045.00, + 2343.00 + ], + [ + 3045.00, + 2346.00 + ], + [ + 3045.00, + 2349.00 + ], + [ + 3053.00, + 2366.00 + ], + [ + 3053.00, + 2367.00 + ], + [ + 3053.00, + 2368.00 + ], + [ + 3068.00, + 2372.00 + ], + [ + 3070.00, + 2371.00 + ], + [ + 3072.00, + 2370.00 + ], + [ + 3096.00, + 2355.00 + ], + [ + 3097.00, + 2353.00 + ], + [ + 3098.00, + 2351.00 + ], + [ + 3100.00, + 2351.00 + ], + [ + 3105.00, + 2342.00 + ], + [ + 3110.00, + 2333.00 + ], + [ + 3113.00, + 2320.00 + ], + [ + 3116.00, + 2317.00 + ], + [ + 3119.00, + 2314.00 + ], + [ + 3123.00, + 2310.00 + ], + [ + 3128.00, + 2303.00 + ], + [ + 3133.00, + 2296.00 + ], + [ + 3137.00, + 2288.00 + ], + [ + 3142.00, + 2284.00 + ], + [ + 3147.00, + 2280.00 + ], + [ + 3150.00, + 2274.00 + ], + [ + 3153.00, + 2273.00 + ], + [ + 3156.00, + 2272.00 + ], + [ + 3154.00, + 2270.00 + ], + [ + 3165.00, + 2269.00 + ], + [ + 3186.00, + 2268.00 + ], + [ + 3191.00, + 2268.00 + ], + [ + 3198.00, + 2273.00 + ], + [ + 3205.00, + 2278.00 + ], + [ + 3212.00, + 2278.00 + ], + [ + 3219.00, + 2284.00 + ], + [ + 3237.00, + 2300.00 + ], + [ + 3242.00, + 2303.00 + ], + [ + 3250.00, + 2308.00 + ], + [ + 3258.00, + 2313.00 + ], + [ + 3261.00, + 2317.00 + ], + [ + 3270.00, + 2322.00 + ], + [ + 3279.00, + 2327.00 + ], + [ + 3285.00, + 2329.00 + ], + [ + 3287.00, + 2330.00 + ], + [ + 3289.00, + 2331.00 + ], + [ + 3307.00, + 2338.00 + ], + [ + 3307.00, + 2338.00 + ], + [ + 3307.00, + 2338.00 + ], + [ + 3314.00, + 2348.00 + ], + [ + 3318.00, + 2349.00 + ], + [ + 3327.00, + 2352.00 + ], + [ + 3334.00, + 2356.00 + ], + [ + 3337.00, + 2357.00 + ], + [ + 3344.00, + 2360.00 + ], + [ + 3355.00, + 2368.00 + ], + [ + 3355.00, + 2368.00 + ], + [ + 3355.00, + 2368.00 + ], + [ + 3342.00, + 2383.00 + ], + [ + 3342.00, + 2383.00 + ], + [ + 3342.00, + 2383.00 + ], + [ + 3330.00, + 2397.00 + ], + [ + 3330.00, + 2398.00 + ], + [ + 3330.00, + 2399.00 + ], + [ + 3320.00, + 2420.00 + ], + [ + 3320.00, + 2422.00 + ], + [ + 3320.00, + 2424.00 + ], + [ + 3315.00, + 2446.00 + ], + [ + 3315.00, + 2447.00 + ], + [ + 3315.00, + 2448.00 + ], + [ + 3315.00, + 2461.00 + ], + [ + 3316.00, + 2464.00 + ], + [ + 3317.00, + 2467.00 + ], + [ + 3316.00, + 2490.00 + ], + [ + 3316.00, + 2490.00 + ], + [ + 3316.00, + 2490.00 + ], + [ + 3317.00, + 2516.00 + ], + [ + 3317.00, + 2516.00 + ], + [ + 3317.00, + 2516.00 + ], + [ + 3318.00, + 2525.00 + ], + [ + 3318.00, + 2529.00 + ], + [ + 3318.00, + 2533.00 + ], + [ + 3319.00, + 2547.00 + ], + [ + 3321.00, + 2551.00 + ], + [ + 3323.00, + 2555.00 + ], + [ + 3330.00, + 2566.00 + ], + [ + 3331.00, + 2573.00 + ], + [ + 3332.00, + 2580.00 + ], + [ + 3334.00, + 2593.00 + ], + [ + 3334.00, + 2599.00 + ], + [ + 3334.00, + 2605.00 + ], + [ + 3336.00, + 2608.00 + ], + [ + 3337.00, + 2613.00 + ], + [ + 3338.00, + 2618.00 + ], + [ + 3340.00, + 2622.00 + ], + [ + 3340.00, + 2628.00 + ], + [ + 3340.00, + 2634.00 + ], + [ + 3345.00, + 2652.00 + ], + [ + 3345.00, + 2653.00 + ], + [ + 3345.00, + 2662.00 + ], + [ + 3351.00, + 2668.00 + ], + [ + 3352.00, + 2668.00 + ], + [ + 3353.00, + 2668.00 + ], + [ + 3377.00, + 2672.00 + ], + [ + 3378.00, + 2672.00 + ], + [ + 3379.00, + 2672.00 + ], + [ + 3397.00, + 2671.00 + ], + [ + 3400.00, + 2670.00 + ], + [ + 3403.00, + 2669.00 + ], + [ + 3406.00, + 2668.00 + ], + [ + 3409.00, + 2668.00 + ], + [ + 3412.00, + 2668.00 + ], + [ + 3424.00, + 2670.00 + ], + [ + 3428.00, + 2671.00 + ], + [ + 3432.00, + 2672.00 + ], + [ + 3439.00, + 2673.00 + ], + [ + 3440.00, + 2673.00 + ], + [ + 3441.00, + 2673.00 + ], + [ + 3443.00, + 2675.00 + ], + [ + 3447.00, + 2674.00 + ], + [ + 3451.00, + 2673.00 + ], + [ + 3450.00, + 2653.00 + ], + [ + 3450.00, + 2653.00 + ], + [ + 3450.00, + 2653.00 + ], + [ + 3449.00, + 2646.00 + ], + [ + 3447.00, + 2643.00 + ], + [ + 3445.00, + 2640.00 + ], + [ + 3440.00, + 2634.00 + ], + [ + 3436.00, + 2629.00 + ], + [ + 3432.00, + 2624.00 + ], + [ + 3428.00, + 2616.00 + ], + [ + 3428.00, + 2615.00 + ], + [ + 3428.00, + 2614.00 + ], + [ + 3426.00, + 2605.00 + ], + [ + 3425.00, + 2596.00 + ], + [ + 3422.00, + 2578.00 + ], + [ + 3422.00, + 2575.00 + ], + [ + 3418.00, + 2565.00 + ], + [ + 3414.00, + 2555.00 + ], + [ + 3413.00, + 2549.00 + ], + [ + 3412.00, + 2545.00 + ], + [ + 3411.00, + 2541.00 + ], + [ + 3410.00, + 2534.00 + ], + [ + 3411.00, + 2530.00 + ], + [ + 3449.00, + 2518.00 + ], + [ + 3448.00, + 2517.00 + ], + [ + 3456.00, + 2517.00 + ], + [ + 3464.00, + 2517.00 + ], + [ + 3476.00, + 2517.00 + ], + [ + 3480.00, + 2518.00 + ], + [ + 3484.00, + 2519.00 + ], + [ + 3489.00, + 2520.00 + ], + [ + 3493.00, + 2519.00 + ], + [ + 3502.00, + 2512.00 + ], + [ + 3503.00, + 2512.00 + ], + [ + 3503.00, + 2505.00 + ], + [ + 3503.00, + 2489.00 + ], + [ + 3508.00, + 2484.00 + ], + [ + 3508.00, + 2484.00 + ], + [ + 3508.00, + 2484.00 + ], + [ + 3521.00, + 2482.00 + ], + [ + 3526.00, + 2481.00 + ], + [ + 3531.00, + 2480.00 + ], + [ + 3539.00, + 2481.00 + ], + [ + 3540.00, + 2480.00 + ], + [ + 3541.00, + 2479.00 + ], + [ + 3544.00, + 2478.00 + ], + [ + 3552.00, + 2479.00 + ], + [ + 3560.00, + 2480.00 + ], + [ + 3570.00, + 2481.00 + ], + [ + 3574.00, + 2482.00 + ], + [ + 3578.00, + 2483.00 + ], + [ + 3588.00, + 2484.00 + ], + [ + 3594.00, + 2485.00 + ], + [ + 3600.00, + 2486.00 + ], + [ + 3612.00, + 2486.00 + ], + [ + 3612.00, + 2486.00 + ], + [ + 3612.00, + 2486.00 + ], + [ + 3617.00, + 2488.00 + ], + [ + 3620.00, + 2492.00 + ], + [ + 3623.00, + 2496.00 + ], + [ + 3624.00, + 2496.00 + ], + [ + 3625.00, + 2503.00 + ], + [ + 3626.00, + 2510.00 + ], + [ + 3626.00, + 2510.00 + ], + [ + 3625.00, + 2516.00 + ], + [ + 3622.00, + 2534.00 + ], + [ + 3622.00, + 2536.00 + ], + [ + 3621.00, + 2541.00 + ] + ] + }, + { + "name": "Merry & Pippin", + "id": "merry_pippin", + "color": "brown", + "distance": "2100 miles / 3400 km", + "startDate": "September 23, T.A. 3018", + "endDate": "March 25, T.A. 3019", + "path": [ + [ + 1484.00, + 1161.00 + ], + [ + 1492.00, + 1175.00 + ], + [ + 1492.00, + 1175.00 + ], + [ + 1492.00, + 1175.00 + ], + [ + 1502.00, + 1183.00 + ], + [ + 1502.00, + 1183.00 + ], + [ + 1502.00, + 1183.00 + ], + [ + 1511.00, + 1194.00 + ], + [ + 1511.00, + 1194.00 + ], + [ + 1511.00, + 1194.00 + ], + [ + 1532.00, + 1206.00 + ], + [ + 1532.00, + 1206.00 + ], + [ + 1532.00, + 1206.00 + ], + [ + 1554.00, + 1216.00 + ], + [ + 1554.00, + 1216.00 + ], + [ + 1554.00, + 1216.00 + ], + [ + 1574.00, + 1219.00 + ], + [ + 1574.00, + 1219.00 + ], + [ + 1574.00, + 1219.00 + ], + [ + 1588.00, + 1220.00 + ], + [ + 1588.00, + 1220.00 + ], + [ + 1588.00, + 1220.00 + ], + [ + 1597.00, + 1212.00 + ], + [ + 1597.00, + 1212.00 + ], + [ + 1597.00, + 1212.00 + ], + [ + 1608.00, + 1207.00 + ], + [ + 1608.00, + 1207.00 + ], + [ + 1608.00, + 1207.00 + ], + [ + 1618.00, + 1207.00 + ], + [ + 1618.00, + 1207.00 + ], + [ + 1618.00, + 1207.00 + ], + [ + 1639.00, + 1207.00 + ], + [ + 1639.00, + 1207.00 + ], + [ + 1639.00, + 1207.00 + ], + [ + 1652.00, + 1206.00 + ], + [ + 1652.00, + 1206.00 + ], + [ + 1652.00, + 1206.00 + ], + [ + 1659.00, + 1203.00 + ], + [ + 1661.00, + 1203.00 + ], + [ + 1663.00, + 1203.00 + ], + [ + 1682.00, + 1200.00 + ], + [ + 1683.00, + 1200.00 + ], + [ + 1684.00, + 1200.00 + ], + [ + 1692.00, + 1198.00 + ], + [ + 1693.00, + 1198.00 + ], + [ + 1694.00, + 1198.00 + ], + [ + 1704.00, + 1200.00 + ], + [ + 1704.00, + 1200.00 + ], + [ + 1704.00, + 1200.00 + ], + [ + 1716.00, + 1199.00 + ], + [ + 1717.00, + 1199.00 + ], + [ + 1718.00, + 1199.00 + ], + [ + 1744.00, + 1200.00 + ], + [ + 1744.00, + 1200.00 + ], + [ + 1744.00, + 1200.00 + ], + [ + 1757.00, + 1201.00 + ], + [ + 1757.00, + 1201.00 + ], + [ + 1757.00, + 1201.00 + ], + [ + 1772.00, + 1208.00 + ], + [ + 1772.00, + 1208.00 + ], + [ + 1772.00, + 1208.00 + ], + [ + 1786.00, + 1214.00 + ], + [ + 1786.00, + 1214.00 + ], + [ + 1786.00, + 1214.00 + ], + [ + 1781.00, + 1199.00 + ], + [ + 1781.00, + 1199.00 + ], + [ + 1781.00, + 1199.00 + ], + [ + 1780.00, + 1186.00 + ], + [ + 1780.00, + 1186.00 + ], + [ + 1780.00, + 1186.00 + ], + [ + 1773.00, + 1175.00 + ], + [ + 1776.00, + 1173.00 + ], + [ + 1779.00, + 1171.00 + ], + [ + 1792.00, + 1159.00 + ], + [ + 1792.00, + 1159.00 + ], + [ + 1792.00, + 1159.00 + ], + [ + 1800.00, + 1149.00 + ], + [ + 1802.00, + 1148.00 + ], + [ + 1804.00, + 1147.00 + ], + [ + 1818.00, + 1133.00 + ], + [ + 1818.00, + 1133.00 + ], + [ + 1818.00, + 1133.00 + ], + [ + 1830.00, + 1128.00 + ], + [ + 1839.00, + 1128.00 + ], + [ + 1848.00, + 1128.00 + ], + [ + 1879.00, + 1131.00 + ], + [ + 1879.00, + 1131.00 + ], + [ + 1879.00, + 1131.00 + ], + [ + 1900.00, + 1131.00 + ], + [ + 1901.00, + 1131.00 + ], + [ + 1902.00, + 1131.00 + ], + [ + 1951.00, + 1132.00 + ], + [ + 1951.00, + 1132.00 + ], + [ + 1951.00, + 1132.00 + ], + [ + 1965.00, + 1136.00 + ], + [ + 1965.00, + 1136.00 + ], + [ + 1965.00, + 1136.00 + ], + [ + 1978.00, + 1144.00 + ], + [ + 1978.00, + 1144.00 + ], + [ + 1978.00, + 1144.00 + ], + [ + 1999.00, + 1150.00 + ], + [ + 1999.00, + 1150.00 + ], + [ + 1999.00, + 1150.00 + ], + [ + 1999.00, + 1168.00 + ], + [ + 1999.00, + 1168.00 + ], + [ + 1999.00, + 1168.00 + ], + [ + 1999.00, + 1177.00 + ], + [ + 2000.00, + 1179.00 + ], + [ + 2001.00, + 1181.00 + ], + [ + 2006.00, + 1188.00 + ], + [ + 2009.00, + 1192.00 + ], + [ + 2012.00, + 1196.00 + ], + [ + 2018.00, + 1196.00 + ], + [ + 2025.00, + 1199.00 + ], + [ + 2032.00, + 1202.00 + ], + [ + 2055.00, + 1203.00 + ], + [ + 2055.00, + 1203.00 + ], + [ + 2055.00, + 1203.00 + ], + [ + 2088.00, + 1203.00 + ], + [ + 2089.00, + 1203.00 + ], + [ + 2090.00, + 1203.00 + ], + [ + 2106.00, + 1199.00 + ], + [ + 2108.00, + 1199.00 + ], + [ + 2110.00, + 1199.00 + ], + [ + 2129.00, + 1198.00 + ], + [ + 2134.00, + 1196.00 + ], + [ + 2139.00, + 1194.00 + ], + [ + 2168.00, + 1192.00 + ], + [ + 2172.00, + 1190.00 + ], + [ + 2176.00, + 1188.00 + ], + [ + 2184.00, + 1177.00 + ], + [ + 2190.00, + 1174.00 + ], + [ + 2196.00, + 1171.00 + ], + [ + 2208.00, + 1165.00 + ], + [ + 2211.00, + 1164.00 + ], + [ + 2214.00, + 1163.00 + ], + [ + 2222.00, + 1156.00 + ], + [ + 2226.00, + 1154.00 + ], + [ + 2230.00, + 1152.00 + ], + [ + 2240.00, + 1146.00 + ], + [ + 2243.00, + 1144.00 + ], + [ + 2246.00, + 1142.00 + ], + [ + 2262.00, + 1135.00 + ], + [ + 2262.00, + 1135.00 + ], + [ + 2262.00, + 1135.00 + ], + [ + 2273.00, + 1132.00 + ], + [ + 2274.00, + 1132.00 + ], + [ + 2275.00, + 1132.00 + ], + [ + 2287.00, + 1116.00 + ], + [ + 2287.00, + 1116.00 + ], + [ + 2287.00, + 1116.00 + ], + [ + 2289.00, + 1114.00 + ], + [ + 2293.00, + 1108.00 + ], + [ + 2297.00, + 1102.00 + ], + [ + 2304.00, + 1096.00 + ], + [ + 2304.00, + 1095.00 + ], + [ + 2304.00, + 1094.00 + ], + [ + 2306.00, + 1093.00 + ], + [ + 2309.00, + 1085.00 + ], + [ + 2312.00, + 1077.00 + ], + [ + 2324.00, + 1054.00 + ], + [ + 2324.00, + 1054.00 + ], + [ + 2324.00, + 1054.00 + ], + [ + 2334.00, + 1044.00 + ], + [ + 2334.00, + 1044.00 + ], + [ + 2334.00, + 1044.00 + ], + [ + 2336.00, + 1058.00 + ], + [ + 2335.00, + 1059.00 + ], + [ + 2334.00, + 1060.00 + ], + [ + 2331.00, + 1071.00 + ], + [ + 2331.00, + 1072.00 + ], + [ + 2331.00, + 1073.00 + ], + [ + 2328.00, + 1078.00 + ], + [ + 2328.00, + 1083.00 + ], + [ + 2328.00, + 1088.00 + ], + [ + 2336.00, + 1108.00 + ], + [ + 2337.00, + 1108.00 + ], + [ + 2338.00, + 1108.00 + ], + [ + 2338.00, + 1109.00 + ], + [ + 2339.00, + 1114.00 + ], + [ + 2351.00, + 1128.00 + ], + [ + 2360.00, + 1131.00 + ], + [ + 2361.00, + 1132.00 + ], + [ + 2362.00, + 1133.00 + ], + [ + 2385.00, + 1143.00 + ], + [ + 2385.00, + 1143.00 + ], + [ + 2385.00, + 1143.00 + ], + [ + 2391.00, + 1144.00 + ], + [ + 2395.00, + 1144.00 + ], + [ + 2399.00, + 1144.00 + ], + [ + 2404.00, + 1144.00 + ], + [ + 2407.00, + 1145.00 + ], + [ + 2410.00, + 1146.00 + ], + [ + 2421.00, + 1144.00 + ], + [ + 2421.00, + 1144.00 + ], + [ + 2421.00, + 1144.00 + ], + [ + 2443.00, + 1147.00 + ], + [ + 2443.00, + 1147.00 + ], + [ + 2443.00, + 1147.00 + ], + [ + 2453.00, + 1148.00 + ], + [ + 2454.00, + 1149.00 + ], + [ + 2455.00, + 1150.00 + ], + [ + 2470.00, + 1150.00 + ], + [ + 2470.00, + 1150.00 + ], + [ + 2470.00, + 1150.00 + ], + [ + 2484.00, + 1155.00 + ], + [ + 2484.00, + 1155.00 + ], + [ + 2484.00, + 1155.00 + ], + [ + 2492.00, + 1151.00 + ], + [ + 2492.00, + 1151.00 + ], + [ + 2492.00, + 1151.00 + ], + [ + 2507.00, + 1147.00 + ], + [ + 2507.00, + 1147.00 + ], + [ + 2507.00, + 1147.00 + ], + [ + 2514.00, + 1132.00 + ], + [ + 2514.00, + 1132.00 + ], + [ + 2501.00, + 1162.00 + ], + [ + 2500.00, + 1163.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2515.00, + 1202.00 + ], + [ + 2516.00, + 1206.00 + ], + [ + 2517.00, + 1210.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2509.00, + 1233.00 + ], + [ + 2507.00, + 1237.00 + ], + [ + 2505.00, + 1241.00 + ], + [ + 2494.00, + 1271.00 + ], + [ + 2492.00, + 1273.00 + ], + [ + 2490.00, + 1275.00 + ], + [ + 2493.00, + 1281.00 + ], + [ + 2491.00, + 1287.00 + ], + [ + 2471.00, + 1331.00 + ], + [ + 2473.00, + 1332.00 + ], + [ + 2470.00, + 1340.00 + ], + [ + 2467.00, + 1348.00 + ], + [ + 2466.00, + 1348.00 + ], + [ + 2463.00, + 1355.00 + ], + [ + 2457.00, + 1367.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2499.00, + 1398.00 + ], + [ + 2501.00, + 1398.00 + ], + [ + 2503.00, + 1398.00 + ], + [ + 2517.00, + 1402.00 + ], + [ + 2516.00, + 1403.00 + ], + [ + 2515.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2484.00, + 1404.00 + ], + [ + 2476.00, + 1402.00 + ], + [ + 2468.00, + 1400.00 + ], + [ + 2465.00, + 1400.00 + ], + [ + 2460.00, + 1401.00 + ], + [ + 2455.00, + 1402.00 + ], + [ + 2441.00, + 1404.00 + ], + [ + 2440.00, + 1406.00 + ], + [ + 2439.00, + 1408.00 + ], + [ + 2436.00, + 1415.00 + ], + [ + 2434.00, + 1419.00 + ], + [ + 2432.00, + 1423.00 + ], + [ + 2427.00, + 1437.00 + ], + [ + 2426.00, + 1438.00 + ], + [ + 2425.00, + 1439.00 + ], + [ + 2421.00, + 1449.00 + ], + [ + 2419.00, + 1453.00 + ], + [ + 2417.00, + 1457.00 + ], + [ + 2411.00, + 1468.00 + ], + [ + 2410.00, + 1471.00 + ], + [ + 2409.00, + 1474.00 + ], + [ + 2405.00, + 1480.00 + ], + [ + 2403.00, + 1488.00 + ], + [ + 2401.00, + 1496.00 + ], + [ + 2400.00, + 1505.00 + ], + [ + 2399.00, + 1507.00 + ], + [ + 2398.00, + 1509.00 + ], + [ + 2394.00, + 1523.00 + ], + [ + 2394.00, + 1526.00 + ], + [ + 2394.00, + 1529.00 + ], + [ + 2401.00, + 1533.00 + ], + [ + 2404.00, + 1535.00 + ], + [ + 2407.00, + 1537.00 + ], + [ + 2426.00, + 1540.00 + ], + [ + 2427.00, + 1540.00 + ], + [ + 2428.00, + 1540.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2469.00, + 1533.00 + ], + [ + 2473.00, + 1533.00 + ], + [ + 2477.00, + 1533.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2512.00, + 1534.00 + ], + [ + 2513.00, + 1534.00 + ], + [ + 2514.00, + 1534.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2536.00, + 1543.00 + ], + [ + 2537.00, + 1544.00 + ], + [ + 2538.00, + 1545.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2598.00, + 1645.00 + ], + [ + 2598.00, + 1646.00 + ], + [ + 2598.00, + 1647.00 + ], + [ + 2611.00, + 1651.00 + ], + [ + 2612.00, + 1652.00 + ], + [ + 2613.00, + 1653.00 + ], + [ + 2624.00, + 1665.00 + ], + [ + 2624.00, + 1666.00 + ], + [ + 2624.00, + 1667.00 + ], + [ + 2632.00, + 1675.00 + ], + [ + 2634.00, + 1677.00 + ], + [ + 2636.00, + 1679.00 + ], + [ + 2644.00, + 1683.00 + ], + [ + 2645.00, + 1684.00 + ], + [ + 2646.00, + 1685.00 + ], + [ + 2658.00, + 1693.00 + ], + [ + 2659.00, + 1693.00 + ], + [ + 2660.00, + 1693.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2744.00, + 1726.00 + ], + [ + 2744.00, + 1727.00 + ], + [ + 2744.00, + 1728.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2787.00, + 1744.00 + ], + [ + 2787.00, + 1745.00 + ], + [ + 2787.00, + 1746.00 + ], + [ + 2778.00, + 1760.00 + ], + [ + 2784.00, + 1766.00 + ], + [ + 2790.00, + 1772.00 + ], + [ + 2791.00, + 1783.00 + ], + [ + 2791.00, + 1785.00 + ], + [ + 2791.00, + 1787.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2799.00, + 1809.00 + ], + [ + 2801.00, + 1810.00 + ], + [ + 2803.00, + 1811.00 + ], + [ + 2815.00, + 1818.00 + ], + [ + 2818.00, + 1819.00 + ], + [ + 2821.00, + 1820.00 + ], + [ + 2836.00, + 1826.00 + ], + [ + 2837.00, + 1827.00 + ], + [ + 2838.00, + 1828.00 + ], + [ + 2849.00, + 1836.00 + ], + [ + 2850.00, + 1836.00 + ], + [ + 2851.00, + 1836.00 + ], + [ + 2864.00, + 1844.00 + ], + [ + 2866.00, + 1846.00 + ], + [ + 2868.00, + 1848.00 + ], + [ + 2876.00, + 1853.00 + ], + [ + 2881.00, + 1857.00 + ], + [ + 2886.00, + 1861.00 + ], + [ + 2899.00, + 1872.00 + ], + [ + 2900.00, + 1873.00 + ], + [ + 2901.00, + 1874.00 + ], + [ + 2907.00, + 1878.00 + ], + [ + 2910.00, + 1879.00 + ], + [ + 2913.00, + 1880.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2939.00, + 1885.00 + ], + [ + 2943.00, + 1889.00 + ], + [ + 2947.00, + 1893.00 + ], + [ + 2956.00, + 1899.00 + ], + [ + 2956.00, + 1900.00 + ], + [ + 2956.00, + 1901.00 + ], + [ + 2955.00, + 1908.00 + ], + [ + 2955.00, + 1909.00 + ], + [ + 2955.00, + 1910.00 + ], + [ + 2950.00, + 1919.00 + ], + [ + 2949.00, + 1921.00 + ], + [ + 2948.00, + 1923.00 + ], + [ + 2941.00, + 1931.00 + ], + [ + 2941.00, + 1933.00 + ], + [ + 2941.00, + 1935.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2944.00, + 1966.00 + ], + [ + 2945.00, + 1968.00 + ], + [ + 2946.00, + 1970.00 + ], + [ + 2948.00, + 1975.00 + ], + [ + 2954.00, + 1979.00 + ], + [ + 2960.00, + 1983.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 3027.00, + 1983.00 + ], + [ + 3027.00, + 1984.00 + ], + [ + 3027.00, + 1985.00 + ], + [ + 3031.00, + 1998.00 + ], + [ + 3031.00, + 2000.00 + ], + [ + 3031.00, + 2002.00 + ], + [ + 3022.00, + 2019.00 + ], + [ + 3021.00, + 2020.00 + ], + [ + 3020.00, + 2021.00 + ], + [ + 3011.00, + 2037.00 + ], + [ + 3010.00, + 2038.00 + ], + [ + 3009.00, + 2039.00 + ], + [ + 3003.00, + 2047.00 + ], + [ + 3003.00, + 2051.00 + ], + [ + 3003.00, + 2055.00 + ], + [ + 3004.00, + 2069.00 + ], + [ + 3005.00, + 2070.00 + ], + [ + 3006.00, + 2071.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3054.00, + 2112.00 + ], + [ + 3054.00, + 2113.00 + ], + [ + 3054.00, + 2114.00 + ], + [ + 3053.00, + 2129.00 + ], + [ + 3052.00, + 2130.00 + ], + [ + 3051.00, + 2131.00 + ], + [ + 3046.00, + 2148.00 + ], + [ + 3046.00, + 2149.00 + ], + [ + 3046.00, + 2150.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3039.00, + 2175.00 + ], + [ + 3039.00, + 2176.00 + ], + [ + 3039.00, + 2177.00 + ], + [ + 3034.00, + 2187.00 + ], + [ + 3033.00, + 2190.00 + ], + [ + 3032.00, + 2193.00 + ], + [ + 3030.00, + 2207.00 + ], + [ + 3029.00, + 2211.00 + ], + [ + 3028.00, + 2215.00 + ], + [ + 3024.00, + 2225.00 + ], + [ + 3024.00, + 2228.00 + ], + [ + 3024.00, + 2231.00 + ], + [ + 3028.00, + 2246.00 + ], + [ + 3028.00, + 2249.00 + ], + [ + 3028.00, + 2252.00 + ], + [ + 3031.00, + 2266.00 + ], + [ + 3031.00, + 2268.00 + ], + [ + 3031.00, + 2270.00 + ], + [ + 3033.00, + 2282.00 + ], + [ + 3035.00, + 2285.00 + ], + [ + 3037.00, + 2288.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3045.00, + 2342.00 + ], + [ + 3045.00, + 2345.00 + ], + [ + 3045.00, + 2348.00 + ], + [ + 3053.00, + 2365.00 + ], + [ + 3053.00, + 2366.00 + ], + [ + 3053.00, + 2367.00 + ], + [ + 3049.00, + 2383.00 + ], + [ + 3049.00, + 2383.00 + ], + [ + 3049.00, + 2383.00 + ], + [ + 3031.00, + 2368.00 + ], + [ + 3031.00, + 2368.00 + ], + [ + 3031.00, + 2368.00 + ], + [ + 3016.00, + 2355.00 + ], + [ + 3016.00, + 2355.00 + ], + [ + 3016.00, + 2355.00 + ], + [ + 3009.00, + 2340.00 + ], + [ + 3009.00, + 2340.00 + ], + [ + 3009.00, + 2340.00 + ], + [ + 2992.00, + 2331.00 + ], + [ + 2989.00, + 2328.00 + ], + [ + 2986.00, + 2325.00 + ], + [ + 2970.00, + 2308.00 + ], + [ + 2970.00, + 2308.00 + ], + [ + 2970.00, + 2308.00 + ], + [ + 2955.00, + 2302.00 + ], + [ + 2952.00, + 2301.00 + ], + [ + 2949.00, + 2300.00 + ], + [ + 2927.00, + 2293.00 + ], + [ + 2924.00, + 2293.00 + ], + [ + 2921.00, + 2293.00 + ], + [ + 2904.00, + 2291.00 + ], + [ + 2904.00, + 2291.00 + ], + [ + 2904.00, + 2291.00 + ], + [ + 2892.00, + 2288.00 + ], + [ + 2891.00, + 2287.00 + ], + [ + 2890.00, + 2286.00 + ], + [ + 2878.00, + 2269.00 + ], + [ + 2878.00, + 2269.00 + ], + [ + 2878.00, + 2269.00 + ], + [ + 2865.00, + 2250.00 + ], + [ + 2865.00, + 2250.00 + ], + [ + 2865.00, + 2250.00 + ], + [ + 2850.00, + 2233.00 + ], + [ + 2850.00, + 2233.00 + ], + [ + 2850.00, + 2233.00 + ], + [ + 2823.00, + 2214.00 + ], + [ + 2823.00, + 2214.00 + ], + [ + 2823.00, + 2214.00 + ], + [ + 2808.00, + 2194.00 + ], + [ + 2808.00, + 2194.00 + ], + [ + 2808.00, + 2194.00 + ], + [ + 2791.00, + 2168.00 + ], + [ + 2791.00, + 2168.00 + ], + [ + 2791.00, + 2168.00 + ], + [ + 2761.00, + 2150.00 + ], + [ + 2761.00, + 2150.00 + ], + [ + 2761.00, + 2150.00 + ], + [ + 2736.00, + 2131.00 + ], + [ + 2736.00, + 2131.00 + ], + [ + 2736.00, + 2131.00 + ], + [ + 2703.00, + 2119.00 + ], + [ + 2703.00, + 2119.00 + ], + [ + 2703.00, + 2119.00 + ], + [ + 2671.00, + 2103.00 + ], + [ + 2671.00, + 2103.00 + ], + [ + 2671.00, + 2103.00 + ], + [ + 2644.00, + 2089.00 + ], + [ + 2644.00, + 2089.00 + ], + [ + 2644.00, + 2089.00 + ], + [ + 2623.00, + 2084.00 + ], + [ + 2623.00, + 2084.00 + ], + [ + 2623.00, + 2084.00 + ], + [ + 2607.00, + 2088.00 + ], + [ + 2606.00, + 2088.00 + ], + [ + 2605.00, + 2088.00 + ], + [ + 2596.00, + 2089.00 + ], + [ + 2596.00, + 2089.00 + ], + [ + 2596.00, + 2089.00 + ], + [ + 2572.00, + 2083.00 + ], + [ + 2571.00, + 2082.00 + ], + [ + 2570.00, + 2081.00 + ], + [ + 2564.00, + 2077.00 + ], + [ + 2560.00, + 2076.00 + ], + [ + 2556.00, + 2075.00 + ], + [ + 2541.00, + 2071.00 + ], + [ + 2539.00, + 2071.00 + ], + [ + 2537.00, + 2071.00 + ], + [ + 2527.00, + 2068.00 + ], + [ + 2527.00, + 2068.00 + ], + [ + 2527.00, + 2068.00 + ], + [ + 2501.00, + 2063.00 + ], + [ + 2501.00, + 2063.00 + ], + [ + 2501.00, + 2063.00 + ], + [ + 2474.00, + 2059.00 + ], + [ + 2474.00, + 2059.00 + ], + [ + 2474.00, + 2059.00 + ], + [ + 2457.00, + 2053.00 + ], + [ + 2457.00, + 2053.00 + ], + [ + 2457.00, + 2053.00 + ], + [ + 2446.00, + 2048.00 + ], + [ + 2446.00, + 2048.00 + ], + [ + 2446.00, + 2048.00 + ], + [ + 2434.00, + 2039.00 + ], + [ + 2434.00, + 2039.00 + ], + [ + 2434.00, + 2039.00 + ], + [ + 2438.00, + 2050.00 + ], + [ + 2438.00, + 2051.00 + ], + [ + 2438.00, + 2052.00 + ], + [ + 2440.00, + 2062.00 + ], + [ + 2440.00, + 2063.00 + ], + [ + 2440.00, + 2064.00 + ], + [ + 2440.00, + 2074.00 + ], + [ + 2440.00, + 2076.00 + ], + [ + 2440.00, + 2078.00 + ], + [ + 2436.00, + 2080.00 + ], + [ + 2433.00, + 2081.00 + ], + [ + 2430.00, + 2082.00 + ], + [ + 2419.00, + 2083.00 + ], + [ + 2415.00, + 2084.00 + ], + [ + 2411.00, + 2085.00 + ], + [ + 2401.00, + 2085.00 + ], + [ + 2401.00, + 2085.00 + ], + [ + 2401.00, + 2085.00 + ], + [ + 2384.00, + 2088.00 + ], + [ + 2384.00, + 2088.00 + ], + [ + 2384.00, + 2088.00 + ], + [ + 2366.00, + 2091.00 + ], + [ + 2364.00, + 2093.00 + ], + [ + 2362.00, + 2095.00 + ], + [ + 2350.00, + 2102.00 + ], + [ + 2349.00, + 2103.00 + ], + [ + 2348.00, + 2104.00 + ], + [ + 2338.00, + 2116.00 + ], + [ + 2338.00, + 2116.00 + ], + [ + 2338.00, + 2116.00 + ], + [ + 2336.00, + 2138.00 + ], + [ + 2336.00, + 2138.00 + ], + [ + 2336.00, + 2138.00 + ], + [ + 2329.00, + 2148.00 + ], + [ + 2329.00, + 2151.00 + ], + [ + 2329.00, + 2154.00 + ], + [ + 2322.00, + 2173.00 + ], + [ + 2322.00, + 2173.00 + ], + [ + 2322.00, + 2173.00 + ], + [ + 2324.00, + 2188.00 + ], + [ + 2324.00, + 2188.00 + ], + [ + 2324.00, + 2188.00 + ], + [ + 2328.00, + 2202.00 + ], + [ + 2328.00, + 2202.00 + ], + [ + 2328.00, + 2202.00 + ], + [ + 2338.00, + 2218.00 + ], + [ + 2338.00, + 2218.00 + ], + [ + 2338.00, + 2218.00 + ], + [ + 2341.00, + 2226.00 + ], + [ + 2342.00, + 2227.00 + ], + [ + 2343.00, + 2228.00 + ], + [ + 2345.00, + 2233.00 + ], + [ + 2346.00, + 2236.00 + ], + [ + 2347.00, + 2239.00 + ], + [ + 2345.00, + 2244.00 + ], + [ + 2345.00, + 2245.00 + ], + [ + 2345.00, + 2246.00 + ], + [ + 2349.00, + 2257.00 + ], + [ + 2349.00, + 2258.00 + ], + [ + 2349.00, + 2259.00 + ], + [ + 2355.00, + 2257.00 + ], + [ + 2356.00, + 2257.00 + ], + [ + 2357.00, + 2257.00 + ], + [ + 2372.00, + 2259.00 + ], + [ + 2372.00, + 2259.00 + ], + [ + 2372.00, + 2259.00 + ], + [ + 2380.00, + 2261.00 + ], + [ + 2382.00, + 2262.00 + ], + [ + 2384.00, + 2263.00 + ], + [ + 2397.00, + 2266.00 + ], + [ + 2397.00, + 2266.00 + ], + [ + 2397.00, + 2266.00 + ], + [ + 2411.00, + 2270.00 + ], + [ + 2411.00, + 2270.00 + ], + [ + 2411.00, + 2270.00 + ], + [ + 2422.00, + 2284.00 + ], + [ + 2422.00, + 2285.00 + ], + [ + 2422.00, + 2286.00 + ], + [ + 2418.00, + 2301.00 + ], + [ + 2418.00, + 2301.00 + ], + [ + 2418.00, + 2301.00 + ], + [ + 2420.00, + 2319.00 + ], + [ + 2420.00, + 2319.00 + ], + [ + 2420.00, + 2319.00 + ], + [ + 2424.00, + 2329.00 + ], + [ + 2424.00, + 2331.00 + ], + [ + 2424.00, + 2333.00 + ], + [ + 2428.00, + 2342.00 + ], + [ + 2429.00, + 2344.00 + ], + [ + 2430.00, + 2346.00 + ], + [ + 2430.00, + 2349.00 + ], + [ + 2431.00, + 2352.00 + ], + [ + 2432.00, + 2355.00 + ], + [ + 2435.00, + 2365.00 + ], + [ + 2436.00, + 2366.00 + ], + [ + 2437.00, + 2367.00 + ], + [ + 2450.00, + 2373.00 + ], + [ + 2450.00, + 2373.00 + ], + [ + 2450.00, + 2373.00 + ], + [ + 2465.00, + 2377.00 + ], + [ + 2466.00, + 2377.00 + ], + [ + 2467.00, + 2377.00 + ], + [ + 2484.00, + 2384.00 + ], + [ + 2485.00, + 2384.00 + ], + [ + 2486.00, + 2384.00 + ], + [ + 2499.00, + 2387.00 + ], + [ + 2499.00, + 2387.00 + ], + [ + 2499.00, + 2387.00 + ], + [ + 2506.00, + 2390.00 + ], + [ + 2508.00, + 2390.00 + ], + [ + 2510.00, + 2390.00 + ], + [ + 2524.00, + 2384.00 + ], + [ + 2526.00, + 2384.00 + ], + [ + 2528.00, + 2384.00 + ], + [ + 2535.00, + 2381.00 + ], + [ + 2540.00, + 2381.00 + ], + [ + 2545.00, + 2381.00 + ], + [ + 2557.00, + 2380.00 + ], + [ + 2563.00, + 2380.00 + ], + [ + 2578.00, + 2382.00 + ], + [ + 2588.00, + 2385.00 + ], + [ + 2588.00, + 2385.00 + ], + [ + 2588.00, + 2385.00 + ], + [ + 2611.00, + 2396.00 + ], + [ + 2611.00, + 2396.00 + ], + [ + 2611.00, + 2396.00 + ], + [ + 2615.00, + 2411.00 + ], + [ + 2616.00, + 2412.00 + ], + [ + 2617.00, + 2413.00 + ], + [ + 2629.00, + 2430.00 + ], + [ + 2630.00, + 2432.00 + ], + [ + 2631.00, + 2434.00 + ], + [ + 2637.00, + 2439.00 + ], + [ + 2639.00, + 2443.00 + ], + [ + 2641.00, + 2447.00 + ], + [ + 2650.00, + 2456.00 + ], + [ + 2650.00, + 2456.00 + ], + [ + 2650.00, + 2456.00 + ], + [ + 2667.00, + 2464.00 + ], + [ + 2667.00, + 2464.00 + ], + [ + 2667.00, + 2464.00 + ], + [ + 2673.00, + 2475.00 + ], + [ + 2673.00, + 2475.00 + ], + [ + 2673.00, + 2475.00 + ], + [ + 2689.00, + 2485.00 + ], + [ + 2689.00, + 2485.00 + ], + [ + 2689.00, + 2485.00 + ], + [ + 2708.00, + 2496.00 + ], + [ + 2708.00, + 2496.00 + ], + [ + 2708.00, + 2496.00 + ], + [ + 2723.00, + 2502.00 + ], + [ + 2725.00, + 2503.00 + ], + [ + 2727.00, + 2504.00 + ], + [ + 2741.00, + 2510.00 + ], + [ + 2743.00, + 2511.00 + ], + [ + 2745.00, + 2512.00 + ], + [ + 2760.00, + 2521.00 + ], + [ + 2761.00, + 2521.00 + ], + [ + 2762.00, + 2521.00 + ], + [ + 2773.00, + 2525.00 + ], + [ + 2774.00, + 2526.00 + ], + [ + 2775.00, + 2527.00 + ], + [ + 2791.00, + 2532.00 + ], + [ + 2791.00, + 2532.00 + ], + [ + 2791.00, + 2532.00 + ], + [ + 2805.00, + 2538.00 + ], + [ + 2805.00, + 2538.00 + ], + [ + 2805.00, + 2538.00 + ], + [ + 2819.00, + 2543.00 + ], + [ + 2819.00, + 2543.00 + ], + [ + 2819.00, + 2543.00 + ], + [ + 2839.00, + 2549.00 + ], + [ + 2839.00, + 2550.00 + ], + [ + 2839.00, + 2551.00 + ], + [ + 2868.00, + 2560.00 + ], + [ + 2868.00, + 2560.00 + ], + [ + 2868.00, + 2560.00 + ], + [ + 2882.00, + 2563.00 + ], + [ + 2883.00, + 2564.00 + ], + [ + 2884.00, + 2565.00 + ], + [ + 2901.00, + 2570.00 + ], + [ + 2901.00, + 2570.00 + ], + [ + 2901.00, + 2570.00 + ], + [ + 2920.00, + 2574.00 + ], + [ + 2920.00, + 2574.00 + ], + [ + 2920.00, + 2574.00 + ], + [ + 2943.00, + 2582.00 + ], + [ + 2943.00, + 2582.00 + ], + [ + 2943.00, + 2582.00 + ], + [ + 2961.00, + 2586.00 + ], + [ + 2961.00, + 2586.00 + ], + [ + 2961.00, + 2586.00 + ], + [ + 2992.00, + 2593.00 + ], + [ + 2993.00, + 2593.00 + ], + [ + 2994.00, + 2593.00 + ], + [ + 3013.00, + 2596.00 + ], + [ + 3013.00, + 2596.00 + ], + [ + 3013.00, + 2596.00 + ], + [ + 3029.00, + 2601.00 + ], + [ + 3029.00, + 2601.00 + ], + [ + 3029.00, + 2601.00 + ], + [ + 3043.00, + 2605.00 + ], + [ + 3043.00, + 2605.00 + ], + [ + 3043.00, + 2605.00 + ], + [ + 3065.00, + 2611.00 + ], + [ + 3065.00, + 2611.00 + ], + [ + 3065.00, + 2611.00 + ], + [ + 3087.00, + 2613.00 + ], + [ + 3088.00, + 2613.00 + ], + [ + 3089.00, + 2613.00 + ], + [ + 3103.00, + 2612.00 + ], + [ + 3105.00, + 2613.00 + ], + [ + 3107.00, + 2614.00 + ], + [ + 3127.00, + 2616.00 + ], + [ + 3127.00, + 2616.00 + ], + [ + 3127.00, + 2616.00 + ], + [ + 3151.00, + 2621.00 + ], + [ + 3151.00, + 2621.00 + ], + [ + 3151.00, + 2621.00 + ], + [ + 3174.00, + 2628.00 + ], + [ + 3174.00, + 2628.00 + ], + [ + 3174.00, + 2628.00 + ], + [ + 3199.00, + 2634.00 + ], + [ + 3200.00, + 2634.00 + ], + [ + 3201.00, + 2634.00 + ], + [ + 3219.00, + 2636.00 + ], + [ + 3220.00, + 2637.00 + ], + [ + 3221.00, + 2638.00 + ], + [ + 3231.00, + 2642.00 + ], + [ + 3232.00, + 2642.00 + ], + [ + 3233.00, + 2642.00 + ], + [ + 3244.00, + 2650.00 + ], + [ + 3245.00, + 2652.00 + ], + [ + 3246.00, + 2654.00 + ], + [ + 3253.00, + 2659.00 + ], + [ + 3254.00, + 2663.00 + ], + [ + 3255.00, + 2667.00 + ], + [ + 3256.00, + 2677.00 + ], + [ + 3258.00, + 2679.00 + ], + [ + 3260.00, + 2681.00 + ], + [ + 3263.00, + 2687.00 + ], + [ + 3265.00, + 2690.00 + ], + [ + 3267.00, + 2693.00 + ], + [ + 3277.00, + 2702.00 + ], + [ + 3277.00, + 2702.00 + ], + [ + 3277.00, + 2702.00 + ], + [ + 3283.00, + 2706.00 + ], + [ + 3283.00, + 2706.00 + ], + [ + 3283.00, + 2706.00 + ], + [ + 3302.00, + 2705.00 + ], + [ + 3302.00, + 2705.00 + ], + [ + 3302.00, + 2705.00 + ], + [ + 3321.00, + 2701.00 + ], + [ + 3321.00, + 2701.00 + ], + [ + 3321.00, + 2701.00 + ], + [ + 3345.00, + 2700.00 + ], + [ + 3346.00, + 2699.00 + ], + [ + 3347.00, + 2698.00 + ], + [ + 3368.00, + 2697.00 + ], + [ + 3369.00, + 2697.00 + ], + [ + 3370.00, + 2697.00 + ], + [ + 3375.00, + 2676.00 + ], + [ + 3376.00, + 2676.00 + ], + [ + 3377.00, + 2676.00 + ], + [ + 3368.00, + 2651.00 + ], + [ + 3368.00, + 2651.00 + ], + [ + 3368.00, + 2651.00 + ], + [ + 3364.00, + 2632.00 + ], + [ + 3364.00, + 2631.00 + ], + [ + 3364.00, + 2630.00 + ], + [ + 3357.00, + 2608.00 + ], + [ + 3357.00, + 2608.00 + ], + [ + 3357.00, + 2608.00 + ], + [ + 3356.00, + 2589.00 + ], + [ + 3356.00, + 2589.00 + ], + [ + 3356.00, + 2589.00 + ], + [ + 3352.00, + 2567.00 + ], + [ + 3352.00, + 2567.00 + ], + [ + 3352.00, + 2567.00 + ], + [ + 3345.00, + 2541.00 + ], + [ + 3345.00, + 2541.00 + ], + [ + 3345.00, + 2541.00 + ], + [ + 3341.00, + 2524.00 + ], + [ + 3341.00, + 2524.00 + ], + [ + 3341.00, + 2524.00 + ], + [ + 3336.00, + 2515.00 + ], + [ + 3336.00, + 2515.00 + ], + [ + 3336.00, + 2515.00 + ], + [ + 3333.00, + 2501.00 + ], + [ + 3333.00, + 2500.00 + ], + [ + 3333.00, + 2499.00 + ], + [ + 3330.00, + 2480.00 + ], + [ + 3330.00, + 2480.00 + ], + [ + 3330.00, + 2480.00 + ], + [ + 3329.00, + 2465.00 + ], + [ + 3329.00, + 2465.00 + ], + [ + 3329.00, + 2465.00 + ], + [ + 3327.00, + 2446.00 + ], + [ + 3327.00, + 2446.00 + ], + [ + 3327.00, + 2446.00 + ], + [ + 3331.00, + 2424.00 + ], + [ + 3331.00, + 2424.00 + ], + [ + 3331.00, + 2424.00 + ], + [ + 3337.00, + 2408.00 + ], + [ + 3337.00, + 2408.00 + ], + [ + 3337.00, + 2408.00 + ], + [ + 3351.00, + 2393.00 + ], + [ + 3351.00, + 2393.00 + ], + [ + 3351.00, + 2393.00 + ], + [ + 3370.00, + 2382.00 + ], + [ + 3370.00, + 2382.00 + ] + ] + }, + { + "name": "Gimli & Legolas", + "id": "legolas_gimli", + "color": "purple", + "distance": "1800 miles / 2900 km", + "startDate": "December 25, T.A. 3018", + "endDate": "March 25, T.A. 3019", + "path": [ + [ + 3374.00, + 2375.00 + ], + [ + 3374.00, + 2375.00 + ], + [ + 3361.00, + 2384.00 + ], + [ + 3361.00, + 2384.00 + ], + [ + 3361.00, + 2384.00 + ], + [ + 3343.00, + 2405.00 + ], + [ + 3343.00, + 2405.00 + ], + [ + 3343.00, + 2405.00 + ], + [ + 3332.00, + 2424.00 + ], + [ + 3332.00, + 2424.00 + ], + [ + 3332.00, + 2424.00 + ], + [ + 3328.00, + 2449.00 + ], + [ + 3328.00, + 2449.00 + ], + [ + 3328.00, + 2449.00 + ], + [ + 3330.00, + 2471.00 + ], + [ + 3330.00, + 2471.00 + ], + [ + 3330.00, + 2471.00 + ], + [ + 3330.00, + 2500.00 + ], + [ + 3330.00, + 2500.00 + ], + [ + 3330.00, + 2500.00 + ], + [ + 3341.00, + 2523.00 + ], + [ + 3341.00, + 2523.00 + ], + [ + 3341.00, + 2523.00 + ], + [ + 3348.00, + 2547.00 + ], + [ + 3348.00, + 2547.00 + ], + [ + 3348.00, + 2547.00 + ], + [ + 3354.00, + 2567.00 + ], + [ + 3354.00, + 2567.00 + ], + [ + 3354.00, + 2567.00 + ], + [ + 3360.00, + 2592.00 + ], + [ + 3360.00, + 2592.00 + ], + [ + 3360.00, + 2592.00 + ], + [ + 3361.00, + 2610.00 + ], + [ + 3361.00, + 2614.00 + ], + [ + 3361.00, + 2618.00 + ], + [ + 3361.00, + 2634.00 + ], + [ + 3361.00, + 2636.00 + ], + [ + 3361.00, + 2638.00 + ], + [ + 3367.00, + 2658.00 + ], + [ + 3367.00, + 2658.00 + ], + [ + 3367.00, + 2658.00 + ], + [ + 3375.00, + 2687.00 + ], + [ + 3375.00, + 2688.00 + ], + [ + 3375.00, + 2689.00 + ], + [ + 3365.00, + 2699.00 + ], + [ + 3365.00, + 2699.00 + ], + [ + 3365.00, + 2699.00 + ], + [ + 3342.00, + 2700.00 + ], + [ + 3342.00, + 2700.00 + ], + [ + 3342.00, + 2700.00 + ], + [ + 3316.00, + 2703.00 + ], + [ + 3316.00, + 2703.00 + ], + [ + 3316.00, + 2703.00 + ], + [ + 3297.00, + 2705.00 + ], + [ + 3297.00, + 2705.00 + ], + [ + 3297.00, + 2705.00 + ], + [ + 3284.00, + 2712.00 + ], + [ + 3284.00, + 2712.00 + ], + [ + 3284.00, + 2712.00 + ], + [ + 3290.00, + 2716.00 + ], + [ + 3297.00, + 2720.00 + ], + [ + 3304.00, + 2724.00 + ], + [ + 3304.00, + 2725.00 + ], + [ + 3308.00, + 2728.00 + ], + [ + 3312.00, + 2731.00 + ], + [ + 3307.00, + 2737.00 + ], + [ + 3306.00, + 2740.00 + ], + [ + 3305.00, + 2743.00 + ], + [ + 3293.00, + 2749.00 + ], + [ + 3289.00, + 2752.00 + ], + [ + 3285.00, + 2755.00 + ], + [ + 3277.00, + 2763.00 + ], + [ + 3274.00, + 2767.00 + ], + [ + 3271.00, + 2771.00 + ], + [ + 3272.00, + 2785.00 + ], + [ + 3272.00, + 2786.00 + ], + [ + 3272.00, + 2787.00 + ], + [ + 3275.00, + 2802.00 + ], + [ + 3278.00, + 2812.00 + ], + [ + 3281.00, + 2822.00 + ], + [ + 3285.00, + 2827.00 + ], + [ + 3286.00, + 2831.00 + ], + [ + 3287.00, + 2835.00 + ], + [ + 3291.00, + 2855.00 + ], + [ + 3291.00, + 2864.00 + ], + [ + 3291.00, + 2873.00 + ], + [ + 3289.00, + 2881.00 + ], + [ + 3288.00, + 2887.00 + ], + [ + 3287.00, + 2893.00 + ], + [ + 3284.00, + 2907.00 + ], + [ + 3282.00, + 2917.00 + ], + [ + 3280.00, + 2927.00 + ], + [ + 3273.00, + 2936.00 + ], + [ + 3271.00, + 2941.00 + ], + [ + 3269.00, + 2946.00 + ], + [ + 3261.00, + 2964.00 + ], + [ + 3259.00, + 2968.00 + ], + [ + 3257.00, + 2972.00 + ], + [ + 3247.00, + 2986.00 + ], + [ + 3239.00, + 2995.00 + ], + [ + 3231.00, + 3004.00 + ], + [ + 3227.00, + 3008.00 + ], + [ + 3224.00, + 3011.00 + ], + [ + 3221.00, + 3014.00 + ], + [ + 3206.00, + 3029.00 + ], + [ + 3206.00, + 3029.00 + ], + [ + 3206.00, + 3029.00 + ], + [ + 3179.00, + 3035.00 + ], + [ + 3179.00, + 3035.00 + ], + [ + 3179.00, + 3035.00 + ], + [ + 3156.00, + 3032.00 + ], + [ + 3154.00, + 3032.00 + ], + [ + 3152.00, + 3032.00 + ], + [ + 3148.00, + 3032.00 + ], + [ + 3148.00, + 3032.00 + ], + [ + 3148.00, + 3032.00 + ], + [ + 3134.00, + 3031.00 + ], + [ + 3130.00, + 3031.00 + ], + [ + 3126.00, + 3031.00 + ], + [ + 3119.00, + 3035.00 + ], + [ + 3116.00, + 3036.00 + ], + [ + 3113.00, + 3037.00 + ], + [ + 3099.00, + 3039.00 + ], + [ + 3093.00, + 3040.00 + ], + [ + 3087.00, + 3041.00 + ], + [ + 3084.00, + 3041.00 + ], + [ + 3082.00, + 3041.00 + ], + [ + 3080.00, + 3041.00 + ], + [ + 3072.00, + 3045.00 + ], + [ + 3066.00, + 3047.00 + ], + [ + 3060.00, + 3049.00 + ], + [ + 3051.00, + 3051.00 + ], + [ + 3050.00, + 3051.00 + ], + [ + 3049.00, + 3051.00 + ], + [ + 3020.00, + 3064.00 + ], + [ + 3019.00, + 3064.00 + ], + [ + 3018.00, + 3064.00 + ], + [ + 2989.00, + 3066.00 + ], + [ + 2985.00, + 3066.00 + ], + [ + 2981.00, + 3066.00 + ], + [ + 2957.00, + 3064.00 + ], + [ + 2957.00, + 3064.00 + ], + [ + 2957.00, + 3064.00 + ], + [ + 2937.00, + 3058.00 + ], + [ + 2934.00, + 3057.00 + ], + [ + 2931.00, + 3056.00 + ], + [ + 2911.00, + 3043.00 + ], + [ + 2911.00, + 3043.00 + ], + [ + 2911.00, + 3043.00 + ], + [ + 2896.00, + 3027.00 + ], + [ + 2896.00, + 3026.00 + ], + [ + 2896.00, + 3025.00 + ], + [ + 2887.00, + 3012.00 + ], + [ + 2887.00, + 3012.00 + ], + [ + 2887.00, + 3012.00 + ], + [ + 2884.00, + 2992.00 + ], + [ + 2884.00, + 2992.00 + ], + [ + 2884.00, + 2992.00 + ], + [ + 2880.00, + 2979.00 + ], + [ + 2880.00, + 2979.00 + ], + [ + 2880.00, + 2979.00 + ], + [ + 2879.00, + 2964.00 + ], + [ + 2879.00, + 2964.00 + ], + [ + 2879.00, + 2964.00 + ], + [ + 2879.00, + 2950.00 + ], + [ + 2879.00, + 2947.00 + ], + [ + 2879.00, + 2944.00 + ], + [ + 2875.00, + 2934.00 + ], + [ + 2875.00, + 2934.00 + ], + [ + 2875.00, + 2934.00 + ], + [ + 2873.00, + 2917.00 + ], + [ + 2873.00, + 2912.00 + ], + [ + 2873.00, + 2907.00 + ], + [ + 2872.00, + 2904.00 + ], + [ + 2872.00, + 2903.00 + ], + [ + 2872.00, + 2902.00 + ], + [ + 2871.00, + 2887.00 + ], + [ + 2871.00, + 2887.00 + ], + [ + 2871.00, + 2887.00 + ], + [ + 2867.00, + 2862.00 + ], + [ + 2867.00, + 2860.00 + ], + [ + 2867.00, + 2858.00 + ], + [ + 2864.00, + 2840.00 + ], + [ + 2862.00, + 2835.00 + ], + [ + 2860.00, + 2830.00 + ], + [ + 2858.00, + 2828.00 + ], + [ + 2857.00, + 2828.00 + ], + [ + 2856.00, + 2828.00 + ], + [ + 2839.00, + 2809.00 + ], + [ + 2838.00, + 2809.00 + ], + [ + 2837.00, + 2809.00 + ], + [ + 2822.00, + 2802.00 + ], + [ + 2818.00, + 2798.00 + ], + [ + 2814.00, + 2794.00 + ], + [ + 2810.00, + 2790.00 + ], + [ + 2810.00, + 2790.00 + ], + [ + 2810.00, + 2790.00 + ], + [ + 2795.00, + 2784.00 + ], + [ + 2792.00, + 2783.00 + ], + [ + 2789.00, + 2782.00 + ], + [ + 2784.00, + 2776.00 + ], + [ + 2784.00, + 2776.00 + ], + [ + 2784.00, + 2776.00 + ], + [ + 2773.00, + 2771.00 + ], + [ + 2765.00, + 2767.00 + ], + [ + 2757.00, + 2763.00 + ], + [ + 2759.00, + 2764.00 + ], + [ + 2758.00, + 2763.00 + ], + [ + 2757.00, + 2762.00 + ], + [ + 2739.00, + 2757.00 + ], + [ + 2738.00, + 2757.00 + ], + [ + 2737.00, + 2757.00 + ], + [ + 2726.00, + 2755.00 + ], + [ + 2724.00, + 2754.00 + ], + [ + 2722.00, + 2753.00 + ], + [ + 2704.00, + 2751.00 + ], + [ + 2702.00, + 2751.00 + ], + [ + 2700.00, + 2751.00 + ], + [ + 2693.00, + 2744.00 + ], + [ + 2690.00, + 2742.00 + ], + [ + 2687.00, + 2740.00 + ], + [ + 2688.00, + 2731.00 + ], + [ + 2687.00, + 2729.00 + ], + [ + 2686.00, + 2727.00 + ], + [ + 2687.00, + 2713.00 + ], + [ + 2687.00, + 2713.00 + ], + [ + 2687.00, + 2713.00 + ], + [ + 2685.00, + 2693.00 + ], + [ + 2685.00, + 2694.00 + ], + [ + 2685.00, + 2695.00 + ], + [ + 2679.00, + 2680.00 + ], + [ + 2678.00, + 2676.00 + ], + [ + 2677.00, + 2672.00 + ], + [ + 2673.00, + 2663.00 + ], + [ + 2673.00, + 2662.00 + ], + [ + 2673.00, + 2661.00 + ], + [ + 2671.00, + 2648.00 + ], + [ + 2671.00, + 2646.00 + ], + [ + 2671.00, + 2644.00 + ], + [ + 2663.00, + 2630.00 + ], + [ + 2663.00, + 2630.00 + ], + [ + 2663.00, + 2630.00 + ], + [ + 2646.00, + 2616.00 + ], + [ + 2634.00, + 2606.00 + ], + [ + 2629.00, + 2600.00 + ], + [ + 2617.00, + 2600.00 + ], + [ + 2617.00, + 2600.00 + ], + [ + 2617.00, + 2600.00 + ], + [ + 2578.00, + 2590.00 + ], + [ + 2577.00, + 2590.00 + ], + [ + 2576.00, + 2590.00 + ], + [ + 2569.00, + 2580.00 + ], + [ + 2569.00, + 2579.00 + ], + [ + 2569.00, + 2578.00 + ], + [ + 2556.00, + 2570.00 + ], + [ + 2553.00, + 2566.00 + ], + [ + 2550.00, + 2562.00 + ], + [ + 2548.00, + 2559.00 + ], + [ + 2547.00, + 2557.00 + ], + [ + 2546.00, + 2555.00 + ], + [ + 2537.00, + 2542.00 + ], + [ + 2536.00, + 2539.00 + ], + [ + 2535.00, + 2536.00 + ], + [ + 2527.00, + 2519.00 + ], + [ + 2526.00, + 2515.00 + ], + [ + 2525.00, + 2511.00 + ], + [ + 2520.00, + 2506.00 + ], + [ + 2520.00, + 2505.00 + ], + [ + 2520.00, + 2504.00 + ], + [ + 2512.00, + 2492.00 + ], + [ + 2512.00, + 2492.00 + ], + [ + 2512.00, + 2492.00 + ], + [ + 2504.00, + 2477.00 + ], + [ + 2504.00, + 2477.00 + ], + [ + 2504.00, + 2477.00 + ], + [ + 2498.00, + 2464.00 + ], + [ + 2498.00, + 2459.00 + ], + [ + 2498.00, + 2454.00 + ], + [ + 2496.00, + 2440.00 + ], + [ + 2496.00, + 2439.00 + ], + [ + 2496.00, + 2438.00 + ], + [ + 2493.00, + 2418.00 + ], + [ + 2493.00, + 2418.00 + ], + [ + 2493.00, + 2418.00 + ], + [ + 2494.00, + 2397.00 + ], + [ + 2492.00, + 2396.00 + ], + [ + 2490.00, + 2395.00 + ], + [ + 2481.00, + 2393.00 + ], + [ + 2477.00, + 2391.00 + ], + [ + 2473.00, + 2389.00 + ], + [ + 2465.00, + 2386.00 + ], + [ + 2464.00, + 2384.00 + ], + [ + 2463.00, + 2382.00 + ], + [ + 2453.00, + 2376.00 + ], + [ + 2450.00, + 2374.00 + ], + [ + 2447.00, + 2372.00 + ], + [ + 2437.00, + 2361.00 + ], + [ + 2435.00, + 2359.00 + ], + [ + 2433.00, + 2357.00 + ], + [ + 2423.00, + 2343.00 + ], + [ + 2417.00, + 2335.00 + ], + [ + 2415.00, + 2332.00 + ], + [ + 2415.00, + 2328.00 + ], + [ + 2414.00, + 2323.00 + ], + [ + 2413.00, + 2318.00 + ], + [ + 2411.00, + 2314.00 + ], + [ + 2410.00, + 2309.00 + ], + [ + 2409.00, + 2304.00 + ], + [ + 2407.00, + 2293.00 + ], + [ + 2407.00, + 2291.00 + ], + [ + 2407.00, + 2289.00 + ], + [ + 2400.00, + 2281.00 + ], + [ + 2399.00, + 2280.00 + ], + [ + 2398.00, + 2279.00 + ], + [ + 2390.00, + 2277.00 + ], + [ + 2390.00, + 2276.00 + ], + [ + 2390.00, + 2275.00 + ], + [ + 2379.00, + 2274.00 + ], + [ + 2377.00, + 2273.00 + ], + [ + 2375.00, + 2272.00 + ], + [ + 2361.00, + 2265.00 + ], + [ + 2360.00, + 2265.00 + ], + [ + 2359.00, + 2265.00 + ], + [ + 2347.00, + 2261.00 + ], + [ + 2347.00, + 2261.00 + ], + [ + 2347.00, + 2261.00 + ], + [ + 2329.00, + 2250.00 + ], + [ + 2329.00, + 2250.00 + ], + [ + 2329.00, + 2250.00 + ], + [ + 2321.00, + 2242.00 + ], + [ + 2320.00, + 2240.00 + ], + [ + 2319.00, + 2238.00 + ], + [ + 2314.00, + 2224.00 + ], + [ + 2314.00, + 2224.00 + ], + [ + 2314.00, + 2224.00 + ], + [ + 2312.00, + 2201.00 + ], + [ + 2312.00, + 2196.00 + ], + [ + 2312.00, + 2191.00 + ], + [ + 2316.00, + 2184.00 + ], + [ + 2316.00, + 2184.00 + ], + [ + 2316.00, + 2184.00 + ], + [ + 2321.00, + 2180.00 + ], + [ + 2323.00, + 2173.00 + ], + [ + 2323.00, + 2172.00 + ], + [ + 2327.00, + 2164.00 + ], + [ + 2327.00, + 2164.00 + ], + [ + 2327.00, + 2164.00 + ], + [ + 2332.00, + 2150.00 + ], + [ + 2332.00, + 2148.00 + ], + [ + 2332.00, + 2146.00 + ], + [ + 2332.00, + 2137.00 + ], + [ + 2332.00, + 2137.00 + ], + [ + 2332.00, + 2137.00 + ], + [ + 2336.00, + 2123.00 + ], + [ + 2336.00, + 2123.00 + ], + [ + 2336.00, + 2123.00 + ], + [ + 2341.00, + 2135.00 + ], + [ + 2341.00, + 2135.00 + ], + [ + 2341.00, + 2135.00 + ], + [ + 2342.00, + 2142.00 + ], + [ + 2342.00, + 2142.00 + ], + [ + 2342.00, + 2142.00 + ], + [ + 2343.00, + 2151.00 + ], + [ + 2344.00, + 2152.00 + ], + [ + 2345.00, + 2153.00 + ], + [ + 2346.00, + 2161.00 + ], + [ + 2346.00, + 2161.00 + ], + [ + 2346.00, + 2161.00 + ], + [ + 2346.00, + 2179.00 + ], + [ + 2346.00, + 2180.00 + ], + [ + 2346.00, + 2181.00 + ], + [ + 2346.00, + 2189.00 + ], + [ + 2346.00, + 2193.00 + ], + [ + 2346.00, + 2197.00 + ], + [ + 2345.00, + 2201.00 + ], + [ + 2345.00, + 2202.00 + ], + [ + 2345.00, + 2203.00 + ], + [ + 2340.00, + 2213.00 + ], + [ + 2340.00, + 2215.00 + ], + [ + 2340.00, + 2217.00 + ], + [ + 2342.00, + 2225.00 + ], + [ + 2342.00, + 2227.00 + ], + [ + 2342.00, + 2229.00 + ], + [ + 2344.00, + 2240.00 + ], + [ + 2345.00, + 2243.00 + ], + [ + 2346.00, + 2246.00 + ], + [ + 2346.00, + 2249.00 + ], + [ + 2346.00, + 2249.00 + ], + [ + 2346.00, + 2249.00 + ], + [ + 2359.00, + 2254.00 + ], + [ + 2360.00, + 2254.00 + ], + [ + 2361.00, + 2254.00 + ], + [ + 2377.00, + 2255.00 + ], + [ + 2378.00, + 2255.00 + ], + [ + 2379.00, + 2255.00 + ], + [ + 2393.00, + 2260.00 + ], + [ + 2393.00, + 2260.00 + ], + [ + 2393.00, + 2260.00 + ], + [ + 2404.00, + 2264.00 + ], + [ + 2404.00, + 2264.00 + ], + [ + 2404.00, + 2264.00 + ], + [ + 2415.00, + 2270.00 + ], + [ + 2415.00, + 2270.00 + ], + [ + 2415.00, + 2270.00 + ], + [ + 2414.00, + 2280.00 + ], + [ + 2414.00, + 2281.00 + ], + [ + 2414.00, + 2282.00 + ], + [ + 2414.00, + 2291.00 + ], + [ + 2414.00, + 2291.00 + ], + [ + 2414.00, + 2291.00 + ], + [ + 2428.00, + 2328.00 + ], + [ + 2427.00, + 2328.00 + ], + [ + 2426.00, + 2328.00 + ], + [ + 2425.00, + 2321.00 + ], + [ + 2425.00, + 2320.00 + ], + [ + 2420.99, + 2317.60 + ], + [ + 2417.59, + 2305.71 + ], + [ + 2427.00, + 2308.00 + ], + [ + 2427.00, + 2307.73 + ], + [ + 2427.15, + 2306.86 + ], + [ + 2427.36, + 2305.73 + ], + [ + 2427.94, + 2302.69 + ], + [ + 2429.00, + 2297.73 + ], + [ + 2429.00, + 2297.00 + ], + [ + 2429.00, + 2296.00 + ], + [ + 2435.00, + 2285.00 + ], + [ + 2436.00, + 2284.00 + ], + [ + 2437.00, + 2283.00 + ], + [ + 2451.00, + 2280.00 + ], + [ + 2451.00, + 2280.00 + ], + [ + 2451.00, + 2280.00 + ], + [ + 2464.00, + 2287.00 + ], + [ + 2465.00, + 2287.00 + ], + [ + 2466.00, + 2287.00 + ], + [ + 2479.00, + 2294.00 + ], + [ + 2480.00, + 2294.00 + ], + [ + 2481.00, + 2294.00 + ], + [ + 2500.00, + 2305.00 + ], + [ + 2500.00, + 2305.00 + ], + [ + 2500.00, + 2305.00 + ], + [ + 2518.00, + 2317.00 + ], + [ + 2518.00, + 2317.00 + ], + [ + 2518.00, + 2317.00 + ], + [ + 2533.00, + 2327.00 + ], + [ + 2533.00, + 2327.00 + ], + [ + 2533.00, + 2327.00 + ], + [ + 2545.00, + 2330.00 + ], + [ + 2545.00, + 2330.00 + ], + [ + 2545.00, + 2330.00 + ], + [ + 2555.00, + 2342.00 + ], + [ + 2555.00, + 2342.00 + ], + [ + 2555.00, + 2342.00 + ], + [ + 2565.00, + 2351.00 + ], + [ + 2565.00, + 2352.00 + ], + [ + 2565.00, + 2353.00 + ], + [ + 2576.00, + 2361.00 + ], + [ + 2576.00, + 2361.00 + ], + [ + 2576.00, + 2361.00 + ], + [ + 2590.00, + 2390.00 + ], + [ + 2590.00, + 2390.00 + ], + [ + 2590.00, + 2390.00 + ], + [ + 2596.00, + 2369.00 + ], + [ + 2597.00, + 2357.00 + ], + [ + 2598.00, + 2345.00 + ], + [ + 2599.00, + 2344.00 + ], + [ + 2600.00, + 2334.00 + ], + [ + 2601.00, + 2324.00 + ], + [ + 2600.00, + 2321.00 + ], + [ + 2600.00, + 2311.00 + ], + [ + 2600.00, + 2301.00 + ], + [ + 2600.00, + 2304.00 + ], + [ + 2600.00, + 2298.00 + ], + [ + 2600.00, + 2292.00 + ], + [ + 2600.00, + 2283.00 + ], + [ + 2600.00, + 2272.00 + ], + [ + 2600.00, + 2261.00 + ], + [ + 2600.00, + 2266.00 + ], + [ + 2600.00, + 2256.00 + ], + [ + 2600.00, + 2246.00 + ], + [ + 2600.00, + 2249.00 + ], + [ + 2601.00, + 2234.00 + ], + [ + 2602.00, + 2219.00 + ], + [ + 2602.00, + 2226.00 + ], + [ + 2602.00, + 2197.00 + ], + [ + 2602.00, + 2182.00 + ], + [ + 2601.00, + 2190.00 + ], + [ + 2599.00, + 2178.00 + ], + [ + 2597.00, + 2166.00 + ], + [ + 2599.00, + 2170.00 + ], + [ + 2602.00, + 2162.00 + ], + [ + 2605.00, + 2154.00 + ], + [ + 2606.00, + 2154.00 + ], + [ + 2608.00, + 2147.00 + ], + [ + 2610.00, + 2140.00 + ], + [ + 2611.00, + 2137.00 + ], + [ + 2614.00, + 2132.00 + ], + [ + 2617.00, + 2127.00 + ], + [ + 2617.00, + 2126.00 + ], + [ + 2617.00, + 2123.00 + ], + [ + 2617.00, + 2120.00 + ], + [ + 2618.00, + 2115.00 + ], + [ + 2619.00, + 2111.00 + ], + [ + 2620.00, + 2107.00 + ], + [ + 2622.00, + 2105.00 + ], + [ + 2623.00, + 2103.00 + ], + [ + 2624.00, + 2101.00 + ], + [ + 2625.00, + 2091.00 + ], + [ + 2625.00, + 2089.00 + ], + [ + 2625.00, + 2087.00 + ], + [ + 2642.00, + 2087.00 + ], + [ + 2650.00, + 2088.00 + ], + [ + 2652.00, + 2088.00 + ], + [ + 2657.00, + 2090.00 + ], + [ + 2658.00, + 2091.00 + ], + [ + 2659.00, + 2092.00 + ], + [ + 2666.00, + 2092.00 + ], + [ + 2667.00, + 2093.00 + ], + [ + 2668.00, + 2094.00 + ], + [ + 2684.00, + 2097.00 + ], + [ + 2686.00, + 2098.00 + ], + [ + 2688.00, + 2099.00 + ], + [ + 2695.00, + 2103.00 + ], + [ + 2696.00, + 2104.00 + ], + [ + 2697.00, + 2105.00 + ], + [ + 2708.00, + 2112.00 + ], + [ + 2708.00, + 2112.00 + ], + [ + 2708.00, + 2112.00 + ], + [ + 2730.00, + 2128.00 + ], + [ + 2730.00, + 2128.00 + ], + [ + 2730.00, + 2128.00 + ], + [ + 2745.00, + 2140.00 + ], + [ + 2745.00, + 2140.00 + ], + [ + 2745.00, + 2140.00 + ], + [ + 2761.00, + 2150.00 + ], + [ + 2761.00, + 2150.00 + ], + [ + 2761.00, + 2150.00 + ], + [ + 2791.00, + 2168.00 + ], + [ + 2791.00, + 2168.00 + ], + [ + 2791.00, + 2168.00 + ], + [ + 2808.00, + 2194.00 + ], + [ + 2808.00, + 2194.00 + ], + [ + 2808.00, + 2194.00 + ], + [ + 2823.00, + 2214.00 + ], + [ + 2823.00, + 2214.00 + ], + [ + 2823.00, + 2214.00 + ], + [ + 2850.00, + 2233.00 + ], + [ + 2850.00, + 2233.00 + ], + [ + 2850.00, + 2233.00 + ], + [ + 2865.00, + 2250.00 + ], + [ + 2865.00, + 2250.00 + ], + [ + 2865.00, + 2250.00 + ], + [ + 2878.00, + 2269.00 + ], + [ + 2878.00, + 2269.00 + ], + [ + 2878.00, + 2269.00 + ], + [ + 2890.00, + 2286.00 + ], + [ + 2891.00, + 2287.00 + ], + [ + 2892.00, + 2288.00 + ], + [ + 2904.00, + 2291.00 + ], + [ + 2904.00, + 2291.00 + ], + [ + 2904.00, + 2291.00 + ], + [ + 2921.00, + 2293.00 + ], + [ + 2924.00, + 2293.00 + ], + [ + 2927.00, + 2293.00 + ], + [ + 2949.00, + 2300.00 + ], + [ + 2952.00, + 2301.00 + ], + [ + 2955.00, + 2302.00 + ], + [ + 2970.00, + 2308.00 + ], + [ + 2970.00, + 2308.00 + ], + [ + 2970.00, + 2308.00 + ], + [ + 2986.00, + 2325.00 + ], + [ + 2989.00, + 2328.00 + ], + [ + 2992.00, + 2331.00 + ], + [ + 3009.00, + 2340.00 + ], + [ + 3009.00, + 2340.00 + ], + [ + 3009.00, + 2340.00 + ], + [ + 3016.00, + 2355.00 + ], + [ + 3016.00, + 2355.00 + ], + [ + 3016.00, + 2355.00 + ], + [ + 3031.00, + 2368.00 + ], + [ + 3031.00, + 2368.00 + ], + [ + 3031.00, + 2368.00 + ], + [ + 3049.00, + 2383.00 + ], + [ + 3049.00, + 2383.00 + ], + [ + 3049.00, + 2383.00 + ], + [ + 3053.00, + 2367.00 + ], + [ + 3053.00, + 2366.00 + ], + [ + 3053.00, + 2365.00 + ], + [ + 3045.00, + 2348.00 + ], + [ + 3045.00, + 2345.00 + ], + [ + 3045.00, + 2342.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3037.00, + 2288.00 + ], + [ + 3035.00, + 2285.00 + ], + [ + 3033.00, + 2282.00 + ], + [ + 3031.00, + 2270.00 + ], + [ + 3031.00, + 2268.00 + ], + [ + 3031.00, + 2266.00 + ], + [ + 3028.00, + 2252.00 + ], + [ + 3028.00, + 2249.00 + ], + [ + 3028.00, + 2246.00 + ], + [ + 3024.00, + 2231.00 + ], + [ + 3024.00, + 2228.00 + ], + [ + 3024.00, + 2225.00 + ], + [ + 3028.00, + 2215.00 + ], + [ + 3029.00, + 2211.00 + ], + [ + 3030.00, + 2207.00 + ], + [ + 3032.00, + 2193.00 + ], + [ + 3033.00, + 2190.00 + ], + [ + 3034.00, + 2187.00 + ], + [ + 3039.00, + 2177.00 + ], + [ + 3039.00, + 2176.00 + ], + [ + 3039.00, + 2175.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3046.00, + 2150.00 + ], + [ + 3046.00, + 2149.00 + ], + [ + 3046.00, + 2148.00 + ], + [ + 3051.00, + 2131.00 + ], + [ + 3052.00, + 2130.00 + ], + [ + 3053.00, + 2129.00 + ], + [ + 3054.00, + 2114.00 + ], + [ + 3054.00, + 2113.00 + ], + [ + 3054.00, + 2112.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3006.00, + 2071.00 + ], + [ + 3005.00, + 2070.00 + ], + [ + 3004.00, + 2069.00 + ], + [ + 3003.00, + 2055.00 + ], + [ + 3003.00, + 2051.00 + ], + [ + 3003.00, + 2047.00 + ], + [ + 3009.00, + 2039.00 + ], + [ + 3010.00, + 2038.00 + ], + [ + 3011.00, + 2037.00 + ], + [ + 3020.00, + 2021.00 + ], + [ + 3021.00, + 2020.00 + ], + [ + 3022.00, + 2019.00 + ], + [ + 3031.00, + 2002.00 + ], + [ + 3031.00, + 2000.00 + ], + [ + 3031.00, + 1998.00 + ], + [ + 3027.00, + 1985.00 + ], + [ + 3027.00, + 1984.00 + ], + [ + 3027.00, + 1983.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2960.00, + 1983.00 + ], + [ + 2954.00, + 1979.00 + ], + [ + 2948.00, + 1975.00 + ], + [ + 2946.00, + 1970.00 + ], + [ + 2945.00, + 1968.00 + ], + [ + 2944.00, + 1966.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2941.00, + 1935.00 + ], + [ + 2941.00, + 1933.00 + ], + [ + 2941.00, + 1931.00 + ], + [ + 2948.00, + 1923.00 + ], + [ + 2949.00, + 1921.00 + ], + [ + 2950.00, + 1919.00 + ], + [ + 2955.00, + 1910.00 + ], + [ + 2955.00, + 1909.00 + ], + [ + 2955.00, + 1908.00 + ], + [ + 2956.00, + 1901.00 + ], + [ + 2956.00, + 1900.00 + ], + [ + 2956.00, + 1899.00 + ], + [ + 2947.00, + 1893.00 + ], + [ + 2943.00, + 1889.00 + ], + [ + 2939.00, + 1885.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2913.00, + 1880.00 + ], + [ + 2910.00, + 1879.00 + ], + [ + 2907.00, + 1878.00 + ], + [ + 2901.00, + 1874.00 + ], + [ + 2900.00, + 1873.00 + ], + [ + 2899.00, + 1872.00 + ], + [ + 2886.00, + 1861.00 + ], + [ + 2881.00, + 1857.00 + ], + [ + 2876.00, + 1853.00 + ], + [ + 2868.00, + 1848.00 + ], + [ + 2866.00, + 1846.00 + ], + [ + 2864.00, + 1844.00 + ], + [ + 2851.00, + 1836.00 + ], + [ + 2850.00, + 1836.00 + ], + [ + 2849.00, + 1836.00 + ], + [ + 2838.00, + 1828.00 + ], + [ + 2837.00, + 1827.00 + ], + [ + 2836.00, + 1826.00 + ], + [ + 2821.00, + 1820.00 + ], + [ + 2818.00, + 1819.00 + ], + [ + 2815.00, + 1818.00 + ], + [ + 2803.00, + 1811.00 + ], + [ + 2801.00, + 1810.00 + ], + [ + 2799.00, + 1809.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2791.00, + 1787.00 + ], + [ + 2791.00, + 1785.00 + ], + [ + 2791.00, + 1783.00 + ], + [ + 2790.00, + 1772.00 + ], + [ + 2784.00, + 1766.00 + ], + [ + 2778.00, + 1760.00 + ], + [ + 2787.00, + 1746.00 + ], + [ + 2787.00, + 1745.00 + ], + [ + 2787.00, + 1744.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2744.00, + 1728.00 + ], + [ + 2744.00, + 1727.00 + ], + [ + 2744.00, + 1726.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2660.00, + 1693.00 + ], + [ + 2659.00, + 1693.00 + ], + [ + 2658.00, + 1693.00 + ], + [ + 2646.00, + 1685.00 + ], + [ + 2645.00, + 1684.00 + ], + [ + 2644.00, + 1683.00 + ], + [ + 2636.00, + 1679.00 + ], + [ + 2634.00, + 1677.00 + ], + [ + 2632.00, + 1675.00 + ], + [ + 2624.00, + 1667.00 + ], + [ + 2624.00, + 1666.00 + ], + [ + 2624.00, + 1665.00 + ], + [ + 2613.00, + 1653.00 + ], + [ + 2612.00, + 1652.00 + ], + [ + 2611.00, + 1651.00 + ], + [ + 2598.00, + 1647.00 + ], + [ + 2598.00, + 1646.00 + ], + [ + 2598.00, + 1645.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2538.00, + 1545.00 + ], + [ + 2537.00, + 1544.00 + ], + [ + 2536.00, + 1543.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2514.00, + 1534.00 + ], + [ + 2513.00, + 1534.00 + ], + [ + 2512.00, + 1534.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2477.00, + 1533.00 + ], + [ + 2473.00, + 1533.00 + ], + [ + 2469.00, + 1533.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2428.00, + 1540.00 + ], + [ + 2427.00, + 1540.00 + ], + [ + 2426.00, + 1540.00 + ], + [ + 2407.00, + 1537.00 + ], + [ + 2404.00, + 1535.00 + ], + [ + 2401.00, + 1533.00 + ], + [ + 2394.00, + 1529.00 + ], + [ + 2394.00, + 1526.00 + ], + [ + 2394.00, + 1523.00 + ], + [ + 2398.00, + 1509.00 + ], + [ + 2399.00, + 1507.00 + ], + [ + 2400.00, + 1505.00 + ], + [ + 2401.00, + 1496.00 + ], + [ + 2403.00, + 1488.00 + ], + [ + 2405.00, + 1480.00 + ], + [ + 2409.00, + 1474.00 + ], + [ + 2410.00, + 1471.00 + ], + [ + 2411.00, + 1468.00 + ], + [ + 2417.00, + 1457.00 + ], + [ + 2419.00, + 1453.00 + ], + [ + 2421.00, + 1449.00 + ], + [ + 2425.00, + 1439.00 + ], + [ + 2426.00, + 1438.00 + ], + [ + 2427.00, + 1437.00 + ], + [ + 2432.00, + 1423.00 + ], + [ + 2434.00, + 1419.00 + ], + [ + 2436.00, + 1415.00 + ], + [ + 2439.00, + 1408.00 + ], + [ + 2440.00, + 1406.00 + ], + [ + 2441.00, + 1404.00 + ], + [ + 2455.00, + 1402.00 + ], + [ + 2460.00, + 1401.00 + ], + [ + 2465.00, + 1400.00 + ], + [ + 2468.00, + 1400.00 + ], + [ + 2476.00, + 1402.00 + ], + [ + 2484.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2515.00, + 1404.00 + ], + [ + 2516.00, + 1403.00 + ], + [ + 2517.00, + 1402.00 + ], + [ + 2503.00, + 1398.00 + ], + [ + 2501.00, + 1398.00 + ], + [ + 2499.00, + 1398.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2457.00, + 1367.00 + ], + [ + 2463.00, + 1355.00 + ], + [ + 2466.00, + 1348.00 + ], + [ + 2467.00, + 1348.00 + ], + [ + 2470.00, + 1340.00 + ], + [ + 2473.00, + 1332.00 + ], + [ + 2471.00, + 1331.00 + ], + [ + 2491.00, + 1287.00 + ], + [ + 2493.00, + 1281.00 + ], + [ + 2490.00, + 1275.00 + ], + [ + 2492.00, + 1273.00 + ], + [ + 2494.00, + 1271.00 + ], + [ + 2505.00, + 1241.00 + ], + [ + 2507.00, + 1237.00 + ], + [ + 2509.00, + 1233.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2517.00, + 1210.00 + ], + [ + 2516.00, + 1206.00 + ], + [ + 2515.00, + 1202.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2500.00, + 1163.00 + ], + [ + 2501.00, + 1162.00 + ], + [ + 2506, + 1147 + ], + [ + 2514, + 1132 + ] + ] + }, + { + "name": "Boromir", + "id": "boromir", + "color": "green", + "distance": "650 miles / 1050 km", + "startDate": "December 25, T.A. 3018", + "endDate": "February 25, T.A. 3019", + "path": [ + [ + 3045.00, + 2345.00 + ], + [ + 3045.00, + 2348.00 + ], + [ + 3045.00, + 2345.00 + ], + [ + 3045.00, + 2342.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3037.00, + 2288.00 + ], + [ + 3035.00, + 2285.00 + ], + [ + 3033.00, + 2282.00 + ], + [ + 3031.00, + 2270.00 + ], + [ + 3031.00, + 2268.00 + ], + [ + 3031.00, + 2266.00 + ], + [ + 3028.00, + 2252.00 + ], + [ + 3028.00, + 2249.00 + ], + [ + 3028.00, + 2246.00 + ], + [ + 3024.00, + 2231.00 + ], + [ + 3024.00, + 2228.00 + ], + [ + 3024.00, + 2225.00 + ], + [ + 3028.00, + 2215.00 + ], + [ + 3029.00, + 2211.00 + ], + [ + 3030.00, + 2207.00 + ], + [ + 3032.00, + 2193.00 + ], + [ + 3033.00, + 2190.00 + ], + [ + 3034.00, + 2187.00 + ], + [ + 3039.00, + 2177.00 + ], + [ + 3039.00, + 2176.00 + ], + [ + 3039.00, + 2175.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3046.00, + 2150.00 + ], + [ + 3046.00, + 2149.00 + ], + [ + 3046.00, + 2148.00 + ], + [ + 3051.00, + 2131.00 + ], + [ + 3052.00, + 2130.00 + ], + [ + 3053.00, + 2129.00 + ], + [ + 3054.00, + 2114.00 + ], + [ + 3054.00, + 2113.00 + ], + [ + 3054.00, + 2112.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3006.00, + 2071.00 + ], + [ + 3005.00, + 2070.00 + ], + [ + 3004.00, + 2069.00 + ], + [ + 3003.00, + 2055.00 + ], + [ + 3003.00, + 2051.00 + ], + [ + 3003.00, + 2047.00 + ], + [ + 3009.00, + 2039.00 + ], + [ + 3010.00, + 2038.00 + ], + [ + 3011.00, + 2037.00 + ], + [ + 3020.00, + 2021.00 + ], + [ + 3021.00, + 2020.00 + ], + [ + 3022.00, + 2019.00 + ], + [ + 3031.00, + 2002.00 + ], + [ + 3031.00, + 2000.00 + ], + [ + 3031.00, + 1998.00 + ], + [ + 3027.00, + 1985.00 + ], + [ + 3027.00, + 1984.00 + ], + [ + 3027.00, + 1983.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2960.00, + 1983.00 + ], + [ + 2954.00, + 1979.00 + ], + [ + 2948.00, + 1975.00 + ], + [ + 2946.00, + 1970.00 + ], + [ + 2945.00, + 1968.00 + ], + [ + 2944.00, + 1966.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2941.00, + 1935.00 + ], + [ + 2941.00, + 1933.00 + ], + [ + 2941.00, + 1931.00 + ], + [ + 2948.00, + 1923.00 + ], + [ + 2949.00, + 1921.00 + ], + [ + 2950.00, + 1919.00 + ], + [ + 2955.00, + 1910.00 + ], + [ + 2955.00, + 1909.00 + ], + [ + 2955.00, + 1908.00 + ], + [ + 2956.00, + 1901.00 + ], + [ + 2956.00, + 1900.00 + ], + [ + 2956.00, + 1899.00 + ], + [ + 2947.00, + 1893.00 + ], + [ + 2943.00, + 1889.00 + ], + [ + 2939.00, + 1885.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2913.00, + 1880.00 + ], + [ + 2910.00, + 1879.00 + ], + [ + 2907.00, + 1878.00 + ], + [ + 2901.00, + 1874.00 + ], + [ + 2900.00, + 1873.00 + ], + [ + 2899.00, + 1872.00 + ], + [ + 2886.00, + 1861.00 + ], + [ + 2881.00, + 1857.00 + ], + [ + 2876.00, + 1853.00 + ], + [ + 2868.00, + 1848.00 + ], + [ + 2866.00, + 1846.00 + ], + [ + 2864.00, + 1844.00 + ], + [ + 2851.00, + 1836.00 + ], + [ + 2850.00, + 1836.00 + ], + [ + 2849.00, + 1836.00 + ], + [ + 2838.00, + 1828.00 + ], + [ + 2837.00, + 1827.00 + ], + [ + 2836.00, + 1826.00 + ], + [ + 2821.00, + 1820.00 + ], + [ + 2818.00, + 1819.00 + ], + [ + 2815.00, + 1818.00 + ], + [ + 2803.00, + 1811.00 + ], + [ + 2801.00, + 1810.00 + ], + [ + 2799.00, + 1809.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2791.00, + 1787.00 + ], + [ + 2791.00, + 1785.00 + ], + [ + 2791.00, + 1783.00 + ], + [ + 2790.00, + 1772.00 + ], + [ + 2784.00, + 1766.00 + ], + [ + 2778.00, + 1760.00 + ], + [ + 2787.00, + 1746.00 + ], + [ + 2787.00, + 1745.00 + ], + [ + 2787.00, + 1744.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2744.00, + 1728.00 + ], + [ + 2744.00, + 1727.00 + ], + [ + 2744.00, + 1726.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2660.00, + 1693.00 + ], + [ + 2659.00, + 1693.00 + ], + [ + 2658.00, + 1693.00 + ], + [ + 2646.00, + 1685.00 + ], + [ + 2645.00, + 1684.00 + ], + [ + 2644.00, + 1683.00 + ], + [ + 2636.00, + 1679.00 + ], + [ + 2634.00, + 1677.00 + ], + [ + 2632.00, + 1675.00 + ], + [ + 2624.00, + 1667.00 + ], + [ + 2624.00, + 1666.00 + ], + [ + 2624.00, + 1665.00 + ], + [ + 2613.00, + 1653.00 + ], + [ + 2612.00, + 1652.00 + ], + [ + 2611.00, + 1651.00 + ], + [ + 2598.00, + 1647.00 + ], + [ + 2598.00, + 1646.00 + ], + [ + 2598.00, + 1645.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2538.00, + 1545.00 + ], + [ + 2537.00, + 1544.00 + ], + [ + 2536.00, + 1543.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2514.00, + 1534.00 + ], + [ + 2513.00, + 1534.00 + ], + [ + 2512.00, + 1534.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2477.00, + 1533.00 + ], + [ + 2473.00, + 1533.00 + ], + [ + 2469.00, + 1533.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2428.00, + 1540.00 + ], + [ + 2427.00, + 1540.00 + ], + [ + 2426.00, + 1540.00 + ], + [ + 2407.00, + 1537.00 + ], + [ + 2404.00, + 1535.00 + ], + [ + 2401.00, + 1533.00 + ], + [ + 2394.00, + 1529.00 + ], + [ + 2394.00, + 1526.00 + ], + [ + 2394.00, + 1523.00 + ], + [ + 2398.00, + 1509.00 + ], + [ + 2399.00, + 1507.00 + ], + [ + 2400.00, + 1505.00 + ], + [ + 2401.00, + 1496.00 + ], + [ + 2403.00, + 1488.00 + ], + [ + 2405.00, + 1480.00 + ], + [ + 2409.00, + 1474.00 + ], + [ + 2410.00, + 1471.00 + ], + [ + 2411.00, + 1468.00 + ], + [ + 2417.00, + 1457.00 + ], + [ + 2419.00, + 1453.00 + ], + [ + 2421.00, + 1449.00 + ], + [ + 2425.00, + 1439.00 + ], + [ + 2426.00, + 1438.00 + ], + [ + 2427.00, + 1437.00 + ], + [ + 2432.00, + 1423.00 + ], + [ + 2434.00, + 1419.00 + ], + [ + 2436.00, + 1415.00 + ], + [ + 2439.00, + 1408.00 + ], + [ + 2440.00, + 1406.00 + ], + [ + 2441.00, + 1404.00 + ], + [ + 2455.00, + 1402.00 + ], + [ + 2460.00, + 1401.00 + ], + [ + 2465.00, + 1400.00 + ], + [ + 2468.00, + 1400.00 + ], + [ + 2476.00, + 1402.00 + ], + [ + 2484.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2515.00, + 1404.00 + ], + [ + 2516.00, + 1403.00 + ], + [ + 2517.00, + 1402.00 + ], + [ + 2503.00, + 1398.00 + ], + [ + 2501.00, + 1398.00 + ], + [ + 2499.00, + 1398.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2457.00, + 1367.00 + ], + [ + 2463.00, + 1355.00 + ], + [ + 2466.00, + 1348.00 + ], + [ + 2467.00, + 1348.00 + ], + [ + 2470.00, + 1340.00 + ], + [ + 2473.00, + 1332.00 + ], + [ + 2471.00, + 1331.00 + ], + [ + 2491.00, + 1287.00 + ], + [ + 2493.00, + 1281.00 + ], + [ + 2490.00, + 1275.00 + ], + [ + 2492.00, + 1273.00 + ], + [ + 2494.00, + 1271.00 + ], + [ + 2505.00, + 1241.00 + ], + [ + 2507.00, + 1237.00 + ], + [ + 2509.00, + 1233.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2517.00, + 1210.00 + ], + [ + 2516.00, + 1206.00 + ], + [ + 2515.00, + 1202.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2500.00, + 1163.00 + ], + [ + 2501.00, + 1162.00 + ], + [ + 2506, + 1147 + ], + [ + 2514, + 1132 + ] + ] + }, + { + "name": "Gandalf the Grey", + "id": "gandalf_grey", + "color": "olive", + "distance": "280 miles / 450 km (from Rivendell)", + "startDate": "December 25, T.A. 3018", + "endDate": "January 15, T.A. 3019", + "path": [ + [ + 2337.00, + 2112.00 + ], + [ + 2344.50, + 2133.00 + ], + [ + 2344.50, + 2133.00 + ], + [ + 2344.50, + 2133.00 + ], + [ + 2344.50, + 2151.00 + ], + [ + 2344.50, + 2151.00 + ], + [ + 2344.50, + 2151.00 + ], + [ + 2344.50, + 2175.00 + ], + [ + 2344.50, + 2175.00 + ], + [ + 2344.50, + 2175.00 + ], + [ + 2341.50, + 2193.00 + ], + [ + 2344.50, + 2196.00 + ], + [ + 2347.50, + 2199.00 + ], + [ + 2356.50, + 2218.50 + ], + [ + 2356.50, + 2218.50 + ], + [ + 2356.50, + 2218.50 + ], + [ + 2365.50, + 2242.50 + ], + [ + 2365.50, + 2242.50 + ], + [ + 2365.50, + 2242.50 + ], + [ + 2389.50, + 2251.50 + ], + [ + 2389.50, + 2251.50 + ], + [ + 2389.50, + 2251.50 + ], + [ + 2416.50, + 2256.00 + ], + [ + 2416.50, + 2256.00 + ], + [ + 2416.50, + 2256.00 + ], + [ + 2445.00, + 2262.00 + ], + [ + 2445.00, + 2262.00 + ], + [ + 2445.00, + 2262.00 + ], + [ + 2475.00, + 2272.50 + ], + [ + 2475.00, + 2272.50 + ], + [ + 2475.00, + 2272.50 + ], + [ + 2494.50, + 2286.00 + ], + [ + 2494.50, + 2286.00 + ], + [ + 2494.50, + 2286.00 + ], + [ + 2520.00, + 2298.00 + ], + [ + 2520.00, + 2298.00 + ], + [ + 2520.00, + 2298.00 + ], + [ + 2547.00, + 2313.00 + ], + [ + 2547.00, + 2313.00 + ], + [ + 2547.00, + 2313.00 + ], + [ + 2569.50, + 2329.50 + ], + [ + 2569.50, + 2329.50 + ], + [ + 2569.50, + 2329.50 + ], + [ + 2581.50, + 2347.50 + ], + [ + 2581.50, + 2349.00 + ], + [ + 2581.50, + 2350.50 + ], + [ + 2589.00, + 2385.00 + ], + [ + 2589.00, + 2385.00 + ], + [ + 2589.00, + 2385.00 + ], + [ + 2572.50, + 2374.50 + ], + [ + 2572.50, + 2374.50 + ], + [ + 2572.50, + 2374.50 + ], + [ + 2554.50, + 2358.00 + ], + [ + 2554.50, + 2356.50 + ], + [ + 2554.50, + 2355.00 + ], + [ + 2526.00, + 2340.00 + ], + [ + 2526.00, + 2340.00 + ], + [ + 2526.00, + 2340.00 + ], + [ + 2476.50, + 2320.50 + ], + [ + 2476.50, + 2320.50 + ], + [ + 2476.50, + 2320.50 + ], + [ + 2449.50, + 2302.50 + ], + [ + 2449.50, + 2302.50 + ], + [ + 2449.50, + 2302.50 + ], + [ + 2422.50, + 2290.50 + ], + [ + 2422.50, + 2290.50 + ], + [ + 2422.50, + 2290.50 + ], + [ + 2394.00, + 2280.00 + ], + [ + 2394.00, + 2280.00 + ], + [ + 2394.00, + 2280.00 + ], + [ + 2355.00, + 2269.50 + ], + [ + 2353.50, + 2269.50 + ], + [ + 2352.00, + 2269.50 + ], + [ + 2323.50, + 2256.00 + ], + [ + 2323.50, + 2256.00 + ], + [ + 2323.50, + 2256.00 + ], + [ + 2298.00, + 2245.50 + ], + [ + 2298.00, + 2244.00 + ], + [ + 2298.00, + 2242.50 + ], + [ + 2271.00, + 2232.00 + ], + [ + 2271.00, + 2232.00 + ], + [ + 2271.00, + 2232.00 + ], + [ + 2236.50, + 2218.50 + ], + [ + 2236.50, + 2218.50 + ], + [ + 2236.50, + 2218.50 + ], + [ + 2208.00, + 2199.00 + ], + [ + 2208.00, + 2199.00 + ], + [ + 2208.00, + 2199.00 + ], + [ + 2179.50, + 2172.00 + ], + [ + 2179.50, + 2172.00 + ], + [ + 2179.50, + 2172.00 + ], + [ + 2158.50, + 2142.00 + ], + [ + 2158.50, + 2142.00 + ], + [ + 2158.50, + 2142.00 + ], + [ + 2142.00, + 2112.00 + ], + [ + 2142.00, + 2112.00 + ], + [ + 2142.00, + 2112.00 + ], + [ + 2131.50, + 2082.00 + ], + [ + 2131.50, + 2082.00 + ], + [ + 2131.50, + 2082.00 + ], + [ + 2116.50, + 2041.50 + ], + [ + 2116.50, + 2041.50 + ], + [ + 2116.50, + 2041.50 + ], + [ + 2106.00, + 2015.00 + ], + [ + 2106.00, + 2015.00 + ], + [ + 2106.00, + 2015.00 + ], + [ + 2096.00, + 1991.00 + ], + [ + 2096.00, + 1991.00 + ], + [ + 2096.00, + 1991.00 + ], + [ + 2088.00, + 1965.00 + ], + [ + 2088.00, + 1965.00 + ], + [ + 2088.00, + 1965.00 + ], + [ + 2082.00, + 1946.00 + ], + [ + 2082.00, + 1946.00 + ], + [ + 2082.00, + 1946.00 + ], + [ + 2075.00, + 1926.00 + ], + [ + 2075.00, + 1926.00 + ], + [ + 2075.00, + 1926.00 + ], + [ + 2071.00, + 1908.00 + ], + [ + 2071.00, + 1908.00 + ], + [ + 2071.00, + 1908.00 + ], + [ + 2066.00, + 1885.00 + ], + [ + 2066.00, + 1885.00 + ], + [ + 2066.00, + 1885.00 + ], + [ + 2060.00, + 1864.00 + ], + [ + 2060.00, + 1864.00 + ], + [ + 2060.00, + 1864.00 + ], + [ + 2054.00, + 1842.00 + ], + [ + 2054.00, + 1842.00 + ], + [ + 2054.00, + 1842.00 + ], + [ + 2053.00, + 1822.00 + ], + [ + 2053.00, + 1822.00 + ], + [ + 2053.00, + 1822.00 + ], + [ + 2055.00, + 1803.00 + ], + [ + 2055.00, + 1803.00 + ], + [ + 2055.00, + 1803.00 + ], + [ + 2055.00, + 1782.00 + ], + [ + 2055.00, + 1782.00 + ], + [ + 2055.00, + 1782.00 + ], + [ + 2049.00, + 1753.00 + ], + [ + 2049.00, + 1753.00 + ], + [ + 2049.00, + 1753.00 + ], + [ + 2044.00, + 1734.00 + ], + [ + 2044.00, + 1734.00 + ], + [ + 2044.00, + 1734.00 + ], + [ + 2034.00, + 1712.00 + ], + [ + 2034.00, + 1712.00 + ], + [ + 2034.00, + 1712.00 + ], + [ + 2025.00, + 1693.00 + ], + [ + 2025.00, + 1693.00 + ], + [ + 2025.00, + 1693.00 + ], + [ + 2013.00, + 1677.00 + ], + [ + 2013.00, + 1676.00 + ], + [ + 2013.00, + 1675.00 + ], + [ + 2002.00, + 1655.00 + ], + [ + 2002.00, + 1655.00 + ], + [ + 2002.00, + 1655.00 + ], + [ + 1987.00, + 1636.00 + ], + [ + 1987.00, + 1636.00 + ], + [ + 1987.00, + 1636.00 + ], + [ + 1971.00, + 1621.00 + ], + [ + 1971.00, + 1621.00 + ], + [ + 1971.00, + 1621.00 + ], + [ + 1963.00, + 1594.00 + ], + [ + 1963.00, + 1594.00 + ], + [ + 1963.00, + 1594.00 + ], + [ + 1957.00, + 1572.00 + ], + [ + 1957.00, + 1572.00 + ], + [ + 1957.00, + 1572.00 + ], + [ + 1945.00, + 1555.00 + ], + [ + 1945.00, + 1555.00 + ], + [ + 1945.00, + 1555.00 + ], + [ + 1937.00, + 1538.00 + ], + [ + 1937.00, + 1538.00 + ], + [ + 1937.00, + 1538.00 + ], + [ + 1924.00, + 1518.00 + ], + [ + 1924.00, + 1518.00 + ], + [ + 1924.00, + 1518.00 + ], + [ + 1910.00, + 1502.00 + ], + [ + 1910.00, + 1501.00 + ], + [ + 1910.00, + 1500.00 + ], + [ + 1896.00, + 1488.00 + ], + [ + 1896.00, + 1488.00 + ], + [ + 1896.00, + 1488.00 + ], + [ + 1878.00, + 1474.00 + ], + [ + 1878.00, + 1474.00 + ], + [ + 1878.00, + 1474.00 + ], + [ + 1854.00, + 1458.00 + ], + [ + 1854.00, + 1458.00 + ], + [ + 1854.00, + 1458.00 + ], + [ + 1834.00, + 1443.00 + ], + [ + 1834.00, + 1443.00 + ], + [ + 1834.00, + 1443.00 + ], + [ + 1818.00, + 1431.00 + ], + [ + 1818.00, + 1430.00 + ], + [ + 1818.00, + 1429.00 + ], + [ + 1795.00, + 1418.00 + ], + [ + 1795.00, + 1418.00 + ], + [ + 1795.00, + 1418.00 + ], + [ + 1776.00, + 1410.00 + ], + [ + 1776.00, + 1410.00 + ], + [ + 1776.00, + 1410.00 + ], + [ + 1750.00, + 1393.00 + ], + [ + 1750.00, + 1393.00 + ], + [ + 1750.00, + 1393.00 + ], + [ + 1727.00, + 1385.00 + ], + [ + 1727.00, + 1385.00 + ], + [ + 1727.00, + 1385.00 + ], + [ + 1703.00, + 1383.00 + ], + [ + 1702.00, + 1383.00 + ], + [ + 1701.00, + 1383.00 + ], + [ + 1682.00, + 1382.00 + ], + [ + 1681.00, + 1382.00 + ], + [ + 1680.00, + 1382.00 + ], + [ + 1659.00, + 1379.00 + ], + [ + 1659.00, + 1379.00 + ], + [ + 1659.00, + 1379.00 + ], + [ + 1629.00, + 1378.00 + ], + [ + 1629.00, + 1378.00 + ], + [ + 1629.00, + 1378.00 + ], + [ + 1605.00, + 1379.00 + ], + [ + 1605.00, + 1378.00 + ], + [ + 1605.00, + 1377.00 + ], + [ + 1584.00, + 1369.00 + ], + [ + 1584.00, + 1369.00 + ], + [ + 1584.00, + 1369.00 + ], + [ + 1561.00, + 1356.00 + ], + [ + 1561.00, + 1356.00 + ], + [ + 1561.00, + 1356.00 + ], + [ + 1546.00, + 1331.00 + ], + [ + 1545.00, + 1331.00 + ], + [ + 1544.00, + 1331.00 + ], + [ + 1526.00, + 1314.00 + ], + [ + 1526.00, + 1314.00 + ], + [ + 1526.00, + 1314.00 + ], + [ + 1515.00, + 1295.00 + ], + [ + 1515.00, + 1295.00 + ], + [ + 1515.00, + 1295.00 + ], + [ + 1501.00, + 1268.00 + ], + [ + 1501.00, + 1268.00 + ], + [ + 1501.00, + 1268.00 + ], + [ + 1488.00, + 1253.00 + ], + [ + 1488.00, + 1253.00 + ], + [ + 1488.00, + 1253.00 + ], + [ + 1466.00, + 1244.00 + ], + [ + 1466.00, + 1244.00 + ], + [ + 1466.00, + 1244.00 + ], + [ + 1449.00, + 1230.00 + ], + [ + 1449.00, + 1230.00 + ], + [ + 1449.00, + 1230.00 + ], + [ + 1437.00, + 1219.00 + ], + [ + 1437.00, + 1219.00 + ], + [ + 1437.00, + 1219.00 + ], + [ + 1426.00, + 1197.00 + ], + [ + 1426.00, + 1197.00 + ], + [ + 1426.00, + 1197.00 + ], + [ + 1419.00, + 1184.00 + ], + [ + 1419.00, + 1184.00 + ], + [ + 1419.00, + 1184.00 + ], + [ + 1436.00, + 1176.00 + ], + [ + 1436.00, + 1176.00 + ], + [ + 1436.00, + 1176.00 + ], + [ + 1452.00, + 1178.00 + ], + [ + 1452.00, + 1178.00 + ], + [ + 1452.00, + 1178.00 + ], + [ + 1469.00, + 1178.00 + ], + [ + 1469.00, + 1178.00 + ], + [ + 1469.00, + 1178.00 + ], + [ + 1482.00, + 1166.00 + ], + [ + 1482.00, + 1166.00 + ], + [ + 1482.00, + 1166.00 + ], + [ + 1494.00, + 1176.00 + ], + [ + 1494.00, + 1176.00 + ], + [ + 1494.00, + 1176.00 + ], + [ + 1516.00, + 1171.00 + ], + [ + 1516.00, + 1171.00 + ], + [ + 1516.00, + 1171.00 + ], + [ + 1535.00, + 1161.00 + ], + [ + 1535.00, + 1161.00 + ], + [ + 1535.00, + 1161.00 + ], + [ + 1564.00, + 1155.00 + ], + [ + 1564.00, + 1154.00 + ], + [ + 1564.00, + 1153.00 + ], + [ + 1589.00, + 1144.00 + ], + [ + 1589.00, + 1144.00 + ], + [ + 1589.00, + 1144.00 + ], + [ + 1608.00, + 1136.00 + ], + [ + 1608.00, + 1136.00 + ], + [ + 1608.00, + 1136.00 + ], + [ + 1629.00, + 1132.00 + ], + [ + 1629.00, + 1131.00 + ], + [ + 1629.00, + 1130.00 + ], + [ + 1653.00, + 1125.00 + ], + [ + 1653.00, + 1125.00 + ], + [ + 1653.00, + 1125.00 + ], + [ + 1682.00, + 1129.00 + ], + [ + 1682.00, + 1129.00 + ], + [ + 1682.00, + 1129.00 + ], + [ + 1705.00, + 1128.00 + ], + [ + 1706.00, + 1128.00 + ], + [ + 1707.00, + 1128.00 + ], + [ + 1727.00, + 1131.00 + ], + [ + 1727.00, + 1131.00 + ], + [ + 1727.00, + 1131.00 + ], + [ + 1751.00, + 1138.00 + ], + [ + 1751.00, + 1138.00 + ], + [ + 1751.00, + 1138.00 + ], + [ + 1758.00, + 1151.00 + ], + [ + 1758.00, + 1151.00 + ], + [ + 1758.00, + 1151.00 + ], + [ + 1761.00, + 1164.00 + ], + [ + 1761.00, + 1164.00 + ], + [ + 1761.00, + 1164.00 + ], + [ + 1772.00, + 1175.00 + ], + [ + 1772.00, + 1175.00 + ], + [ + 1772.00, + 1175.00 + ], + [ + 1784.00, + 1171.00 + ], + [ + 1784.00, + 1171.00 + ], + [ + 1784.00, + 1171.00 + ], + [ + 1793.00, + 1162.00 + ], + [ + 1793.00, + 1162.00 + ], + [ + 1793.00, + 1162.00 + ], + [ + 1811.00, + 1169.00 + ], + [ + 1811.00, + 1169.00 + ], + [ + 1811.00, + 1169.00 + ], + [ + 1833.00, + 1160.00 + ], + [ + 1833.00, + 1160.00 + ], + [ + 1833.00, + 1160.00 + ], + [ + 1851.00, + 1159.00 + ], + [ + 1851.00, + 1159.00 + ], + [ + 1851.00, + 1159.00 + ], + [ + 1868.00, + 1161.00 + ], + [ + 1869.00, + 1161.00 + ], + [ + 1870.00, + 1161.00 + ], + [ + 1893.00, + 1168.00 + ], + [ + 1893.00, + 1168.00 + ], + [ + 1893.00, + 1168.00 + ], + [ + 1913.00, + 1173.00 + ], + [ + 1913.00, + 1173.00 + ], + [ + 1913.00, + 1173.00 + ], + [ + 1930.00, + 1174.00 + ], + [ + 1930.00, + 1174.00 + ], + [ + 1930.00, + 1174.00 + ], + [ + 1945.00, + 1174.00 + ], + [ + 1946.00, + 1174.00 + ], + [ + 1947.00, + 1174.00 + ], + [ + 1958.00, + 1175.00 + ], + [ + 1959.00, + 1175.00 + ], + [ + 1960.00, + 1175.00 + ], + [ + 1978.00, + 1175.00 + ], + [ + 1978.00, + 1175.00 + ], + [ + 1978.00, + 1175.00 + ], + [ + 1994.00, + 1174.00 + ], + [ + 1994.00, + 1174.00 + ], + [ + 1994.00, + 1174.00 + ], + [ + 2014.00, + 1171.00 + ], + [ + 2014.00, + 1171.00 + ], + [ + 2014.00, + 1171.00 + ], + [ + 2038.00, + 1165.00 + ], + [ + 2038.00, + 1165.00 + ], + [ + 2038.00, + 1165.00 + ], + [ + 2059.00, + 1162.00 + ], + [ + 2059.00, + 1162.00 + ], + [ + 2059.00, + 1162.00 + ], + [ + 2071.00, + 1157.00 + ], + [ + 2071.00, + 1157.00 + ], + [ + 2071.00, + 1157.00 + ], + [ + 2096.00, + 1147.00 + ], + [ + 2096.00, + 1147.00 + ], + [ + 2096.00, + 1147.00 + ], + [ + 2115.00, + 1140.00 + ], + [ + 2115.00, + 1140.00 + ], + [ + 2115.00, + 1140.00 + ], + [ + 2134.00, + 1135.00 + ], + [ + 2135.00, + 1135.00 + ], + [ + 2136.00, + 1135.00 + ], + [ + 2156.00, + 1131.00 + ], + [ + 2156.00, + 1131.00 + ], + [ + 2156.00, + 1131.00 + ], + [ + 2174.00, + 1132.00 + ], + [ + 2174.00, + 1132.00 + ], + [ + 2174.00, + 1132.00 + ], + [ + 2193.00, + 1127.00 + ], + [ + 2193.00, + 1127.00 + ], + [ + 2193.00, + 1127.00 + ], + [ + 2213.00, + 1123.00 + ], + [ + 2213.00, + 1123.00 + ], + [ + 2213.00, + 1123.00 + ], + [ + 2230.00, + 1122.00 + ], + [ + 2230.00, + 1122.00 + ], + [ + 2230.00, + 1122.00 + ], + [ + 2252.00, + 1125.00 + ], + [ + 2252.00, + 1125.00 + ], + [ + 2252.00, + 1125.00 + ], + [ + 2276.00, + 1128.00 + ], + [ + 2276.00, + 1128.00 + ], + [ + 2276.00, + 1128.00 + ], + [ + 2302.00, + 1132.00 + ], + [ + 2302.00, + 1132.00 + ], + [ + 2302.00, + 1132.00 + ], + [ + 2330.00, + 1134.00 + ], + [ + 2330.00, + 1134.00 + ], + [ + 2330.00, + 1134.00 + ], + [ + 2352.00, + 1135.00 + ], + [ + 2352.00, + 1135.00 + ], + [ + 2352.00, + 1135.00 + ], + [ + 2368.00, + 1142.00 + ], + [ + 2368.00, + 1142.00 + ], + [ + 2368.00, + 1142.00 + ], + [ + 2388.00, + 1144.00 + ], + [ + 2388.00, + 1144.00 + ], + [ + 2388.00, + 1144.00 + ], + [ + 2413.00, + 1146.00 + ], + [ + 2413.00, + 1146.00 + ], + [ + 2413.00, + 1146.00 + ], + [ + 2431.00, + 1148.00 + ], + [ + 2431.00, + 1148.00 + ], + [ + 2431.00, + 1148.00 + ], + [ + 2450.00, + 1151.00 + ], + [ + 2450.00, + 1151.00 + ], + [ + 2450.00, + 1151.00 + ], + [ + 2469.00, + 1152.00 + ], + [ + 2469.00, + 1151.00 + ], + [ + 2469.00, + 1150.00 + ], + [ + 2484.00, + 1150.00 + ], + [ + 2484.00, + 1150.00 + ], + [ + 2484.00, + 1150.00 + ], + [ + 2499.00, + 1143.00 + ], + [ + 2499.00, + 1143.00 + ], + [ + 2499.00, + 1143.00 + ], + [ + 2514.00, + 1131.00 + ], + [ + 2514.00, + 1131.00 + ], + [ + 2514.00, + 1133.00 + ], + [ + 2501.00, + 1163.00 + ], + [ + 2500.00, + 1164.00 + ], + [ + 2505.00, + 1179.00 + ], + [ + 2505.00, + 1179.00 + ], + [ + 2505.00, + 1179.00 + ], + [ + 2510.00, + 1190.00 + ], + [ + 2510.00, + 1190.00 + ], + [ + 2510.00, + 1190.00 + ], + [ + 2515.00, + 1203.00 + ], + [ + 2516.00, + 1207.00 + ], + [ + 2517.00, + 1211.00 + ], + [ + 2509.00, + 1232.00 + ], + [ + 2509.00, + 1232.00 + ], + [ + 2509.00, + 1232.00 + ], + [ + 2509.00, + 1234.00 + ], + [ + 2507.00, + 1238.00 + ], + [ + 2505.00, + 1242.00 + ], + [ + 2494.00, + 1272.00 + ], + [ + 2492.00, + 1274.00 + ], + [ + 2490.00, + 1276.00 + ], + [ + 2493.00, + 1282.00 + ], + [ + 2491.00, + 1288.00 + ], + [ + 2471.00, + 1332.00 + ], + [ + 2473.00, + 1333.00 + ], + [ + 2470.00, + 1341.00 + ], + [ + 2467.00, + 1349.00 + ], + [ + 2466.00, + 1349.00 + ], + [ + 2463.00, + 1356.00 + ], + [ + 2457.00, + 1368.00 + ], + [ + 2448.00, + 1377.00 + ], + [ + 2448.00, + 1377.00 + ], + [ + 2448.00, + 1377.00 + ], + [ + 2462.00, + 1388.00 + ], + [ + 2462.00, + 1388.00 + ], + [ + 2462.00, + 1388.00 + ], + [ + 2485.00, + 1394.00 + ], + [ + 2485.00, + 1394.00 + ], + [ + 2485.00, + 1394.00 + ], + [ + 2499.00, + 1399.00 + ], + [ + 2501.00, + 1399.00 + ], + [ + 2503.00, + 1399.00 + ], + [ + 2517.00, + 1403.00 + ], + [ + 2516.00, + 1404.00 + ], + [ + 2515.00, + 1405.00 + ], + [ + 2498.00, + 1405.00 + ], + [ + 2498.00, + 1405.00 + ], + [ + 2498.00, + 1405.00 + ], + [ + 2484.00, + 1405.00 + ], + [ + 2476.00, + 1403.00 + ], + [ + 2468.00, + 1401.00 + ], + [ + 2465.00, + 1401.00 + ], + [ + 2460.00, + 1402.00 + ], + [ + 2455.00, + 1403.00 + ], + [ + 2441.00, + 1405.00 + ], + [ + 2440.00, + 1407.00 + ], + [ + 2439.00, + 1409.00 + ], + [ + 2436.00, + 1416.00 + ], + [ + 2434.00, + 1420.00 + ], + [ + 2432.00, + 1424.00 + ], + [ + 2427.00, + 1438.00 + ], + [ + 2426.00, + 1439.00 + ], + [ + 2425.00, + 1440.00 + ], + [ + 2421.00, + 1450.00 + ], + [ + 2419.00, + 1454.00 + ], + [ + 2417.00, + 1458.00 + ], + [ + 2411.00, + 1469.00 + ], + [ + 2410.00, + 1472.00 + ], + [ + 2409.00, + 1475.00 + ], + [ + 2405.00, + 1481.00 + ], + [ + 2403.00, + 1489.00 + ], + [ + 2401.00, + 1497.00 + ], + [ + 2400.00, + 1506.00 + ], + [ + 2399.00, + 1508.00 + ], + [ + 2398.00, + 1510.00 + ], + [ + 2394.00, + 1524.00 + ], + [ + 2394.00, + 1527.00 + ], + [ + 2394.00, + 1530.00 + ], + [ + 2401.00, + 1534.00 + ], + [ + 2404.00, + 1536.00 + ], + [ + 2407.00, + 1538.00 + ], + [ + 2426.00, + 1541.00 + ], + [ + 2427.00, + 1541.00 + ], + [ + 2428.00, + 1541.00 + ], + [ + 2439.00, + 1539.00 + ], + [ + 2439.00, + 1539.00 + ], + [ + 2439.00, + 1539.00 + ], + [ + 2457.00, + 1538.00 + ], + [ + 2457.00, + 1538.00 + ], + [ + 2457.00, + 1538.00 + ], + [ + 2469.00, + 1534.00 + ], + [ + 2473.00, + 1534.00 + ], + [ + 2477.00, + 1534.00 + ], + [ + 2503.00, + 1536.00 + ], + [ + 2503.00, + 1536.00 + ], + [ + 2503.00, + 1536.00 + ], + [ + 2512.00, + 1535.00 + ], + [ + 2513.00, + 1535.00 + ], + [ + 2514.00, + 1535.00 + ], + [ + 2526.00, + 1538.00 + ], + [ + 2526.00, + 1538.00 + ], + [ + 2526.00, + 1538.00 + ] + ] + }, + { + "name": "Gandalf the White", + "id": "gandalf_white", + "color": "gold", + "distance": "950 miles / 1530 km", + "startDate": "March 1", + "endDate": "March 25, T.A. 3019", + "path": [ + [ + 2532.00, + 1548.00 + ], + [ + 2551.00, + 1558.00 + ], + [ + 2551.00, + 1558.00 + ], + [ + 2551.00, + 1558.00 + ], + [ + 2568.00, + 1573.00 + ], + [ + 2568.00, + 1573.00 + ], + [ + 2568.00, + 1573.00 + ], + [ + 2585.00, + 1588.00 + ], + [ + 2585.00, + 1588.00 + ], + [ + 2585.00, + 1588.00 + ], + [ + 2604.00, + 1602.00 + ], + [ + 2604.00, + 1602.00 + ], + [ + 2604.00, + 1602.00 + ], + [ + 2630.00, + 1617.00 + ], + [ + 2630.00, + 1617.00 + ], + [ + 2630.00, + 1617.00 + ], + [ + 2662.00, + 1637.00 + ], + [ + 2662.00, + 1637.00 + ], + [ + 2662.00, + 1637.00 + ], + [ + 2679.00, + 1650.00 + ], + [ + 2679.00, + 1650.00 + ], + [ + 2679.00, + 1650.00 + ], + [ + 2701.00, + 1662.00 + ], + [ + 2701.00, + 1662.00 + ], + [ + 2701.00, + 1662.00 + ], + [ + 2721.00, + 1679.00 + ], + [ + 2721.00, + 1679.00 + ], + [ + 2721.00, + 1679.00 + ], + [ + 2737.00, + 1694.00 + ], + [ + 2737.00, + 1694.00 + ], + [ + 2737.00, + 1694.00 + ], + [ + 2755.00, + 1706.00 + ], + [ + 2755.00, + 1706.00 + ], + [ + 2755.00, + 1706.00 + ], + [ + 2741.00, + 1720.00 + ], + [ + 2741.00, + 1720.00 + ], + [ + 2741.00, + 1720.00 + ], + [ + 2727.00, + 1729.00 + ], + [ + 2727.00, + 1729.00 + ], + [ + 2727.00, + 1729.00 + ], + [ + 2718.00, + 1736.00 + ], + [ + 2718.00, + 1736.00 + ], + [ + 2718.00, + 1736.00 + ], + [ + 2704.00, + 1750.00 + ], + [ + 2704.00, + 1750.00 + ], + [ + 2704.00, + 1750.00 + ], + [ + 2688.00, + 1761.00 + ], + [ + 2688.00, + 1761.00 + ], + [ + 2688.00, + 1761.00 + ], + [ + 2679.00, + 1771.00 + ], + [ + 2679.00, + 1771.00 + ], + [ + 2679.00, + 1771.00 + ], + [ + 2663.00, + 1784.00 + ], + [ + 2663.00, + 1784.00 + ], + [ + 2663.00, + 1784.00 + ], + [ + 2647.00, + 1800.00 + ], + [ + 2647.00, + 1800.00 + ], + [ + 2647.00, + 1800.00 + ], + [ + 2615.00, + 1825.00 + ], + [ + 2615.00, + 1825.00 + ], + [ + 2615.00, + 1825.00 + ], + [ + 2599.00, + 1835.00 + ], + [ + 2599.00, + 1835.00 + ], + [ + 2599.00, + 1835.00 + ], + [ + 2577.00, + 1853.00 + ], + [ + 2577.00, + 1853.00 + ], + [ + 2577.00, + 1853.00 + ], + [ + 2562.00, + 1865.00 + ], + [ + 2562.00, + 1865.00 + ], + [ + 2562.00, + 1865.00 + ], + [ + 2535.00, + 1886.00 + ], + [ + 2535.00, + 1886.00 + ], + [ + 2535.00, + 1886.00 + ], + [ + 2511.00, + 1907.00 + ], + [ + 2511.00, + 1907.00 + ], + [ + 2511.00, + 1907.00 + ], + [ + 2486.00, + 1926.00 + ], + [ + 2486.00, + 1926.00 + ], + [ + 2486.00, + 1926.00 + ], + [ + 2470.00, + 1936.00 + ], + [ + 2470.00, + 1936.00 + ], + [ + 2470.00, + 1936.00 + ], + [ + 2448.00, + 1948.00 + ], + [ + 2448.00, + 1948.00 + ], + [ + 2448.00, + 1948.00 + ], + [ + 2432.00, + 1956.00 + ], + [ + 2432.00, + 1956.00 + ], + [ + 2432.00, + 1956.00 + ], + [ + 2426.00, + 1976.00 + ], + [ + 2426.00, + 1976.00 + ], + [ + 2426.00, + 1976.00 + ], + [ + 2419.00, + 1993.00 + ], + [ + 2419.00, + 1993.00 + ], + [ + 2419.00, + 1993.00 + ], + [ + 2420.00, + 2009.00 + ], + [ + 2420.00, + 2009.00 + ], + [ + 2420.00, + 2009.00 + ], + [ + 2427.00, + 2027.00 + ], + [ + 2427.00, + 2027.00 + ], + [ + 2427.00, + 2027.00 + ], + [ + 2438.00, + 2042.00 + ], + [ + 2438.00, + 2042.00 + ], + [ + 2438.00, + 2042.00 + ], + [ + 2455.00, + 2049.00 + ], + [ + 2455.00, + 2049.00 + ], + [ + 2455.00, + 2049.00 + ], + [ + 2472.00, + 2052.00 + ], + [ + 2472.00, + 2052.00 + ], + [ + 2472.00, + 2052.00 + ], + [ + 2491.00, + 2057.00 + ], + [ + 2491.00, + 2057.00 + ], + [ + 2491.00, + 2057.00 + ], + [ + 2508.00, + 2062.00 + ], + [ + 2508.00, + 2062.00 + ], + [ + 2508.00, + 2062.00 + ], + [ + 2539.00, + 2072.00 + ], + [ + 2539.00, + 2072.00 + ], + [ + 2539.00, + 2072.00 + ], + [ + 2552.00, + 2076.00 + ], + [ + 2552.00, + 2076.00 + ], + [ + 2552.00, + 2076.00 + ], + [ + 2572.00, + 2082.00 + ], + [ + 2572.00, + 2082.00 + ], + [ + 2572.00, + 2082.00 + ], + [ + 2590.00, + 2087.00 + ], + [ + 2590.00, + 2087.00 + ], + [ + 2590.00, + 2087.00 + ], + [ + 2610.00, + 2095.00 + ], + [ + 2610.00, + 2095.00 + ], + [ + 2610.00, + 2095.00 + ], + [ + 2627.00, + 2099.00 + ], + [ + 2627.00, + 2099.00 + ], + [ + 2627.00, + 2099.00 + ], + [ + 2618.00, + 2118.00 + ], + [ + 2618.00, + 2118.00 + ], + [ + 2618.00, + 2118.00 + ], + [ + 2610.00, + 2134.00 + ], + [ + 2610.00, + 2134.00 + ], + [ + 2610.00, + 2134.00 + ], + [ + 2607.00, + 2150.00 + ], + [ + 2607.00, + 2150.00 + ], + [ + 2607.00, + 2150.00 + ], + [ + 2598.00, + 2166.00 + ], + [ + 2598.00, + 2166.00 + ], + [ + 2598.00, + 2166.00 + ], + [ + 2597.00, + 2184.00 + ], + [ + 2597.00, + 2184.00 + ], + [ + 2597.00, + 2184.00 + ], + [ + 2597.00, + 2200.00 + ], + [ + 2597.00, + 2200.00 + ], + [ + 2597.00, + 2200.00 + ], + [ + 2602.00, + 2221.00 + ], + [ + 2602.00, + 2221.00 + ], + [ + 2602.00, + 2221.00 + ], + [ + 2600.00, + 2239.00 + ], + [ + 2600.00, + 2239.00 + ], + [ + 2600.00, + 2239.00 + ], + [ + 2601.00, + 2260.00 + ], + [ + 2601.00, + 2260.00 + ], + [ + 2601.00, + 2260.00 + ], + [ + 2599.00, + 2278.00 + ], + [ + 2599.00, + 2278.00 + ], + [ + 2599.00, + 2278.00 + ], + [ + 2595.00, + 2298.00 + ], + [ + 2595.00, + 2298.00 + ], + [ + 2595.00, + 2298.00 + ], + [ + 2593.00, + 2317.00 + ], + [ + 2593.00, + 2317.00 + ], + [ + 2593.00, + 2317.00 + ], + [ + 2589.00, + 2346.00 + ], + [ + 2589.00, + 2346.00 + ], + [ + 2589.00, + 2346.00 + ], + [ + 2590.00, + 2366.00 + ], + [ + 2590.00, + 2366.00 + ], + [ + 2590.00, + 2366.00 + ], + [ + 2590.00, + 2379.00 + ], + [ + 2590.00, + 2379.00 + ], + [ + 2590.00, + 2379.00 + ], + [ + 2591.00, + 2388.00 + ], + [ + 2591.00, + 2388.00 + ], + [ + 2591.00, + 2388.00 + ], + [ + 2575.00, + 2367.00 + ], + [ + 2575.00, + 2367.00 + ], + [ + 2575.00, + 2367.00 + ], + [ + 2562.00, + 2352.00 + ], + [ + 2562.00, + 2352.00 + ], + [ + 2562.00, + 2352.00 + ], + [ + 2552.00, + 2346.00 + ], + [ + 2552.00, + 2346.00 + ], + [ + 2552.00, + 2346.00 + ], + [ + 2543.00, + 2339.00 + ], + [ + 2543.00, + 2339.00 + ], + [ + 2543.00, + 2339.00 + ], + [ + 2531.00, + 2331.00 + ], + [ + 2531.00, + 2331.00 + ], + [ + 2531.00, + 2331.00 + ], + [ + 2518.00, + 2321.00 + ], + [ + 2518.00, + 2321.00 + ], + [ + 2518.00, + 2321.00 + ], + [ + 2504.00, + 2310.00 + ], + [ + 2504.00, + 2310.00 + ], + [ + 2504.00, + 2310.00 + ], + [ + 2484.00, + 2300.00 + ], + [ + 2484.00, + 2300.00 + ], + [ + 2484.00, + 2300.00 + ], + [ + 2471.00, + 2293.00 + ], + [ + 2471.00, + 2293.00 + ], + [ + 2471.00, + 2293.00 + ], + [ + 2458.00, + 2289.00 + ], + [ + 2458.00, + 2289.00 + ], + [ + 2458.00, + 2289.00 + ], + [ + 2439.00, + 2284.00 + ], + [ + 2439.00, + 2284.00 + ], + [ + 2439.00, + 2284.00 + ], + [ + 2425.00, + 2272.00 + ], + [ + 2425.00, + 2272.00 + ], + [ + 2425.00, + 2272.00 + ], + [ + 2415.00, + 2264.00 + ], + [ + 2415.00, + 2264.00 + ], + [ + 2415.00, + 2264.00 + ], + [ + 2391.00, + 2262.00 + ], + [ + 2391.00, + 2262.00 + ], + [ + 2391.00, + 2262.00 + ], + [ + 2360.00, + 2255.00 + ], + [ + 2360.00, + 2255.00 + ], + [ + 2360.00, + 2255.00 + ], + [ + 2336.00, + 2253.00 + ], + [ + 2336.00, + 2253.00 + ], + [ + 2336.00, + 2253.00 + ], + [ + 2344.00, + 2231.00 + ], + [ + 2344.00, + 2231.00 + ], + [ + 2344.00, + 2231.00 + ], + [ + 2339.00, + 2213.00 + ], + [ + 2339.00, + 2213.00 + ], + [ + 2339.00, + 2213.00 + ], + [ + 2344.00, + 2196.00 + ], + [ + 2344.00, + 2196.00 + ], + [ + 2344.00, + 2196.00 + ], + [ + 2344.00, + 2185.00 + ], + [ + 2344.00, + 2185.00 + ], + [ + 2344.00, + 2185.00 + ], + [ + 2350.00, + 2163.00 + ], + [ + 2350.00, + 2163.00 + ], + [ + 2350.00, + 2163.00 + ], + [ + 2344.00, + 2135.00 + ], + [ + 2344.00, + 2135.00 + ], + [ + 2344.00, + 2135.00 + ], + [ + 2339.00, + 2118.00 + ], + [ + 2339.00, + 2118.00 + ], + [ + 2339.00, + 2118.00 + ], + [ + 2334.00, + 2135.00 + ], + [ + 2334.00, + 2135.00 + ], + [ + 2334.00, + 2135.00 + ], + [ + 2327.00, + 2151.00 + ], + [ + 2327.00, + 2151.00 + ], + [ + 2327.00, + 2151.00 + ], + [ + 2324.00, + 2164.00 + ], + [ + 2324.00, + 2164.00 + ], + [ + 2324.00, + 2164.00 + ], + [ + 2322.00, + 2176.00 + ], + [ + 2322.00, + 2176.00 + ], + [ + 2322.00, + 2176.00 + ], + [ + 2322.00, + 2191.00 + ], + [ + 2322.00, + 2191.00 + ], + [ + 2322.00, + 2191.00 + ], + [ + 2322.00, + 2209.00 + ], + [ + 2322.00, + 2209.00 + ], + [ + 2322.00, + 2209.00 + ], + [ + 2327.00, + 2232.00 + ], + [ + 2327.00, + 2232.00 + ], + [ + 2351.00, + 2267.00 + ], + [ + 2351.00, + 2267.00 + ], + [ + 2368.00, + 2275.00 + ], + [ + 2368.00, + 2275.00 + ], + [ + 2368.00, + 2275.00 + ], + [ + 2383.00, + 2282.00 + ], + [ + 2383.00, + 2282.00 + ], + [ + 2383.00, + 2282.00 + ], + [ + 2395.00, + 2285.00 + ], + [ + 2395.00, + 2285.00 + ], + [ + 2395.00, + 2285.00 + ], + [ + 2409.00, + 2289.00 + ], + [ + 2409.00, + 2289.00 + ], + [ + 2409.00, + 2289.00 + ], + [ + 2428.00, + 2296.00 + ], + [ + 2428.00, + 2296.00 + ], + [ + 2428.00, + 2296.00 + ], + [ + 2449.00, + 2307.00 + ], + [ + 2449.00, + 2307.00 + ], + [ + 2449.00, + 2307.00 + ], + [ + 2462.00, + 2312.00 + ], + [ + 2462.00, + 2312.00 + ], + [ + 2462.00, + 2312.00 + ], + [ + 2485.00, + 2322.00 + ], + [ + 2485.00, + 2322.00 + ], + [ + 2485.00, + 2322.00 + ], + [ + 2502.00, + 2331.00 + ], + [ + 2502.00, + 2331.00 + ], + [ + 2502.00, + 2331.00 + ], + [ + 2515.00, + 2336.00 + ], + [ + 2515.00, + 2336.00 + ], + [ + 2515.00, + 2336.00 + ], + [ + 2539.00, + 2352.00 + ], + [ + 2539.00, + 2352.00 + ], + [ + 2539.00, + 2352.00 + ], + [ + 2556.00, + 2363.00 + ], + [ + 2556.00, + 2363.00 + ], + [ + 2556.00, + 2363.00 + ], + [ + 2574.00, + 2382.00 + ], + [ + 2574.00, + 2382.00 + ], + [ + 2574.00, + 2382.00 + ], + [ + 2581.00, + 2394.00 + ], + [ + 2581.00, + 2394.00 + ], + [ + 2581.00, + 2394.00 + ], + [ + 2603.00, + 2408.00 + ], + [ + 2603.00, + 2408.00 + ], + [ + 2603.00, + 2408.00 + ], + [ + 2622.00, + 2417.00 + ], + [ + 2622.00, + 2417.00 + ], + [ + 2622.00, + 2417.00 + ], + [ + 2632.00, + 2434.00 + ], + [ + 2632.00, + 2434.00 + ], + [ + 2632.00, + 2434.00 + ], + [ + 2642.00, + 2445.00 + ], + [ + 2642.00, + 2445.00 + ], + [ + 2642.00, + 2445.00 + ], + [ + 2653.00, + 2456.00 + ], + [ + 2653.00, + 2456.00 + ], + [ + 2653.00, + 2456.00 + ], + [ + 2665.00, + 2466.00 + ], + [ + 2665.00, + 2466.00 + ], + [ + 2665.00, + 2466.00 + ], + [ + 2679.00, + 2478.00 + ], + [ + 2679.00, + 2478.00 + ], + [ + 2679.00, + 2478.00 + ], + [ + 2696.00, + 2491.00 + ], + [ + 2696.00, + 2491.00 + ], + [ + 2696.00, + 2491.00 + ], + [ + 2717.00, + 2503.00 + ], + [ + 2717.00, + 2503.00 + ], + [ + 2717.00, + 2503.00 + ], + [ + 2732.00, + 2509.00 + ], + [ + 2732.00, + 2509.00 + ], + [ + 2732.00, + 2509.00 + ], + [ + 2756.00, + 2518.00 + ], + [ + 2756.00, + 2518.00 + ], + [ + 2756.00, + 2518.00 + ], + [ + 2771.00, + 2523.00 + ], + [ + 2771.00, + 2523.00 + ], + [ + 2771.00, + 2523.00 + ], + [ + 2796.00, + 2534.00 + ], + [ + 2796.00, + 2534.00 + ], + [ + 2796.00, + 2534.00 + ], + [ + 2815.00, + 2541.00 + ], + [ + 2815.00, + 2541.00 + ], + [ + 2815.00, + 2541.00 + ], + [ + 2831.00, + 2548.00 + ], + [ + 2831.00, + 2548.00 + ], + [ + 2831.00, + 2548.00 + ], + [ + 2854.00, + 2555.00 + ], + [ + 2854.00, + 2555.00 + ], + [ + 2854.00, + 2555.00 + ], + [ + 2874.00, + 2560.00 + ], + [ + 2874.00, + 2560.00 + ], + [ + 2874.00, + 2560.00 + ], + [ + 2890.00, + 2561.00 + ], + [ + 2890.00, + 2561.00 + ], + [ + 2890.00, + 2561.00 + ], + [ + 2907.00, + 2567.00 + ], + [ + 2907.00, + 2567.00 + ], + [ + 2907.00, + 2567.00 + ], + [ + 2931.00, + 2575.00 + ], + [ + 2931.00, + 2575.00 + ], + [ + 2931.00, + 2575.00 + ], + [ + 2951.00, + 2583.00 + ], + [ + 2951.00, + 2583.00 + ], + [ + 2951.00, + 2583.00 + ], + [ + 2970.00, + 2591.00 + ], + [ + 2970.00, + 2591.00 + ], + [ + 2970.00, + 2591.00 + ], + [ + 3006.00, + 2600.00 + ], + [ + 3006.00, + 2600.00 + ], + [ + 3006.00, + 2600.00 + ], + [ + 3031.00, + 2603.00 + ], + [ + 3031.00, + 2603.00 + ], + [ + 3031.00, + 2603.00 + ], + [ + 3052.00, + 2607.00 + ], + [ + 3052.00, + 2607.00 + ], + [ + 3052.00, + 2607.00 + ], + [ + 3071.00, + 2611.00 + ], + [ + 3071.00, + 2611.00 + ], + [ + 3071.00, + 2611.00 + ], + [ + 3092.00, + 2616.00 + ], + [ + 3092.00, + 2616.00 + ], + [ + 3092.00, + 2616.00 + ], + [ + 3116.00, + 2621.00 + ], + [ + 3116.00, + 2621.00 + ], + [ + 3116.00, + 2621.00 + ], + [ + 3153.00, + 2626.00 + ], + [ + 3153.00, + 2626.00 + ], + [ + 3153.00, + 2626.00 + ], + [ + 3182.00, + 2630.00 + ], + [ + 3182.00, + 2630.00 + ], + [ + 3182.00, + 2630.00 + ], + [ + 3205.00, + 2630.00 + ], + [ + 3205.00, + 2630.00 + ], + [ + 3205.00, + 2630.00 + ], + [ + 3222.00, + 2635.00 + ], + [ + 3222.00, + 2635.00 + ], + [ + 3222.00, + 2635.00 + ], + [ + 3236.00, + 2643.00 + ], + [ + 3236.00, + 2643.00 + ], + [ + 3236.00, + 2643.00 + ], + [ + 3248.00, + 2655.00 + ], + [ + 3248.00, + 2655.00 + ], + [ + 3248.00, + 2655.00 + ], + [ + 3263.00, + 2675.00 + ], + [ + 3263.00, + 2675.00 + ], + [ + 3263.00, + 2675.00 + ], + [ + 3276.00, + 2695.00 + ], + [ + 3276.00, + 2695.00 + ], + [ + 3276.00, + 2695.00 + ], + [ + 3280.00, + 2706.00 + ], + [ + 3280.00, + 2706.00 + ], + [ + 3280.00, + 2706.00 + ], + [ + 3287.00, + 2709.00 + ], + [ + 3287.00, + 2709.00 + ], + [ + 3287.00, + 2709.00 + ], + [ + 3312.00, + 2704.00 + ], + [ + 3312.00, + 2704.00 + ], + [ + 3312.00, + 2704.00 + ], + [ + 3328.00, + 2704.00 + ], + [ + 3328.00, + 2704.00 + ], + [ + 3328.00, + 2704.00 + ], + [ + 3342.00, + 2703.00 + ], + [ + 3342.00, + 2703.00 + ], + [ + 3342.00, + 2703.00 + ], + [ + 3365.00, + 2704.00 + ], + [ + 3365.00, + 2704.00 + ], + [ + 3365.00, + 2704.00 + ], + [ + 3373.00, + 2702.00 + ], + [ + 3373.00, + 2702.00 + ], + [ + 3373.00, + 2702.00 + ], + [ + 3371.00, + 2684.00 + ], + [ + 3371.00, + 2684.00 + ], + [ + 3371.00, + 2684.00 + ], + [ + 3370.00, + 2667.00 + ], + [ + 3370.00, + 2667.00 + ], + [ + 3370.00, + 2667.00 + ], + [ + 3366.00, + 2651.00 + ], + [ + 3366.00, + 2651.00 + ], + [ + 3366.00, + 2651.00 + ], + [ + 3362.00, + 2635.00 + ], + [ + 3362.00, + 2635.00 + ], + [ + 3362.00, + 2635.00 + ], + [ + 3360.00, + 2618.00 + ], + [ + 3360.00, + 2618.00 + ], + [ + 3360.00, + 2618.00 + ], + [ + 3357.00, + 2602.00 + ], + [ + 3357.00, + 2602.00 + ], + [ + 3357.00, + 2602.00 + ], + [ + 3356.00, + 2585.00 + ], + [ + 3356.00, + 2585.00 + ], + [ + 3356.00, + 2585.00 + ], + [ + 3353.00, + 2569.00 + ], + [ + 3353.00, + 2569.00 + ], + [ + 3353.00, + 2569.00 + ], + [ + 3351.00, + 2558.00 + ], + [ + 3351.00, + 2558.00 + ], + [ + 3351.00, + 2558.00 + ], + [ + 3342.00, + 2540.00 + ], + [ + 3342.00, + 2540.00 + ], + [ + 3342.00, + 2540.00 + ], + [ + 3338.00, + 2525.00 + ], + [ + 3338.00, + 2525.00 + ], + [ + 3338.00, + 2525.00 + ], + [ + 3334.00, + 2513.00 + ], + [ + 3334.00, + 2513.00 + ], + [ + 3334.00, + 2513.00 + ], + [ + 3332.00, + 2496.00 + ], + [ + 3332.00, + 2496.00 + ], + [ + 3332.00, + 2496.00 + ], + [ + 3330.00, + 2484.00 + ], + [ + 3330.00, + 2484.00 + ], + [ + 3330.00, + 2484.00 + ], + [ + 3328.00, + 2467.00 + ], + [ + 3328.00, + 2467.00 + ], + [ + 3328.00, + 2467.00 + ], + [ + 3330.00, + 2451.00 + ], + [ + 3330.00, + 2451.00 + ], + [ + 3330.00, + 2451.00 + ], + [ + 3332.00, + 2434.00 + ], + [ + 3332.00, + 2434.00 + ], + [ + 3332.00, + 2434.00 + ], + [ + 3337.00, + 2419.00 + ], + [ + 3337.00, + 2419.00 + ], + [ + 3337.00, + 2419.00 + ], + [ + 3347.00, + 2401.00 + ], + [ + 3347.00, + 2401.00 + ], + [ + 3347.00, + 2401.00 + ], + [ + 3353.00, + 2389.00 + ], + [ + 3353.00, + 2389.00 + ], + [ + 3353.00, + 2389.00 + ], + [ + 3367.00, + 2378.00 + ], + [ + 3367.00, + 2378.00 + ], + [ + 3367.00, + 2378.00 + ], + [ + 3373.00, + 2373.00 + ], + [ + 3373.00, + 2373.00 + ] + ] + }, + { + "name": "Aragorn", + "id": "aragorn", + "color": "blue", + "distance": "2100 miles / 3400 km", + "startDate": "September 29, T.A. 3018", + "endDate": "March 25, T.A. 3019", + "path": [ + [ + 3374.00, + 2375.00 + ], + [ + 3374.00, + 2375.00 + ], + [ + 3361.00, + 2384.00 + ], + [ + 3361.00, + 2384.00 + ], + [ + 3361.00, + 2384.00 + ], + [ + 3343.00, + 2405.00 + ], + [ + 3343.00, + 2405.00 + ], + [ + 3343.00, + 2405.00 + ], + [ + 3332.00, + 2424.00 + ], + [ + 3332.00, + 2424.00 + ], + [ + 3332.00, + 2424.00 + ], + [ + 3328.00, + 2449.00 + ], + [ + 3328.00, + 2449.00 + ], + [ + 3328.00, + 2449.00 + ], + [ + 3330.00, + 2471.00 + ], + [ + 3330.00, + 2471.00 + ], + [ + 3330.00, + 2471.00 + ], + [ + 3330.00, + 2500.00 + ], + [ + 3330.00, + 2500.00 + ], + [ + 3330.00, + 2500.00 + ], + [ + 3341.00, + 2523.00 + ], + [ + 3341.00, + 2523.00 + ], + [ + 3341.00, + 2523.00 + ], + [ + 3348.00, + 2547.00 + ], + [ + 3348.00, + 2547.00 + ], + [ + 3348.00, + 2547.00 + ], + [ + 3354.00, + 2567.00 + ], + [ + 3354.00, + 2567.00 + ], + [ + 3354.00, + 2567.00 + ], + [ + 3360.00, + 2592.00 + ], + [ + 3360.00, + 2592.00 + ], + [ + 3360.00, + 2592.00 + ], + [ + 3361.00, + 2610.00 + ], + [ + 3361.00, + 2614.00 + ], + [ + 3361.00, + 2618.00 + ], + [ + 3361.00, + 2634.00 + ], + [ + 3361.00, + 2636.00 + ], + [ + 3361.00, + 2638.00 + ], + [ + 3367.00, + 2658.00 + ], + [ + 3367.00, + 2658.00 + ], + [ + 3367.00, + 2658.00 + ], + [ + 3375.00, + 2687.00 + ], + [ + 3375.00, + 2688.00 + ], + [ + 3375.00, + 2689.00 + ], + [ + 3365.00, + 2699.00 + ], + [ + 3365.00, + 2699.00 + ], + [ + 3365.00, + 2699.00 + ], + [ + 3342.00, + 2700.00 + ], + [ + 3342.00, + 2700.00 + ], + [ + 3342.00, + 2700.00 + ], + [ + 3316.00, + 2703.00 + ], + [ + 3316.00, + 2703.00 + ], + [ + 3316.00, + 2703.00 + ], + [ + 3297.00, + 2705.00 + ], + [ + 3297.00, + 2705.00 + ], + [ + 3297.00, + 2705.00 + ], + [ + 3284.00, + 2712.00 + ], + [ + 3284.00, + 2712.00 + ], + [ + 3284.00, + 2712.00 + ], + [ + 3290.00, + 2716.00 + ], + [ + 3297.00, + 2720.00 + ], + [ + 3304.00, + 2724.00 + ], + [ + 3304.00, + 2725.00 + ], + [ + 3308.00, + 2728.00 + ], + [ + 3312.00, + 2731.00 + ], + [ + 3307.00, + 2737.00 + ], + [ + 3306.00, + 2740.00 + ], + [ + 3305.00, + 2743.00 + ], + [ + 3293.00, + 2749.00 + ], + [ + 3289.00, + 2752.00 + ], + [ + 3285.00, + 2755.00 + ], + [ + 3277.00, + 2763.00 + ], + [ + 3274.00, + 2767.00 + ], + [ + 3271.00, + 2771.00 + ], + [ + 3272.00, + 2785.00 + ], + [ + 3272.00, + 2786.00 + ], + [ + 3272.00, + 2787.00 + ], + [ + 3275.00, + 2802.00 + ], + [ + 3278.00, + 2812.00 + ], + [ + 3281.00, + 2822.00 + ], + [ + 3285.00, + 2827.00 + ], + [ + 3286.00, + 2831.00 + ], + [ + 3287.00, + 2835.00 + ], + [ + 3291.00, + 2855.00 + ], + [ + 3291.00, + 2864.00 + ], + [ + 3291.00, + 2873.00 + ], + [ + 3289.00, + 2881.00 + ], + [ + 3288.00, + 2887.00 + ], + [ + 3287.00, + 2893.00 + ], + [ + 3284.00, + 2907.00 + ], + [ + 3282.00, + 2917.00 + ], + [ + 3280.00, + 2927.00 + ], + [ + 3273.00, + 2936.00 + ], + [ + 3271.00, + 2941.00 + ], + [ + 3269.00, + 2946.00 + ], + [ + 3261.00, + 2964.00 + ], + [ + 3259.00, + 2968.00 + ], + [ + 3257.00, + 2972.00 + ], + [ + 3247.00, + 2986.00 + ], + [ + 3239.00, + 2995.00 + ], + [ + 3231.00, + 3004.00 + ], + [ + 3227.00, + 3008.00 + ], + [ + 3224.00, + 3011.00 + ], + [ + 3221.00, + 3014.00 + ], + [ + 3206.00, + 3029.00 + ], + [ + 3206.00, + 3029.00 + ], + [ + 3206.00, + 3029.00 + ], + [ + 3179.00, + 3035.00 + ], + [ + 3179.00, + 3035.00 + ], + [ + 3179.00, + 3035.00 + ], + [ + 3156.00, + 3032.00 + ], + [ + 3154.00, + 3032.00 + ], + [ + 3152.00, + 3032.00 + ], + [ + 3148.00, + 3032.00 + ], + [ + 3148.00, + 3032.00 + ], + [ + 3148.00, + 3032.00 + ], + [ + 3134.00, + 3031.00 + ], + [ + 3130.00, + 3031.00 + ], + [ + 3126.00, + 3031.00 + ], + [ + 3119.00, + 3035.00 + ], + [ + 3116.00, + 3036.00 + ], + [ + 3113.00, + 3037.00 + ], + [ + 3099.00, + 3039.00 + ], + [ + 3093.00, + 3040.00 + ], + [ + 3087.00, + 3041.00 + ], + [ + 3084.00, + 3041.00 + ], + [ + 3082.00, + 3041.00 + ], + [ + 3080.00, + 3041.00 + ], + [ + 3072.00, + 3045.00 + ], + [ + 3066.00, + 3047.00 + ], + [ + 3060.00, + 3049.00 + ], + [ + 3051.00, + 3051.00 + ], + [ + 3050.00, + 3051.00 + ], + [ + 3049.00, + 3051.00 + ], + [ + 3020.00, + 3064.00 + ], + [ + 3019.00, + 3064.00 + ], + [ + 3018.00, + 3064.00 + ], + [ + 2989.00, + 3066.00 + ], + [ + 2985.00, + 3066.00 + ], + [ + 2981.00, + 3066.00 + ], + [ + 2957.00, + 3064.00 + ], + [ + 2957.00, + 3064.00 + ], + [ + 2957.00, + 3064.00 + ], + [ + 2937.00, + 3058.00 + ], + [ + 2934.00, + 3057.00 + ], + [ + 2931.00, + 3056.00 + ], + [ + 2911.00, + 3043.00 + ], + [ + 2911.00, + 3043.00 + ], + [ + 2911.00, + 3043.00 + ], + [ + 2896.00, + 3027.00 + ], + [ + 2896.00, + 3026.00 + ], + [ + 2896.00, + 3025.00 + ], + [ + 2887.00, + 3012.00 + ], + [ + 2887.00, + 3012.00 + ], + [ + 2887.00, + 3012.00 + ], + [ + 2884.00, + 2992.00 + ], + [ + 2884.00, + 2992.00 + ], + [ + 2884.00, + 2992.00 + ], + [ + 2880.00, + 2979.00 + ], + [ + 2880.00, + 2979.00 + ], + [ + 2880.00, + 2979.00 + ], + [ + 2879.00, + 2964.00 + ], + [ + 2879.00, + 2964.00 + ], + [ + 2879.00, + 2964.00 + ], + [ + 2879.00, + 2950.00 + ], + [ + 2879.00, + 2947.00 + ], + [ + 2879.00, + 2944.00 + ], + [ + 2875.00, + 2934.00 + ], + [ + 2875.00, + 2934.00 + ], + [ + 2875.00, + 2934.00 + ], + [ + 2873.00, + 2917.00 + ], + [ + 2873.00, + 2912.00 + ], + [ + 2873.00, + 2907.00 + ], + [ + 2872.00, + 2904.00 + ], + [ + 2872.00, + 2903.00 + ], + [ + 2872.00, + 2902.00 + ], + [ + 2871.00, + 2887.00 + ], + [ + 2871.00, + 2887.00 + ], + [ + 2871.00, + 2887.00 + ], + [ + 2867.00, + 2862.00 + ], + [ + 2867.00, + 2860.00 + ], + [ + 2867.00, + 2858.00 + ], + [ + 2864.00, + 2840.00 + ], + [ + 2862.00, + 2835.00 + ], + [ + 2860.00, + 2830.00 + ], + [ + 2858.00, + 2828.00 + ], + [ + 2857.00, + 2828.00 + ], + [ + 2856.00, + 2828.00 + ], + [ + 2839.00, + 2809.00 + ], + [ + 2838.00, + 2809.00 + ], + [ + 2837.00, + 2809.00 + ], + [ + 2822.00, + 2802.00 + ], + [ + 2818.00, + 2798.00 + ], + [ + 2814.00, + 2794.00 + ], + [ + 2810.00, + 2790.00 + ], + [ + 2810.00, + 2790.00 + ], + [ + 2810.00, + 2790.00 + ], + [ + 2795.00, + 2784.00 + ], + [ + 2792.00, + 2783.00 + ], + [ + 2789.00, + 2782.00 + ], + [ + 2784.00, + 2776.00 + ], + [ + 2784.00, + 2776.00 + ], + [ + 2784.00, + 2776.00 + ], + [ + 2773.00, + 2771.00 + ], + [ + 2765.00, + 2767.00 + ], + [ + 2757.00, + 2763.00 + ], + [ + 2759.00, + 2764.00 + ], + [ + 2758.00, + 2763.00 + ], + [ + 2757.00, + 2762.00 + ], + [ + 2739.00, + 2757.00 + ], + [ + 2738.00, + 2757.00 + ], + [ + 2737.00, + 2757.00 + ], + [ + 2726.00, + 2755.00 + ], + [ + 2724.00, + 2754.00 + ], + [ + 2722.00, + 2753.00 + ], + [ + 2704.00, + 2751.00 + ], + [ + 2702.00, + 2751.00 + ], + [ + 2700.00, + 2751.00 + ], + [ + 2693.00, + 2744.00 + ], + [ + 2690.00, + 2742.00 + ], + [ + 2687.00, + 2740.00 + ], + [ + 2688.00, + 2731.00 + ], + [ + 2687.00, + 2729.00 + ], + [ + 2686.00, + 2727.00 + ], + [ + 2687.00, + 2713.00 + ], + [ + 2687.00, + 2713.00 + ], + [ + 2687.00, + 2713.00 + ], + [ + 2685.00, + 2693.00 + ], + [ + 2685.00, + 2694.00 + ], + [ + 2685.00, + 2695.00 + ], + [ + 2679.00, + 2680.00 + ], + [ + 2678.00, + 2676.00 + ], + [ + 2677.00, + 2672.00 + ], + [ + 2673.00, + 2663.00 + ], + [ + 2673.00, + 2662.00 + ], + [ + 2673.00, + 2661.00 + ], + [ + 2671.00, + 2648.00 + ], + [ + 2671.00, + 2646.00 + ], + [ + 2671.00, + 2644.00 + ], + [ + 2663.00, + 2630.00 + ], + [ + 2663.00, + 2630.00 + ], + [ + 2663.00, + 2630.00 + ], + [ + 2646.00, + 2616.00 + ], + [ + 2634.00, + 2606.00 + ], + [ + 2629.00, + 2600.00 + ], + [ + 2617.00, + 2600.00 + ], + [ + 2617.00, + 2600.00 + ], + [ + 2617.00, + 2600.00 + ], + [ + 2578.00, + 2590.00 + ], + [ + 2577.00, + 2590.00 + ], + [ + 2576.00, + 2590.00 + ], + [ + 2569.00, + 2580.00 + ], + [ + 2569.00, + 2579.00 + ], + [ + 2569.00, + 2578.00 + ], + [ + 2556.00, + 2570.00 + ], + [ + 2553.00, + 2566.00 + ], + [ + 2550.00, + 2562.00 + ], + [ + 2548.00, + 2559.00 + ], + [ + 2547.00, + 2557.00 + ], + [ + 2546.00, + 2555.00 + ], + [ + 2537.00, + 2542.00 + ], + [ + 2536.00, + 2539.00 + ], + [ + 2535.00, + 2536.00 + ], + [ + 2527.00, + 2519.00 + ], + [ + 2526.00, + 2515.00 + ], + [ + 2525.00, + 2511.00 + ], + [ + 2520.00, + 2506.00 + ], + [ + 2520.00, + 2505.00 + ], + [ + 2520.00, + 2504.00 + ], + [ + 2512.00, + 2492.00 + ], + [ + 2512.00, + 2492.00 + ], + [ + 2512.00, + 2492.00 + ], + [ + 2504.00, + 2477.00 + ], + [ + 2504.00, + 2477.00 + ], + [ + 2504.00, + 2477.00 + ], + [ + 2498.00, + 2464.00 + ], + [ + 2498.00, + 2459.00 + ], + [ + 2498.00, + 2454.00 + ], + [ + 2496.00, + 2440.00 + ], + [ + 2496.00, + 2439.00 + ], + [ + 2496.00, + 2438.00 + ], + [ + 2493.00, + 2418.00 + ], + [ + 2493.00, + 2418.00 + ], + [ + 2493.00, + 2418.00 + ], + [ + 2494.00, + 2397.00 + ], + [ + 2492.00, + 2396.00 + ], + [ + 2490.00, + 2395.00 + ], + [ + 2481.00, + 2393.00 + ], + [ + 2477.00, + 2391.00 + ], + [ + 2473.00, + 2389.00 + ], + [ + 2465.00, + 2386.00 + ], + [ + 2464.00, + 2384.00 + ], + [ + 2463.00, + 2382.00 + ], + [ + 2453.00, + 2376.00 + ], + [ + 2450.00, + 2374.00 + ], + [ + 2447.00, + 2372.00 + ], + [ + 2437.00, + 2361.00 + ], + [ + 2435.00, + 2359.00 + ], + [ + 2433.00, + 2357.00 + ], + [ + 2423.00, + 2343.00 + ], + [ + 2417.00, + 2335.00 + ], + [ + 2415.00, + 2332.00 + ], + [ + 2415.00, + 2328.00 + ], + [ + 2414.00, + 2323.00 + ], + [ + 2413.00, + 2318.00 + ], + [ + 2411.00, + 2314.00 + ], + [ + 2410.00, + 2309.00 + ], + [ + 2409.00, + 2304.00 + ], + [ + 2407.00, + 2293.00 + ], + [ + 2407.00, + 2291.00 + ], + [ + 2407.00, + 2289.00 + ], + [ + 2400.00, + 2281.00 + ], + [ + 2399.00, + 2280.00 + ], + [ + 2398.00, + 2279.00 + ], + [ + 2390.00, + 2277.00 + ], + [ + 2390.00, + 2276.00 + ], + [ + 2390.00, + 2275.00 + ], + [ + 2379.00, + 2274.00 + ], + [ + 2377.00, + 2273.00 + ], + [ + 2375.00, + 2272.00 + ], + [ + 2361.00, + 2265.00 + ], + [ + 2360.00, + 2265.00 + ], + [ + 2359.00, + 2265.00 + ], + [ + 2347.00, + 2261.00 + ], + [ + 2347.00, + 2261.00 + ], + [ + 2347.00, + 2261.00 + ], + [ + 2329.00, + 2250.00 + ], + [ + 2329.00, + 2250.00 + ], + [ + 2329.00, + 2250.00 + ], + [ + 2321.00, + 2242.00 + ], + [ + 2320.00, + 2240.00 + ], + [ + 2319.00, + 2238.00 + ], + [ + 2314.00, + 2224.00 + ], + [ + 2314.00, + 2224.00 + ], + [ + 2314.00, + 2224.00 + ], + [ + 2312.00, + 2201.00 + ], + [ + 2312.00, + 2196.00 + ], + [ + 2312.00, + 2191.00 + ], + [ + 2316.00, + 2184.00 + ], + [ + 2316.00, + 2184.00 + ], + [ + 2316.00, + 2184.00 + ], + [ + 2321.00, + 2180.00 + ], + [ + 2323.00, + 2173.00 + ], + [ + 2323.00, + 2172.00 + ], + [ + 2327.00, + 2164.00 + ], + [ + 2327.00, + 2164.00 + ], + [ + 2327.00, + 2164.00 + ], + [ + 2332.00, + 2150.00 + ], + [ + 2332.00, + 2148.00 + ], + [ + 2332.00, + 2146.00 + ], + [ + 2332.00, + 2137.00 + ], + [ + 2332.00, + 2137.00 + ], + [ + 2332.00, + 2137.00 + ], + [ + 2336.00, + 2123.00 + ], + [ + 2336.00, + 2123.00 + ], + [ + 2336.00, + 2123.00 + ], + [ + 2341.00, + 2135.00 + ], + [ + 2341.00, + 2135.00 + ], + [ + 2341.00, + 2135.00 + ], + [ + 2342.00, + 2142.00 + ], + [ + 2342.00, + 2142.00 + ], + [ + 2342.00, + 2142.00 + ], + [ + 2343.00, + 2151.00 + ], + [ + 2344.00, + 2152.00 + ], + [ + 2345.00, + 2153.00 + ], + [ + 2346.00, + 2161.00 + ], + [ + 2346.00, + 2161.00 + ], + [ + 2346.00, + 2161.00 + ], + [ + 2346.00, + 2179.00 + ], + [ + 2346.00, + 2180.00 + ], + [ + 2346.00, + 2181.00 + ], + [ + 2346.00, + 2189.00 + ], + [ + 2346.00, + 2193.00 + ], + [ + 2346.00, + 2197.00 + ], + [ + 2345.00, + 2201.00 + ], + [ + 2345.00, + 2202.00 + ], + [ + 2345.00, + 2203.00 + ], + [ + 2340.00, + 2213.00 + ], + [ + 2340.00, + 2215.00 + ], + [ + 2340.00, + 2217.00 + ], + [ + 2342.00, + 2225.00 + ], + [ + 2342.00, + 2227.00 + ], + [ + 2342.00, + 2229.00 + ], + [ + 2344.00, + 2240.00 + ], + [ + 2345.00, + 2243.00 + ], + [ + 2346.00, + 2246.00 + ], + [ + 2346.00, + 2249.00 + ], + [ + 2346.00, + 2249.00 + ], + [ + 2346.00, + 2249.00 + ], + [ + 2359.00, + 2254.00 + ], + [ + 2360.00, + 2254.00 + ], + [ + 2361.00, + 2254.00 + ], + [ + 2377.00, + 2255.00 + ], + [ + 2378.00, + 2255.00 + ], + [ + 2379.00, + 2255.00 + ], + [ + 2393.00, + 2260.00 + ], + [ + 2393.00, + 2260.00 + ], + [ + 2393.00, + 2260.00 + ], + [ + 2404.00, + 2264.00 + ], + [ + 2404.00, + 2264.00 + ], + [ + 2404.00, + 2264.00 + ], + [ + 2415.00, + 2270.00 + ], + [ + 2415.00, + 2270.00 + ], + [ + 2415.00, + 2270.00 + ], + [ + 2414.00, + 2280.00 + ], + [ + 2414.00, + 2281.00 + ], + [ + 2414.00, + 2282.00 + ], + [ + 2414.00, + 2291.00 + ], + [ + 2414.00, + 2291.00 + ], + [ + 2414.00, + 2291.00 + ], + [ + 2428.00, + 2328.00 + ], + [ + 2427.00, + 2328.00 + ], + [ + 2426.00, + 2328.00 + ], + [ + 2425.00, + 2321.00 + ], + [ + 2425.00, + 2320.00 + ], + [ + 2420.99, + 2317.60 + ], + [ + 2417.59, + 2305.71 + ], + [ + 2427.00, + 2308.00 + ], + [ + 2427.00, + 2307.73 + ], + [ + 2427.15, + 2306.86 + ], + [ + 2427.36, + 2305.73 + ], + [ + 2427.94, + 2302.69 + ], + [ + 2429.00, + 2297.73 + ], + [ + 2429.00, + 2297.00 + ], + [ + 2429.00, + 2296.00 + ], + [ + 2435.00, + 2285.00 + ], + [ + 2436.00, + 2284.00 + ], + [ + 2437.00, + 2283.00 + ], + [ + 2451.00, + 2280.00 + ], + [ + 2451.00, + 2280.00 + ], + [ + 2451.00, + 2280.00 + ], + [ + 2464.00, + 2287.00 + ], + [ + 2465.00, + 2287.00 + ], + [ + 2466.00, + 2287.00 + ], + [ + 2479.00, + 2294.00 + ], + [ + 2480.00, + 2294.00 + ], + [ + 2481.00, + 2294.00 + ], + [ + 2500.00, + 2305.00 + ], + [ + 2500.00, + 2305.00 + ], + [ + 2500.00, + 2305.00 + ], + [ + 2518.00, + 2317.00 + ], + [ + 2518.00, + 2317.00 + ], + [ + 2518.00, + 2317.00 + ], + [ + 2533.00, + 2327.00 + ], + [ + 2533.00, + 2327.00 + ], + [ + 2533.00, + 2327.00 + ], + [ + 2545.00, + 2330.00 + ], + [ + 2545.00, + 2330.00 + ], + [ + 2545.00, + 2330.00 + ], + [ + 2555.00, + 2342.00 + ], + [ + 2555.00, + 2342.00 + ], + [ + 2555.00, + 2342.00 + ], + [ + 2565.00, + 2351.00 + ], + [ + 2565.00, + 2352.00 + ], + [ + 2565.00, + 2353.00 + ], + [ + 2576.00, + 2361.00 + ], + [ + 2576.00, + 2361.00 + ], + [ + 2576.00, + 2361.00 + ], + [ + 2590.00, + 2390.00 + ], + [ + 2590.00, + 2390.00 + ], + [ + 2590.00, + 2390.00 + ], + [ + 2596.00, + 2369.00 + ], + [ + 2597.00, + 2357.00 + ], + [ + 2598.00, + 2345.00 + ], + [ + 2599.00, + 2344.00 + ], + [ + 2600.00, + 2334.00 + ], + [ + 2601.00, + 2324.00 + ], + [ + 2600.00, + 2321.00 + ], + [ + 2600.00, + 2311.00 + ], + [ + 2600.00, + 2301.00 + ], + [ + 2600.00, + 2304.00 + ], + [ + 2600.00, + 2298.00 + ], + [ + 2600.00, + 2292.00 + ], + [ + 2600.00, + 2283.00 + ], + [ + 2600.00, + 2272.00 + ], + [ + 2600.00, + 2261.00 + ], + [ + 2600.00, + 2266.00 + ], + [ + 2600.00, + 2256.00 + ], + [ + 2600.00, + 2246.00 + ], + [ + 2600.00, + 2249.00 + ], + [ + 2601.00, + 2234.00 + ], + [ + 2602.00, + 2219.00 + ], + [ + 2602.00, + 2226.00 + ], + [ + 2602.00, + 2197.00 + ], + [ + 2602.00, + 2182.00 + ], + [ + 2601.00, + 2190.00 + ], + [ + 2599.00, + 2178.00 + ], + [ + 2597.00, + 2166.00 + ], + [ + 2599.00, + 2170.00 + ], + [ + 2602.00, + 2162.00 + ], + [ + 2605.00, + 2154.00 + ], + [ + 2606.00, + 2154.00 + ], + [ + 2608.00, + 2147.00 + ], + [ + 2610.00, + 2140.00 + ], + [ + 2611.00, + 2137.00 + ], + [ + 2614.00, + 2132.00 + ], + [ + 2617.00, + 2127.00 + ], + [ + 2617.00, + 2126.00 + ], + [ + 2617.00, + 2123.00 + ], + [ + 2617.00, + 2120.00 + ], + [ + 2618.00, + 2115.00 + ], + [ + 2619.00, + 2111.00 + ], + [ + 2620.00, + 2107.00 + ], + [ + 2622.00, + 2105.00 + ], + [ + 2623.00, + 2103.00 + ], + [ + 2624.00, + 2101.00 + ], + [ + 2625.00, + 2091.00 + ], + [ + 2625.00, + 2089.00 + ], + [ + 2625.00, + 2087.00 + ], + [ + 2642.00, + 2087.00 + ], + [ + 2650.00, + 2088.00 + ], + [ + 2652.00, + 2088.00 + ], + [ + 2657.00, + 2090.00 + ], + [ + 2658.00, + 2091.00 + ], + [ + 2659.00, + 2092.00 + ], + [ + 2666.00, + 2092.00 + ], + [ + 2667.00, + 2093.00 + ], + [ + 2668.00, + 2094.00 + ], + [ + 2684.00, + 2097.00 + ], + [ + 2686.00, + 2098.00 + ], + [ + 2688.00, + 2099.00 + ], + [ + 2695.00, + 2103.00 + ], + [ + 2696.00, + 2104.00 + ], + [ + 2697.00, + 2105.00 + ], + [ + 2708.00, + 2112.00 + ], + [ + 2708.00, + 2112.00 + ], + [ + 2708.00, + 2112.00 + ], + [ + 2730.00, + 2128.00 + ], + [ + 2730.00, + 2128.00 + ], + [ + 2730.00, + 2128.00 + ], + [ + 2745.00, + 2140.00 + ], + [ + 2745.00, + 2140.00 + ], + [ + 2745.00, + 2140.00 + ], + [ + 2761.00, + 2150.00 + ], + [ + 2761.00, + 2150.00 + ], + [ + 2761.00, + 2150.00 + ], + [ + 2791.00, + 2168.00 + ], + [ + 2791.00, + 2168.00 + ], + [ + 2791.00, + 2168.00 + ], + [ + 2808.00, + 2194.00 + ], + [ + 2808.00, + 2194.00 + ], + [ + 2808.00, + 2194.00 + ], + [ + 2823.00, + 2214.00 + ], + [ + 2823.00, + 2214.00 + ], + [ + 2823.00, + 2214.00 + ], + [ + 2850.00, + 2233.00 + ], + [ + 2850.00, + 2233.00 + ], + [ + 2850.00, + 2233.00 + ], + [ + 2865.00, + 2250.00 + ], + [ + 2865.00, + 2250.00 + ], + [ + 2865.00, + 2250.00 + ], + [ + 2878.00, + 2269.00 + ], + [ + 2878.00, + 2269.00 + ], + [ + 2878.00, + 2269.00 + ], + [ + 2890.00, + 2286.00 + ], + [ + 2891.00, + 2287.00 + ], + [ + 2892.00, + 2288.00 + ], + [ + 2904.00, + 2291.00 + ], + [ + 2904.00, + 2291.00 + ], + [ + 2904.00, + 2291.00 + ], + [ + 2921.00, + 2293.00 + ], + [ + 2924.00, + 2293.00 + ], + [ + 2927.00, + 2293.00 + ], + [ + 2949.00, + 2300.00 + ], + [ + 2952.00, + 2301.00 + ], + [ + 2955.00, + 2302.00 + ], + [ + 2970.00, + 2308.00 + ], + [ + 2970.00, + 2308.00 + ], + [ + 2970.00, + 2308.00 + ], + [ + 2986.00, + 2325.00 + ], + [ + 2989.00, + 2328.00 + ], + [ + 2992.00, + 2331.00 + ], + [ + 3009.00, + 2340.00 + ], + [ + 3009.00, + 2340.00 + ], + [ + 3009.00, + 2340.00 + ], + [ + 3016.00, + 2355.00 + ], + [ + 3016.00, + 2355.00 + ], + [ + 3016.00, + 2355.00 + ], + [ + 3031.00, + 2368.00 + ], + [ + 3031.00, + 2368.00 + ], + [ + 3031.00, + 2368.00 + ], + [ + 3049.00, + 2383.00 + ], + [ + 3049.00, + 2383.00 + ], + [ + 3049.00, + 2383.00 + ], + [ + 3053.00, + 2367.00 + ], + [ + 3053.00, + 2366.00 + ], + [ + 3053.00, + 2365.00 + ], + [ + 3045.00, + 2348.00 + ], + [ + 3045.00, + 2345.00 + ], + [ + 3045.00, + 2342.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3037.00, + 2288.00 + ], + [ + 3035.00, + 2285.00 + ], + [ + 3033.00, + 2282.00 + ], + [ + 3031.00, + 2270.00 + ], + [ + 3031.00, + 2268.00 + ], + [ + 3031.00, + 2266.00 + ], + [ + 3028.00, + 2252.00 + ], + [ + 3028.00, + 2249.00 + ], + [ + 3028.00, + 2246.00 + ], + [ + 3024.00, + 2231.00 + ], + [ + 3024.00, + 2228.00 + ], + [ + 3024.00, + 2225.00 + ], + [ + 3028.00, + 2215.00 + ], + [ + 3029.00, + 2211.00 + ], + [ + 3030.00, + 2207.00 + ], + [ + 3032.00, + 2193.00 + ], + [ + 3033.00, + 2190.00 + ], + [ + 3034.00, + 2187.00 + ], + [ + 3039.00, + 2177.00 + ], + [ + 3039.00, + 2176.00 + ], + [ + 3039.00, + 2175.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3046.00, + 2150.00 + ], + [ + 3046.00, + 2149.00 + ], + [ + 3046.00, + 2148.00 + ], + [ + 3051.00, + 2131.00 + ], + [ + 3052.00, + 2130.00 + ], + [ + 3053.00, + 2129.00 + ], + [ + 3054.00, + 2114.00 + ], + [ + 3054.00, + 2113.00 + ], + [ + 3054.00, + 2112.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3006.00, + 2071.00 + ], + [ + 3005.00, + 2070.00 + ], + [ + 3004.00, + 2069.00 + ], + [ + 3003.00, + 2055.00 + ], + [ + 3003.00, + 2051.00 + ], + [ + 3003.00, + 2047.00 + ], + [ + 3009.00, + 2039.00 + ], + [ + 3010.00, + 2038.00 + ], + [ + 3011.00, + 2037.00 + ], + [ + 3020.00, + 2021.00 + ], + [ + 3021.00, + 2020.00 + ], + [ + 3022.00, + 2019.00 + ], + [ + 3031.00, + 2002.00 + ], + [ + 3031.00, + 2000.00 + ], + [ + 3031.00, + 1998.00 + ], + [ + 3027.00, + 1985.00 + ], + [ + 3027.00, + 1984.00 + ], + [ + 3027.00, + 1983.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2960.00, + 1983.00 + ], + [ + 2954.00, + 1979.00 + ], + [ + 2948.00, + 1975.00 + ], + [ + 2946.00, + 1970.00 + ], + [ + 2945.00, + 1968.00 + ], + [ + 2944.00, + 1966.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2941.00, + 1935.00 + ], + [ + 2941.00, + 1933.00 + ], + [ + 2941.00, + 1931.00 + ], + [ + 2948.00, + 1923.00 + ], + [ + 2949.00, + 1921.00 + ], + [ + 2950.00, + 1919.00 + ], + [ + 2955.00, + 1910.00 + ], + [ + 2955.00, + 1909.00 + ], + [ + 2955.00, + 1908.00 + ], + [ + 2956.00, + 1901.00 + ], + [ + 2956.00, + 1900.00 + ], + [ + 2956.00, + 1899.00 + ], + [ + 2947.00, + 1893.00 + ], + [ + 2943.00, + 1889.00 + ], + [ + 2939.00, + 1885.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2913.00, + 1880.00 + ], + [ + 2910.00, + 1879.00 + ], + [ + 2907.00, + 1878.00 + ], + [ + 2901.00, + 1874.00 + ], + [ + 2900.00, + 1873.00 + ], + [ + 2899.00, + 1872.00 + ], + [ + 2886.00, + 1861.00 + ], + [ + 2881.00, + 1857.00 + ], + [ + 2876.00, + 1853.00 + ], + [ + 2868.00, + 1848.00 + ], + [ + 2866.00, + 1846.00 + ], + [ + 2864.00, + 1844.00 + ], + [ + 2851.00, + 1836.00 + ], + [ + 2850.00, + 1836.00 + ], + [ + 2849.00, + 1836.00 + ], + [ + 2838.00, + 1828.00 + ], + [ + 2837.00, + 1827.00 + ], + [ + 2836.00, + 1826.00 + ], + [ + 2821.00, + 1820.00 + ], + [ + 2818.00, + 1819.00 + ], + [ + 2815.00, + 1818.00 + ], + [ + 2803.00, + 1811.00 + ], + [ + 2801.00, + 1810.00 + ], + [ + 2799.00, + 1809.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2791.00, + 1787.00 + ], + [ + 2791.00, + 1785.00 + ], + [ + 2791.00, + 1783.00 + ], + [ + 2790.00, + 1772.00 + ], + [ + 2784.00, + 1766.00 + ], + [ + 2778.00, + 1760.00 + ], + [ + 2787.00, + 1746.00 + ], + [ + 2787.00, + 1745.00 + ], + [ + 2787.00, + 1744.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2744.00, + 1728.00 + ], + [ + 2744.00, + 1727.00 + ], + [ + 2744.00, + 1726.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2660.00, + 1693.00 + ], + [ + 2659.00, + 1693.00 + ], + [ + 2658.00, + 1693.00 + ], + [ + 2646.00, + 1685.00 + ], + [ + 2645.00, + 1684.00 + ], + [ + 2644.00, + 1683.00 + ], + [ + 2636.00, + 1679.00 + ], + [ + 2634.00, + 1677.00 + ], + [ + 2632.00, + 1675.00 + ], + [ + 2624.00, + 1667.00 + ], + [ + 2624.00, + 1666.00 + ], + [ + 2624.00, + 1665.00 + ], + [ + 2613.00, + 1653.00 + ], + [ + 2612.00, + 1652.00 + ], + [ + 2611.00, + 1651.00 + ], + [ + 2598.00, + 1647.00 + ], + [ + 2598.00, + 1646.00 + ], + [ + 2598.00, + 1645.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2538.00, + 1545.00 + ], + [ + 2537.00, + 1544.00 + ], + [ + 2536.00, + 1543.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2514.00, + 1534.00 + ], + [ + 2513.00, + 1534.00 + ], + [ + 2512.00, + 1534.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2477.00, + 1533.00 + ], + [ + 2473.00, + 1533.00 + ], + [ + 2469.00, + 1533.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2428.00, + 1540.00 + ], + [ + 2427.00, + 1540.00 + ], + [ + 2426.00, + 1540.00 + ], + [ + 2407.00, + 1537.00 + ], + [ + 2404.00, + 1535.00 + ], + [ + 2401.00, + 1533.00 + ], + [ + 2394.00, + 1529.00 + ], + [ + 2394.00, + 1526.00 + ], + [ + 2394.00, + 1523.00 + ], + [ + 2398.00, + 1509.00 + ], + [ + 2399.00, + 1507.00 + ], + [ + 2400.00, + 1505.00 + ], + [ + 2401.00, + 1496.00 + ], + [ + 2403.00, + 1488.00 + ], + [ + 2405.00, + 1480.00 + ], + [ + 2409.00, + 1474.00 + ], + [ + 2410.00, + 1471.00 + ], + [ + 2411.00, + 1468.00 + ], + [ + 2417.00, + 1457.00 + ], + [ + 2419.00, + 1453.00 + ], + [ + 2421.00, + 1449.00 + ], + [ + 2425.00, + 1439.00 + ], + [ + 2426.00, + 1438.00 + ], + [ + 2427.00, + 1437.00 + ], + [ + 2432.00, + 1423.00 + ], + [ + 2434.00, + 1419.00 + ], + [ + 2436.00, + 1415.00 + ], + [ + 2439.00, + 1408.00 + ], + [ + 2440.00, + 1406.00 + ], + [ + 2441.00, + 1404.00 + ], + [ + 2455.00, + 1402.00 + ], + [ + 2460.00, + 1401.00 + ], + [ + 2465.00, + 1400.00 + ], + [ + 2468.00, + 1400.00 + ], + [ + 2476.00, + 1402.00 + ], + [ + 2484.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2515.00, + 1404.00 + ], + [ + 2516.00, + 1403.00 + ], + [ + 2517.00, + 1402.00 + ], + [ + 2503.00, + 1398.00 + ], + [ + 2501.00, + 1398.00 + ], + [ + 2499.00, + 1398.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2457.00, + 1367.00 + ], + [ + 2463.00, + 1355.00 + ], + [ + 2466.00, + 1348.00 + ], + [ + 2467.00, + 1348.00 + ], + [ + 2470.00, + 1340.00 + ], + [ + 2473.00, + 1332.00 + ], + [ + 2471.00, + 1331.00 + ], + [ + 2491.00, + 1287.00 + ], + [ + 2493.00, + 1281.00 + ], + [ + 2490.00, + 1275.00 + ], + [ + 2492.00, + 1273.00 + ], + [ + 2494.00, + 1271.00 + ], + [ + 2505.00, + 1241.00 + ], + [ + 2507.00, + 1237.00 + ], + [ + 2509.00, + 1233.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2517.00, + 1210.00 + ], + [ + 2516.00, + 1206.00 + ], + [ + 2515.00, + 1202.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2500.00, + 1163.00 + ], + [ + 2501.00, + 1162.00 + ], + [ + 2506, + 1147 + ], + [ + 2514, + 1132 + ], + [ + 2492, + 1151 + ], + [ + 2467, + 1153 + ], + [ + 2467, + 1153 + ], + [ + 2467, + 1153 + ], + [ + 2443, + 1152 + ], + [ + 2442, + 1152 + ], + [ + 2441, + 1152 + ], + [ + 2414, + 1150 + ], + [ + 2414, + 1150 + ], + [ + 2414, + 1150 + ], + [ + 2400, + 1147.33 + ], + [ + 2399.33, + 1147.33 + ], + [ + 2398.67, + 1147.33 + ], + [ + 2387.33, + 1145.33 + ], + [ + 2387.33, + 1145.33 + ], + [ + 2387.33, + 1145.33 + ], + [ + 2375.33, + 1144 + ], + [ + 2375.33, + 1144 + ], + [ + 2375.33, + 1144 + ], + [ + 2364, + 1142 + ], + [ + 2364, + 1142 + ], + [ + 2364, + 1142 + ], + [ + 2354.67, + 1140 + ], + [ + 2354.67, + 1140 + ], + [ + 2354.67, + 1140 + ], + [ + 2346, + 1125.33 + ], + [ + 2346, + 1125.33 + ], + [ + 2346, + 1125.33 + ], + [ + 2339.33, + 1116 + ], + [ + 2339.33, + 1115.33 + ], + [ + 2339.33, + 1114.67 + ], + [ + 2332, + 1102 + ], + [ + 2332, + 1102 + ], + [ + 2332, + 1102 + ], + [ + 2328.67, + 1090.67 + ], + [ + 2328.67, + 1090.67 + ], + [ + 2328.67, + 1090.67 + ], + [ + 2328.67, + 1075.33 + ], + [ + 2328.67, + 1075.33 + ], + [ + 2328.67, + 1075.33 + ], + [ + 2329.33, + 1062 + ], + [ + 2329.33, + 1062 + ], + [ + 2329.33, + 1062 + ], + [ + 2329.33, + 1046 + ], + [ + 2329.33, + 1046 + ], + [ + 2329.33, + 1046 + ], + [ + 2319.33, + 1060.67 + ], + [ + 2319.33, + 1060.67 + ], + [ + 2319.33, + 1060.67 + ], + [ + 2314, + 1074 + ], + [ + 2314, + 1074 + ], + [ + 2314, + 1074 + ], + [ + 2308.67, + 1084 + ], + [ + 2308.67, + 1084 + ], + [ + 2308.67, + 1084 + ], + [ + 2303.33, + 1094 + ], + [ + 2303.33, + 1094 + ], + [ + 2303.33, + 1094 + ], + [ + 2294, + 1110.67 + ], + [ + 2294, + 1110.67 + ], + [ + 2294, + 1110.67 + ], + [ + 2286.67, + 1119.33 + ], + [ + 2286.67, + 1119.33 + ], + [ + 2286.67, + 1119.33 + ], + [ + 2280.67, + 1128.67 + ], + [ + 2280, + 1128.67 + ], + [ + 2279.33, + 1128.67 + ], + [ + 2262, + 1142 + ], + [ + 2262, + 1142 + ], + [ + 2262, + 1142 + ], + [ + 2238.67, + 1158.67 + ], + [ + 2238.67, + 1158.67 + ], + [ + 2238.67, + 1158.67 + ], + [ + 2215.33, + 1173.33 + ], + [ + 2215.33, + 1174 + ], + [ + 2215.33, + 1174.67 + ], + [ + 2193.33, + 1192 + ], + [ + 2193.33, + 1192.67 + ], + [ + 2193.33, + 1193.33 + ], + [ + 2160.67, + 1202 + ], + [ + 2160.67, + 1202.67 + ], + [ + 2160.67, + 1203.33 + ], + [ + 2137.33, + 1210.67 + ], + [ + 2137.33, + 1210.67 + ], + [ + 2137.33, + 1210.67 + ], + [ + 2105.33, + 1213.33 + ], + [ + 2104, + 1214 + ], + [ + 2102.67, + 1214.67 + ], + [ + 2074, + 1218 + ], + [ + 2073.33, + 1217.33 + ], + [ + 2072.67, + 1216.67 + ], + [ + 2048, + 1214.67 + ], + [ + 2048, + 1214.67 + ], + [ + 2048, + 1214.67 + ], + [ + 2023.33, + 1218 + ], + [ + 2022.67, + 1218 + ], + [ + 2022, + 1218 + ], + [ + 1992.67, + 1211.33 + ], + [ + 1991.33, + 1210.67 + ], + [ + 1990, + 1210 + ], + [ + 1981.33, + 1195.33 + ], + [ + 1981.33, + 1195.33 + ], + [ + 1981.33, + 1195.33 + ], + [ + 1975.33, + 1184.67 + ], + [ + 1975.33, + 1184.67 + ], + [ + 1975.33, + 1184.67 + ], + [ + 1971.33, + 1176 + ], + [ + 1971.33, + 1175.33 + ], + [ + 1971.33, + 1174.67 + ], + [ + 1966.67, + 1160.67 + ], + [ + 1966.67, + 1160 + ], + [ + 1966.67, + 1159.33 + ], + [ + 1961.33, + 1147.33 + ], + [ + 1961.33, + 1147.33 + ], + [ + 1961.33, + 1147.33 + ], + [ + 1953.33, + 1137.33 + ], + [ + 1953.33, + 1137.33 + ], + [ + 1953.33, + 1137.33 + ], + [ + 1938, + 1133.33 + ], + [ + 1937.33, + 1133.33 + ], + [ + 1936.67, + 1133.33 + ], + [ + 1916, + 1132 + ], + [ + 1915.33, + 1132 + ], + [ + 1914.67, + 1132 + ], + [ + 1885.33, + 1134 + ], + [ + 1885.33, + 1134 + ], + [ + 1885.33, + 1134 + ], + [ + 1868, + 1134 + ], + [ + 1868, + 1134 + ], + [ + 1868, + 1134 + ], + [ + 1847.33, + 1131.33 + ], + [ + 1847.33, + 1131.33 + ], + [ + 1847.33, + 1131.33 + ], + [ + 1838, + 1130 + ], + [ + 1838, + 1130 + ], + [ + 1838, + 1130 + ], + [ + 1830.67, + 1129.33 + ], + [ + 1828.67, + 1129.33 + ], + [ + 1826.67, + 1129.33 + ], + [ + 1814, + 1131.33 + ], + [ + 1814, + 1131.33 + ], + [ + 1814, + 1131.33 + ], + [ + 1806, + 1139.33 + ], + [ + 1806, + 1139.33 + ], + [ + 1806, + 1139.33 + ], + [ + 1800.67, + 1144.67 + ], + [ + 1800.67, + 1145.33 + ], + [ + 1800.67, + 1146 + ], + [ + 1794.67, + 1153.33 + ], + [ + 1794.67, + 1154 + ], + [ + 1794.67, + 1154.67 + ], + [ + 1790.67, + 1162 + ], + [ + 1790.67, + 1162 + ] + ] + } +] \ No newline at end of file diff --git a/sut/frontend/build/middle-earth-map/fonts/RingbearerMedium.ttf b/sut/frontend/build/middle-earth-map/fonts/RingbearerMedium.ttf new file mode 100644 index 0000000..5fb3a09 Binary files /dev/null and b/sut/frontend/build/middle-earth-map/fonts/RingbearerMedium.ttf differ diff --git a/sut/frontend/build/middle-earth-map/icons/castle.svg b/sut/frontend/build/middle-earth-map/icons/castle.svg new file mode 100644 index 0000000..6845cd8 --- /dev/null +++ b/sut/frontend/build/middle-earth-map/icons/castle.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sut/frontend/build/middle-earth-map/icons/close.svg b/sut/frontend/build/middle-earth-map/icons/close.svg new file mode 100644 index 0000000..b0fe363 --- /dev/null +++ b/sut/frontend/build/middle-earth-map/icons/close.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/sut/frontend/build/middle-earth-map/icons/coffee.svg b/sut/frontend/build/middle-earth-map/icons/coffee.svg new file mode 100644 index 0000000..a7a19c1 --- /dev/null +++ b/sut/frontend/build/middle-earth-map/icons/coffee.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/sut/frontend/build/middle-earth-map/icons/coffin.svg b/sut/frontend/build/middle-earth-map/icons/coffin.svg new file mode 100644 index 0000000..b4cdf8c --- /dev/null +++ b/sut/frontend/build/middle-earth-map/icons/coffin.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sut/frontend/build/middle-earth-map/icons/death.svg b/sut/frontend/build/middle-earth-map/icons/death.svg new file mode 100644 index 0000000..1dcbd58 --- /dev/null +++ b/sut/frontend/build/middle-earth-map/icons/death.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sut/frontend/build/middle-earth-map/icons/dwarf.svg b/sut/frontend/build/middle-earth-map/icons/dwarf.svg new file mode 100644 index 0000000..a501174 --- /dev/null +++ b/sut/frontend/build/middle-earth-map/icons/dwarf.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sut/frontend/build/middle-earth-map/icons/earth.svg b/sut/frontend/build/middle-earth-map/icons/earth.svg new file mode 100644 index 0000000..a498cd9 --- /dev/null +++ b/sut/frontend/build/middle-earth-map/icons/earth.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/sut/frontend/build/middle-earth-map/icons/elf.svg b/sut/frontend/build/middle-earth-map/icons/elf.svg new file mode 100644 index 0000000..0181162 --- /dev/null +++ b/sut/frontend/build/middle-earth-map/icons/elf.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sut/frontend/build/middle-earth-map/icons/evil.svg b/sut/frontend/build/middle-earth-map/icons/evil.svg new file mode 100644 index 0000000..fbeeadf --- /dev/null +++ b/sut/frontend/build/middle-earth-map/icons/evil.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sut/frontend/build/middle-earth-map/icons/eye.svg b/sut/frontend/build/middle-earth-map/icons/eye.svg new file mode 100644 index 0000000..397a774 --- /dev/null +++ b/sut/frontend/build/middle-earth-map/icons/eye.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sut/frontend/build/middle-earth-map/icons/hobbit.svg b/sut/frontend/build/middle-earth-map/icons/hobbit.svg new file mode 100644 index 0000000..a763e1c --- /dev/null +++ b/sut/frontend/build/middle-earth-map/icons/hobbit.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sut/frontend/build/middle-earth-map/icons/layers.svg b/sut/frontend/build/middle-earth-map/icons/layers.svg new file mode 100644 index 0000000..5b82a84 --- /dev/null +++ b/sut/frontend/build/middle-earth-map/icons/layers.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sut/frontend/build/middle-earth-map/icons/swords.svg b/sut/frontend/build/middle-earth-map/icons/swords.svg new file mode 100644 index 0000000..091c703 --- /dev/null +++ b/sut/frontend/build/middle-earth-map/icons/swords.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sut/frontend/build/middle-earth-map/icons/the_one_ring.ico b/sut/frontend/build/middle-earth-map/icons/the_one_ring.ico new file mode 100644 index 0000000..bf6348b Binary files /dev/null and b/sut/frontend/build/middle-earth-map/icons/the_one_ring.ico differ diff --git a/sut/frontend/build/robots.txt b/sut/frontend/build/robots.txt new file mode 100644 index 0000000..5fa602e --- /dev/null +++ b/sut/frontend/build/robots.txt @@ -0,0 +1,33 @@ +# robots.txt for Fellowship's Quest List +# Guides search engine crawlers for optimal indexing + +# Allow all robots to crawl public content +User-agent: * +Allow: / +Allow: /login +Allow: /map +Allow: /api/health +Allow: /api/status + +# Disallow private/protected routes +Disallow: /dashboard +Disallow: /quests +Disallow: /inventory +Disallow: /api/ + +# Prevent crawling of temporary files and build artifacts +Disallow: /build/ +Disallow: /__pycache__/ +Disallow: /.git/ + +# Specify sitemap location for search engines +Sitemap: https://lotr.testingfantasy.com/sitemap.xml + +# Crawl delay to respect server resources +Crawl-delay: 1 + +# Request rate limiting (following guidelines) +Request-rate: 1 request per 10 seconds + +# Comment: Fellowship's Quest List - A LOTR-themed quest tracking application +# For more information, visit: https://lotr.testingfantasy.com/ diff --git a/sut/frontend/build/sitemap.xml b/sut/frontend/build/sitemap.xml new file mode 100644 index 0000000..c88dead --- /dev/null +++ b/sut/frontend/build/sitemap.xml @@ -0,0 +1,53 @@ + + + + + %VITE_APP_SITE_URL%/ + daily + 1.0 + + + + %VITE_APP_SITE_URL%/login + weekly + 0.9 + + + + %VITE_APP_SITE_URL%/dashboard + daily + 0.9 + + + + %VITE_APP_SITE_URL%/quests + daily + 0.8 + + + + %VITE_APP_SITE_URL%/map + daily + 0.8 + + + + %VITE_APP_SITE_URL%/inventory + daily + 0.7 + + + + + %VITE_APP_SITE_URL%/api/health + hourly + 0.5 + + + + %VITE_APP_SITE_URL%/api/status + hourly + 0.5 + + diff --git a/sut/frontend/package-lock.json b/sut/frontend/package-lock.json new file mode 100644 index 0000000..2bd938e --- /dev/null +++ b/sut/frontend/package-lock.json @@ -0,0 +1,21898 @@ +{ + "name": "fellowship-quest-tracker-frontend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "fellowship-quest-tracker-frontend", + "version": "1.0.0", + "dependencies": { + "axios": "^1.6.2", + "framer-motion": "^10.16.16", + "leaflet": "^1.9.4", + "leaflet.markercluster": "^1.5.3", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-hook-form": "^7.50.0", + "react-joyride": "^2.9.3", + "react-leaflet": "^4.2.1", + "react-router-dom": "^6.20.0", + "typescript": "^4.9.5", + "zustand": "^4.4.0" + }, + "devDependencies": { + "@testing-library/jest-dom": "^6.1.5", + "@testing-library/react": "^14.1.2", + "@testing-library/user-event": "^14.5.1", + "@types/leaflet": "^1.9.21", + "@types/leaflet.markercluster": "^1.5.6", + "@types/node": "^20.10.4", + "@types/react": "^18.2.42", + "@types/react-dom": "^18.2.17", + "@types/react-joyride": "^2.0.2", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.16", + "postcss": "^8.4.32", + "react-scripts": "5.0.1", + "tailwindcss": "^3.4.0", + "typescript": "^4.9.5", + "vitest": "^1.0.4" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@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/eslint-parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.6.tgz", + "integrity": "sha512-QGmsKi2PBO/MHSQk+AAgA9R6OHQr+VqnniFE0eMWZcVcfBZoA2dKn2hUsl3Csg/Plt9opRUWdY7//VXsrIlEiA==", + "dev": true, + "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==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@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-create-class-features-plugin": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "dev": true, + "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.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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==", + "dev": true, + "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-define-polyfill-provider": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz", + "integrity": "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "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==", + "dev": true, + "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.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "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.", + "dev": true, + "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.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz", + "integrity": "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-decorators": "^7.28.6" + }, + "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.", + "dev": true, + "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.", + "dev": true, + "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.", + "dev": true, + "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.", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz", + "integrity": "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.28.6.tgz", + "integrity": "sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@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==", + "dev": true, + "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.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" + }, + "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==", + "dev": true, + "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.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "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==", + "dev": true, + "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.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "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==", + "dev": true, + "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.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "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==", + "dev": true, + "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.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", + "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" + }, + "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==", + "dev": true, + "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.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "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==", + "dev": true, + "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.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" + }, + "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==", + "dev": true, + "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.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@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==", + "dev": true, + "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.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", + "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-jsx": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "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==", + "dev": true, + "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-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "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-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "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-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==", + "dev": true, + "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.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "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==", + "dev": true, + "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.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz", + "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "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/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==", + "dev": true, + "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-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==", + "dev": true, + "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.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" + }, + "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==", + "dev": true, + "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.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "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==", + "dev": true, + "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.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.0.tgz", + "integrity": "sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@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.6", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.29.0", + "@babel/plugin-transform-async-to-generator": "^7.28.6", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.28.6", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", + "@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.28.6", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", + "@babel/plugin-transform-modules-systemjs": "^7.29.0", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.29.0", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", + "@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.28.6", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "license": "MIT", + "optional": true + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@gilbarbara/deep-equal": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@gilbarbara/deep-equal/-/deep-equal-0.3.1.tgz", + "integrity": "sha512-I7xWjLs2YSVMc5gGx1Z3ZG1lgFpITPndpi8Ku55GeEIKpACCPQNS/OTqQbxgTCfq0Ncvcc+CrFov96itVh6Qvw==", + "license": "MIT" + }, + "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", + "dev": true, + "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==", + "dev": true, + "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", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/@react-leaflet/core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-2.1.0.tgz", + "integrity": "sha512-Qk7Pfu8BSarKGqILj4x7bCSZ1pjuAPZ+qmRwH5S7mDS91VSbVVsJSrW4qA+GPrro8t69gFYVMWb1Zc4yFmPiVg==", + "license": "Hippocratic-2.1", + "peerDependencies": { + "leaflet": "^1.9.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", + "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.16.1.tgz", + "integrity": "sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/@surma/rollup-plugin-off-main-thread/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "14.3.1", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.3.1.tgz", + "integrity": "sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^9.0.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@testing-library/react/node_modules/@testing-library/dom": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", + "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@testing-library/react/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", + "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", + "dev": true, + "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.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/leaflet": { + "version": "1.9.21", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.21.tgz", + "integrity": "sha512-TbAd9DaPGSnzp6QvtYngntMZgcRk+igFELwR2N99XZn7RXUdKgsXMR+28bUO0rPsWp8MIu/f47luLIQuSLYv/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/leaflet.markercluster": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@types/leaflet.markercluster/-/leaflet.markercluster-1.5.6.tgz", + "integrity": "sha512-I7hZjO2+isVXGYWzKxBp8PsCzAYCJBc29qBdFpquOCkS7zFDqUsUvkEOyQHedsk/Cy5tocQzf+Ndorm5W9YKTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/leaflet": "^1.9" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.35", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.35.tgz", + "integrity": "sha512-Uarfe6J91b9HAUXxjvSOdiO2UPOKLm07Q1oh0JHxoZ1y8HoqxDAu3gVrsrOHeiio0kSsoVBt4wFrKOm0dKxVPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/react-joyride": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/react-joyride/-/react-joyride-2.0.2.tgz", + "integrity": "sha512-RbixI8KE4K4B4bVzigT765oiQMCbWqlb9vj5qz1pFvkOvynkiAGurGVVf+nGszGGa89WrQhUnAwd0t1tqxeoDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/eslint-plugin/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz", + "integrity": "sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "1.6.1", + "@vitest/utils": "1.6.1", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz", + "integrity": "sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.6.1", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz", + "integrity": "sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@vitest/snapshot/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/spy": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz", + "integrity": "sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz", + "integrity": "sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils/node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@vitest/utils/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@vitest/utils/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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "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==", + "dev": true, + "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.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.27", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", + "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", + "dev": true, + "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.30001774", + "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==", + "dev": true, + "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.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", + "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", + "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@babel/core": "^7.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz", + "integrity": "sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.6", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.0.tgz", + "integrity": "sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.6", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz", + "integrity": "sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.6" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "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/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==", + "dev": true, + "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==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.30001775", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001775.tgz", + "integrity": "sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai/node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "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==", + "dev": true, + "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/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "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==", + "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/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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-js": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.48.0.tgz", + "integrity": "sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", + "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.48.0.tgz", + "integrity": "sha512-1slJgk89tWC51HQ1AEqG+s2VuwpTRr8ocu4n20QUcH1v9lAN0RXen0Q0AABa/DK1I7RrNWLucplOHMx8hfTGTw==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "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/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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-loader/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssdb": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-diff": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-1.0.2.tgz", + "integrity": "sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.302", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", + "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", + "integrity": "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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-jsx-a11y/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==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.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/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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "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==", + "dev": true, + "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==", + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/framer-motion": { + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.18.0.tgz", + "integrity": "sha512-oGlDh1Q1XqYPksuTD/usb0I70hq95OUzmL9+6Zd+Hs4XV0oaISBa/UUMSjYiq6m8EUF32132mOJ8xVZS+I0S6w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "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/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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.6", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.6.tgz", + "integrity": "sha512-bLjW01UTrvoWTJQL5LsMRo1SypHW80FTm12OJRSnr3v6YHNhfe+1r0MYUZJMACxnCHURVnBWRwAsWs2yPU9Ezw==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "devOptional": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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.", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "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-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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-lite": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-lite/-/is-lite-1.2.1.tgz", + "integrity": "sha512-pgF+L5bxC+10hLBgf6R2P4ZZUBOQIIacbdo8YvuCP8/JvsWxG7aZ9p10DYuLtifFci4l3VITphhMlMV4Y+urPw==", + "license": "MIT" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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-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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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-snapshot/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/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==", + "dev": true, + "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-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==", + "dev": true, + "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==", + "dev": true, + "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/@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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpath": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.2.1.tgz", + "integrity": "sha512-Jl6Jhk0jG+kP3yk59SSeGq7LFPR4JQz1DU0K+kXTysUhMostbhU3qh5mjTuf0PqFcXpAT7kvmMt9WxV10NyIgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esprima": "1.2.5", + "static-eval": "2.1.1", + "underscore": "1.13.6" + } + }, + "node_modules/jsonpath/node_modules/esprima": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", + "integrity": "sha512-S9VbPDU0adFErpDai3qDkjq8+G05ONtKzcyNrPKg/ZKa+tf879nX2KexNU95b31UoTJjRLInNBHHHjFPoCd7lQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/launch-editor": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.13.1.tgz", + "integrity": "sha512-lPSddlAAluRKJ7/cjRFoXUFzaX7q/YKI7yPHuEvSJVqoXvFnJov1/Ud87Aa4zULIbA9Nja4mSPK8l0z/7eV2wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "node_modules/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "license": "BSD-2-Clause" + }, + "node_modules/leaflet.markercluster": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/leaflet.markercluster/-/leaflet.markercluster-1.5.3.tgz", + "integrity": "sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==", + "license": "MIT", + "peerDependencies": { + "leaflet": "^1.3.1" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/local-pkg": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", + "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.3", + "pkg-types": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.0.tgz", + "integrity": "sha512-540P2c5dYnJlyJxTaSloliZexv8rji6rY8FhQN+WF/82iHQfA23j/xtJx97L+mXOML27EqksSek/g4eK7jaL3g==", + "dev": true, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mlly/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "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/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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "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/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "ISC" + }, + "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/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/pkg-types/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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-loader/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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)", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-floater": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/react-floater/-/react-floater-0.7.9.tgz", + "integrity": "sha512-NXqyp9o8FAXOATOEo0ZpyaQ2KPb4cmPMXGWkx377QtJkIXHlHRAGer7ai0r0C1kG5gf+KJ6Gy+gdNIiosvSicg==", + "license": "MIT", + "dependencies": { + "deepmerge": "^4.3.1", + "is-lite": "^0.8.2", + "popper.js": "^1.16.0", + "prop-types": "^15.8.1", + "tree-changes": "^0.9.1" + }, + "peerDependencies": { + "react": "15 - 18", + "react-dom": "15 - 18" + } + }, + "node_modules/react-floater/node_modules/@gilbarbara/deep-equal": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@gilbarbara/deep-equal/-/deep-equal-0.1.2.tgz", + "integrity": "sha512-jk+qzItoEb0D0xSSmrKDDzf9sheQj/BAPxlgNxgmOaA3mxpUa6ndJLYGZKsJnIVEQSD8zcTbyILz7I0HcnBCRA==", + "license": "MIT" + }, + "node_modules/react-floater/node_modules/is-lite": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/is-lite/-/is-lite-0.8.2.tgz", + "integrity": "sha512-JZfH47qTsslwaAsqbMI3Q6HNNjUuq6Cmzzww50TdP5Esb6e1y2sK2UAaZZuzfAzpoI2AkxoPQapZdlDuP6Vlsw==", + "license": "MIT" + }, + "node_modules/react-floater/node_modules/tree-changes": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/tree-changes/-/tree-changes-0.9.3.tgz", + "integrity": "sha512-vvvS+O6kEeGRzMglTKbc19ltLWNtmNt1cpBoSYLj/iEcPVvpJasemKOlxBrmZaCtDJoF+4bwv3m01UKYi8mukQ==", + "license": "MIT", + "dependencies": { + "@gilbarbara/deep-equal": "^0.1.1", + "is-lite": "^0.8.2" + } + }, + "node_modules/react-hook-form": { + "version": "7.71.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.71.2.tgz", + "integrity": "sha512-1CHvcDYzuRUNOflt4MOq3ZM46AronNJtQ1S7tnX6YN4y72qhgiUItpacZUAQ0TyWYci3yz1X+rXaSxiuEm86PA==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-innertext": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/react-innertext/-/react-innertext-1.1.5.tgz", + "integrity": "sha512-PWAqdqhxhHIv80dT9znP2KvS+hfkbRovFp4zFYHFFlOoQLRiawIic81gKb3U1wEyJZgMwgs3JoLtwryASRWP3Q==", + "license": "MIT", + "peerDependencies": { + "@types/react": ">=0.0.0 <=99", + "react": ">=0.0.0 <=99" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-joyride": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/react-joyride/-/react-joyride-2.9.3.tgz", + "integrity": "sha512-1+Mg34XK5zaqJ63eeBhqdbk7dlGCFp36FXwsEvgpjqrtyywX2C6h9vr3jgxP0bGHCw8Ilsp/nRDzNVq6HJ3rNw==", + "license": "MIT", + "dependencies": { + "@gilbarbara/deep-equal": "^0.3.1", + "deep-diff": "^1.0.2", + "deepmerge": "^4.3.1", + "is-lite": "^1.2.1", + "react-floater": "^0.7.9", + "react-innertext": "^1.1.5", + "react-is": "^16.13.1", + "scroll": "^3.0.1", + "scrollparent": "^2.1.0", + "tree-changes": "^0.11.2", + "type-fest": "^4.27.0" + }, + "peerDependencies": { + "react": "15 - 18", + "react-dom": "15 - 18" + } + }, + "node_modules/react-joyride/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-joyride/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-leaflet": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-4.2.1.tgz", + "integrity": "sha512-p9chkvhcKrWn/H/1FFeVSqLdReGwn2qmiobOQGO3BifX+/vV/39qhY8dGqbdcPh1e6jxh/QHriLXr7a4eLFK4Q==", + "license": "Hippocratic-2.1", + "dependencies": { + "@react-leaflet/core": "^2.1.0" + }, + "peerDependencies": { + "leaflet": "^1.9.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz", + "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", + "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2", + "react-router": "6.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "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==", + "dev": true, + "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-scripts/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-scripts/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "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==", + "dev": true, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "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==", + "dev": true, + "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.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/scroll": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scroll/-/scroll-3.0.1.tgz", + "integrity": "sha512-pz7y517OVls1maEzlirKO5nPYle9AXsFzTMNJrRGmT951mzpIBy7sNHOg5o/0MQd/NqliCiWnAi0kZneMPFLcg==", + "license": "MIT" + }, + "node_modules/scrollparent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scrollparent/-/scrollparent-2.1.0.tgz", + "integrity": "sha512-bnnvJL28/Rtz/kz2+4wpBjHzWoEzXhVg/TE8BeVGJHUqE8THNIRnDxDWMktwM+qahvlRdvlLdsQfYe+cuqfZeA==", + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", + "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.8.0", + "mime-types": "~2.1.35", + "parseurl": "~1.3.3" + }, + "engines": { + "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true, + "license": "MIT" + }, + "node_modules/static-eval": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz", + "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "escodegen": "^2.1.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", + "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.46.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", + "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinypool": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", + "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "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==", + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tree-changes": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/tree-changes/-/tree-changes-0.11.3.tgz", + "integrity": "sha512-r14mvDZ6tqz8PRQmlFKjhUVngu4VZ9d92ON3tp0EGpFBE6PAHOq8Bx8m8ahbNoGE3uI/npjYcJiqVydyOiYXag==", + "license": "MIT", + "dependencies": { + "@gilbarbara/deep-equal": "^0.3.1", + "is-lite": "^1.2.1" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz", + "integrity": "sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-node/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vite-node/node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitest": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz", + "integrity": "sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "1.6.1", + "@vitest/runner": "1.6.1", + "@vitest/snapshot": "1.6.1", + "@vitest/spy": "1.6.1", + "@vitest/utils": "1.6.1", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.3", + "vite": "^5.0.0", + "vite-node": "1.6.1", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.6.1", + "@vitest/ui": "1.6.1", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/vitest/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitest/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/vitest/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/vitest/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/vitest/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "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.", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "5.105.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.3.tgz", + "integrity": "sha512-LLBBA4oLmT7sZdHiYE/PeVuifOxYyE2uL/V+9VQP7YSYdJU7bSf7H8bZRRxW8kEPMkmVjnrXmoR3oejIdX0xbg==", + "dev": true, + "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.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.19.0", + "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.5.1", + "webpack-sources": "^3.3.4" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.4", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", + "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "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/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/@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==", + "dev": true, + "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/workbox-build/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==", + "dev": true, + "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/workbox-build/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/workbox-build/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==", + "dev": true, + "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/workbox-build/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "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/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/workbox-build/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/workbox-build/node_modules/rollup": { + "version": "2.80.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.80.0.tgz", + "integrity": "sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==", + "dev": true, + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/workbox-build/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", + "dev": true, + "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/workbox-build/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==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "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", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zustand": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", + "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + } + } +} diff --git a/sut/frontend/package.json b/sut/frontend/package.json new file mode 100644 index 0000000..12e69ce --- /dev/null +++ b/sut/frontend/package.json @@ -0,0 +1,65 @@ +{ + "name": "fellowship-quest-tracker-frontend", + "version": "1.0.0", + "private": true, + "dependencies": { + "axios": "^1.6.2", + "framer-motion": "^10.16.16", + "leaflet": "^1.9.4", + "leaflet.markercluster": "^1.5.3", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-hook-form": "^7.50.0", + "react-joyride": "^2.9.3", + "react-leaflet": "^4.2.1", + "react-router-dom": "^6.20.0", + "typescript": "^4.9.5", + "zustand": "^4.4.0" + }, + "devDependencies": { + "@testing-library/jest-dom": "^6.1.5", + "@testing-library/react": "^14.1.2", + "@testing-library/user-event": "^14.5.1", + "@types/leaflet": "^1.9.21", + "@types/leaflet.markercluster": "^1.5.6", + "@types/node": "^20.10.4", + "@types/react": "^18.2.42", + "@types/react-dom": "^18.2.17", + "@types/react-joyride": "^2.0.2", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.16", + "postcss": "^8.4.32", + "react-scripts": "5.0.1", + "tailwindcss": "^3.4.0", + "typescript": "^4.9.5", + "vitest": "^1.0.4" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "clean": "rm -rf build node_modules/.cache", + "build:fresh": "npm run clean && react-scripts build", + "start:fresh": "npm run clean && react-scripts start", + "test": "vitest", + "test:watch": "vitest --watch", + "test:coverage": "vitest --coverage", + "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/sut/frontend/postcss.config.js b/sut/frontend/postcss.config.js new file mode 100644 index 0000000..12a703d --- /dev/null +++ b/sut/frontend/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/sut/frontend/public/index.html b/sut/frontend/public/index.html new file mode 100644 index 0000000..349b478 --- /dev/null +++ b/sut/frontend/public/index.html @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Fellowship Quest Tracker - Track Your Middle-earth Adventure + + + + + + +
+ + diff --git a/sut/frontend/public/leaflet/leaflet.css b/sut/frontend/public/leaflet/leaflet.css new file mode 100644 index 0000000..6593ca5 --- /dev/null +++ b/sut/frontend/public/leaflet/leaflet.css @@ -0,0 +1,767 @@ +/* required styles */ + +.leaflet-pane, +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-tile-container, +.leaflet-pane > svg, +.leaflet-pane > canvas, +.leaflet-zoom-box, +.leaflet-image-layer, +.leaflet-layer { + position: absolute; + left: 0; + top: 0; +} + +.leaflet-container { + overflow: hidden; +} + +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + -webkit-user-drag: none; +} + +/* Prevents IE11 from highlighting tiles in blue */ +.leaflet-tile::selection { + background: transparent; +} + +/* Safari renders non-retina tile on retina better with this, but Chrome is worse */ +.leaflet-safari .leaflet-tile { + image-rendering: -webkit-optimize-contrast; +} + +/* hack that prevents hw layers "stretching" when loading new tiles */ +.leaflet-safari .leaflet-tile-container { + width: 1600px; + height: 1600px; + -webkit-transform-origin: 0 0; +} + +.leaflet-marker-icon, +.leaflet-marker-shadow { + display: block; +} + +/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */ +/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */ +.leaflet-container .leaflet-overlay-pane svg { + max-width: none !important; + max-height: none !important; +} + +.leaflet-container .leaflet-marker-pane img, +.leaflet-container .leaflet-shadow-pane img, +.leaflet-container .leaflet-tile-pane img, +.leaflet-container img.leaflet-image-layer, +.leaflet-container .leaflet-tile { + max-width: none !important; + max-height: none !important; + width: auto; + padding: 0; +} + +.leaflet-container.leaflet-touch-zoom { + -ms-touch-action: pan-x pan-y; + touch-action: pan-x pan-y; +} + +.leaflet-container.leaflet-touch-drag { + -ms-touch-action: pinch-zoom; + /* Fallback for FF which doesn't support pinch-zoom */ + touch-action: none; + touch-action: pinch-zoom; +} + +.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom { + -ms-touch-action: none; + touch-action: none; +} + +.leaflet-container { + -webkit-tap-highlight-color: transparent; +} + +.leaflet-container a { + -webkit-tap-highlight-color: rgba(51, 181, 229, 0.4); +} + +.leaflet-tile { + filter: inherit; + visibility: hidden; +} + +.leaflet-tile-loaded { + visibility: inherit; +} + +.leaflet-zoom-box { + width: 0; + height: 0; + -moz-box-sizing: border-box; + box-sizing: border-box; + z-index: 800; +} + +/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */ +.leaflet-overlay-pane svg { + -moz-user-select: none; +} + +.leaflet-pane { + z-index: 400; +} + +.leaflet-tile-pane { + z-index: 200; +} + +.leaflet-overlay-pane { + z-index: 400; +} + +.leaflet-shadow-pane { + z-index: 500; +} + +.leaflet-marker-pane { + z-index: 600; +} + +.leaflet-tooltip-pane { + z-index: 650; +} + +.leaflet-popup-pane { + z-index: 700; +} + +.leaflet-map-pane canvas { + z-index: 100; +} + +.leaflet-map-pane svg { + z-index: 200; +} + +.leaflet-vml-shape { + width: 1px; + height: 1px; +} + +.lvml { + behavior: url(#default#VML); + display: inline-block; + position: absolute; +} + + +/* control positioning */ + +.leaflet-control { + position: relative; + z-index: 800; + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; +} + +.leaflet-top, +.leaflet-bottom { + position: absolute; + z-index: 1000; + pointer-events: none; +} + +.leaflet-top { + top: 0; +} + +.leaflet-right { + right: 0; +} + +.leaflet-bottom { + bottom: 0; +} + +.leaflet-left { + left: 0; +} + +.leaflet-control { + float: left; + clear: both; +} + +.leaflet-right .leaflet-control { + float: right; +} + +.leaflet-top .leaflet-control { + margin-top: 10px; +} + +.leaflet-bottom .leaflet-control { + margin-bottom: 10px; +} + +.leaflet-left .leaflet-control { + margin-left: 10px; +} + +.leaflet-right .leaflet-control { + margin-right: 10px; +} + + +/* zoom and fade animations */ + +.leaflet-fade-anim .leaflet-popup { + opacity: 0; + -webkit-transition: opacity 0.2s linear; + -moz-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; +} + +.leaflet-fade-anim .leaflet-map-pane .leaflet-popup { + opacity: 1; +} + +.leaflet-zoom-animated { + -webkit-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; +} + +svg.leaflet-zoom-animated { + will-change: transform; +} + +.leaflet-zoom-anim .leaflet-zoom-animated { + -webkit-transition: -webkit-transform 0.25s cubic-bezier(0, 0, 0.25, 1); + -moz-transition: -moz-transform 0.25s cubic-bezier(0, 0, 0.25, 1); + transition: transform 0.25s cubic-bezier(0, 0, 0.25, 1); +} + +.leaflet-zoom-anim .leaflet-tile, +.leaflet-pan-anim .leaflet-tile { + -webkit-transition: none; + -moz-transition: none; + transition: none; +} + +.leaflet-zoom-anim .leaflet-zoom-hide { + visibility: hidden; +} + + +/* cursors */ + +.leaflet-interactive { + cursor: pointer; +} + +.leaflet-grab { + cursor: -webkit-grab; + cursor: -moz-grab; + cursor: grab; +} + +.leaflet-crosshair, +.leaflet-crosshair .leaflet-interactive { + cursor: crosshair; +} + +.leaflet-popup-pane, +.leaflet-control { + cursor: auto; +} + +.leaflet-dragging .leaflet-grab, +.leaflet-dragging .leaflet-grab .leaflet-interactive, +.leaflet-dragging .leaflet-marker-draggable { + cursor: move; + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + cursor: grabbing; +} + +/* marker & overlays interactivity */ +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-image-layer, +.leaflet-pane > svg path, +.leaflet-tile-container { + pointer-events: none; +} + +.leaflet-marker-icon.leaflet-interactive, +.leaflet-image-layer.leaflet-interactive, +.leaflet-pane > svg path.leaflet-interactive, +svg.leaflet-image-layer.leaflet-interactive path { + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; +} + +/* visual tweaks */ + +.leaflet-container { + background: #ddd; + outline-offset: 1px; +} + +.leaflet-container a { + color: #0078A8; +} + +.leaflet-zoom-box { + border: 2px dotted #38f; + background: rgba(255, 255, 255, 0.5); +} + + +/* general typography */ +.leaflet-container { + font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; + font-size: 12px; + font-size: 0.75rem; + line-height: 1.5; +} + + +/* general toolbar styles */ + +.leaflet-bar { + box-shadow: 0 1px 5px rgba(0, 0, 0, 0.65); + border-radius: 4px; +} + +.leaflet-bar a { + background-color: #fff; + border-bottom: 1px solid #ccc; + width: 26px; + height: 26px; + line-height: 26px; + display: block; + text-align: center; + text-decoration: none; + color: black; +} + +.leaflet-bar a, +.leaflet-control-layers-toggle { + background-position: 50% 50%; + background-repeat: no-repeat; + display: block; +} + +.leaflet-bar a:hover, +.leaflet-bar a:focus { + background-color: #f4f4f4; +} + +.leaflet-bar a:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +.leaflet-bar a:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom: none; +} + +.leaflet-bar a.leaflet-disabled { + cursor: default; + background-color: #f4f4f4; + color: #bbb; +} + +.leaflet-touch .leaflet-bar a { + width: 30px; + height: 30px; + line-height: 30px; +} + +.leaflet-touch .leaflet-bar a:first-child { + border-top-left-radius: 2px; + border-top-right-radius: 2px; +} + +.leaflet-touch .leaflet-bar a:last-child { + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; +} + +/* zoom control */ + +.leaflet-control-zoom-in, +.leaflet-control-zoom-out { + font: bold 18px 'Lucida Console', Monaco, monospace; + text-indent: 1px; +} + +.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out { + font-size: 22px; +} + + +/* layers control */ + +.leaflet-control-layers { + box-shadow: 0 1px 5px rgba(0, 0, 0, 0.4); + background: #fff; + border-radius: 5px; +} + +.leaflet-control-layers-toggle { + background-image: url(assets/images/layers.png); + width: 36px; + height: 36px; +} + +.leaflet-retina .leaflet-control-layers-toggle { + background-image: url(assets/images/layers-2x.png); + background-size: 26px 26px; +} + +.leaflet-touch .leaflet-control-layers-toggle { + width: 44px; + height: 44px; +} + +.leaflet-control-layers .leaflet-control-layers-list, +.leaflet-control-layers-expanded .leaflet-control-layers-toggle { + display: none; +} + +.leaflet-control-layers-expanded .leaflet-control-layers-list { + display: block; + position: relative; +} + +.leaflet-control-layers-expanded { + padding: 6px 10px 6px 6px; + color: #333; + background: #fff; +} + +.leaflet-control-layers-scrollbar { + overflow-y: scroll; + overflow-x: hidden; + padding-right: 5px; +} + +.leaflet-control-layers-selector { + margin-top: 2px; + position: relative; + top: 1px; +} + +.leaflet-control-layers label { + display: block; + font-size: 13px; + font-size: 1.08333em; +} + +.leaflet-control-layers-separator { + height: 0; + border-top: 1px solid #ddd; + margin: 5px -10px 5px -6px; +} + +/* Default icon URLs */ +.leaflet-default-icon-path { /* used only in path-guessing heuristic, see L.Icon.Default */ + background-image: url(assets/images/marker-icon.png); +} + + +/* attribution and scale controls */ + +.leaflet-container .leaflet-control-attribution { + background: #fff; + background: rgba(255, 255, 255, 0.8); + margin: 0; +} + +.leaflet-control-attribution, +.leaflet-control-scale-line { + padding: 0 5px; + color: #333; + line-height: 1.4; +} + +.leaflet-control-attribution a { + text-decoration: none; +} + +.leaflet-control-attribution a:hover, +.leaflet-control-attribution a:focus { + text-decoration: underline; +} + +.leaflet-attribution-flag { + display: inline !important; + vertical-align: baseline !important; + width: 1em; + height: 0.6669em; +} + +.leaflet-left .leaflet-control-scale { + margin-left: 5px; +} + +.leaflet-bottom .leaflet-control-scale { + margin-bottom: 5px; +} + +.leaflet-control-scale-line { + border: 2px solid #777; + border-top: none; + line-height: 1.1; + padding: 2px 5px 1px; + white-space: nowrap; + -moz-box-sizing: border-box; + box-sizing: border-box; + background: rgba(255, 255, 255, 0.8); + text-shadow: 1px 1px #fff; +} + +.leaflet-control-scale-line:not(:first-child) { + border-top: 2px solid #777; + border-bottom: none; + margin-top: -2px; +} + +.leaflet-control-scale-line:not(:first-child):not(:last-child) { + border-bottom: 2px solid #777; +} + +.leaflet-touch .leaflet-control-attribution, +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + box-shadow: none; +} + +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + border: 2px solid rgba(0, 0, 0, 0.2); + background-clip: padding-box; +} + + +/* popup */ + +.leaflet-popup { + position: absolute; + text-align: center; + margin-bottom: 20px; +} + +.leaflet-popup-content-wrapper { + padding: 1px; + text-align: left; + border-radius: 12px; +} + +.leaflet-popup-content { + margin: 13px 24px 13px 20px; + line-height: 1.3; + font-size: 13px; + font-size: 1.08333em; + min-height: 1px; +} + +.leaflet-popup-content p { + margin: 17px 0; + margin: 1.3em 0; +} + +.leaflet-popup-tip-container { + width: 40px; + height: 20px; + position: absolute; + left: 50%; + margin-top: -1px; + margin-left: -20px; + overflow: hidden; + pointer-events: none; +} + +.leaflet-popup-tip { + width: 17px; + height: 17px; + padding: 1px; + + margin: -10px auto 0; + pointer-events: auto; + + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); +} + +.leaflet-popup-content-wrapper, +.leaflet-popup-tip { + background: white; + color: #333; + box-shadow: 0 3px 14px rgba(0, 0, 0, 0.4); +} + +.leaflet-container a.leaflet-popup-close-button { + position: absolute; + top: 0; + right: 0; + border: none; + text-align: center; + width: 24px; + height: 24px; + font: 16px/24px Tahoma, Verdana, sans-serif; + color: #757575; + text-decoration: none; + background: transparent; +} + +.leaflet-container a.leaflet-popup-close-button:hover, +.leaflet-container a.leaflet-popup-close-button:focus { + color: #585858; +} + +.leaflet-popup-scrolled { + overflow: auto; +} + +.leaflet-oldie .leaflet-popup-content-wrapper { + -ms-zoom: 1; +} + +.leaflet-oldie .leaflet-popup-tip { + width: 24px; + margin: 0 auto; + + -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)"; + filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678); +} + +.leaflet-oldie .leaflet-control-zoom, +.leaflet-oldie .leaflet-control-layers, +.leaflet-oldie .leaflet-popup-content-wrapper, +.leaflet-oldie .leaflet-popup-tip { + border: 1px solid #999; +} + + +/* div icon */ + +.leaflet-div-icon { + background: #fff; + border: 1px solid #666; +} + + +/* Tooltip */ +/* Base styles for the element that has a tooltip */ +.leaflet-tooltip { + position: absolute; + padding: 6px; + background-color: #fff; + border: 1px solid #fff; + border-radius: 3px; + color: #222; + white-space: nowrap; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + pointer-events: none; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); +} + +.leaflet-tooltip.leaflet-interactive { + cursor: pointer; + pointer-events: auto; +} + +.leaflet-tooltip-top:before, +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + position: absolute; + pointer-events: none; + border: 6px solid transparent; + background: transparent; + content: ""; +} + +/* Directions */ + +.leaflet-tooltip-bottom { + margin-top: 6px; +} + +.leaflet-tooltip-top { + margin-top: -6px; +} + +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-top:before { + left: 50%; + margin-left: -6px; +} + +.leaflet-tooltip-top:before { + bottom: 0; + margin-bottom: -12px; + border-top-color: #fff; +} + +.leaflet-tooltip-bottom:before { + top: 0; + margin-top: -12px; + margin-left: -6px; + border-bottom-color: #fff; +} + +.leaflet-tooltip-left { + margin-left: -6px; +} + +.leaflet-tooltip-right { + margin-left: 6px; +} + +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + top: 50%; + margin-top: -6px; +} + +.leaflet-tooltip-left:before { + right: 0; + margin-right: -12px; + border-left-color: #fff; +} + +.leaflet-tooltip-right:before { + left: 0; + margin-left: -12px; + border-right-color: #fff; +} + +/* Printing */ + +@media print { + /* Prevent printers from removing background-images of controls. */ + .leaflet-control { + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + } +} diff --git a/sut/frontend/public/leaflet/leaflet.js b/sut/frontend/public/leaflet/leaflet.js new file mode 100644 index 0000000..047bfe7 --- /dev/null +++ b/sut/frontend/public/leaflet/leaflet.js @@ -0,0 +1,6 @@ +/* @preserve + * Leaflet 1.9.3, a JS library for interactive maps. https://leafletjs.com + * (c) 2010-2022 Vladimir Agafonkin, (c) 2010-2011 CloudMade + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).leaflet={})}(this,function(t){"use strict";function l(t){for(var e,i,n=1,o=arguments.length;n=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=_(t);var e=this.min,i=this.max,n=t.min,t=t.max,o=t.x>=e.x&&n.x<=i.x,t=t.y>=e.y&&n.y<=i.y;return o&&t},overlaps:function(t){t=_(t);var e=this.min,i=this.max,n=t.min,t=t.max,o=t.x>e.x&&n.xe.y&&n.y=n.lat&&i.lat<=o.lat&&e.lng>=n.lng&&i.lng<=o.lng},intersects:function(t){t=g(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),t=t.getNorthEast(),o=t.lat>=e.lat&&n.lat<=i.lat,t=t.lng>=e.lng&&n.lng<=i.lng;return o&&t},overlaps:function(t){t=g(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),t=t.getNorthEast(),o=t.lat>e.lat&&n.late.lng&&n.lng","http://www.w3.org/2000/svg"===(Ft.firstChild&&Ft.firstChild.namespaceURI));function y(t){return 0<=navigator.userAgent.toLowerCase().indexOf(t)}var b={ie:pt,ielt9:mt,edge:n,webkit:ft,android:gt,android23:vt,androidStock:yt,opera:xt,chrome:wt,gecko:bt,safari:Pt,phantom:Lt,opera12:o,win:Tt,ie3d:Mt,webkit3d:zt,gecko3d:_t,any3d:Ct,mobile:Zt,mobileWebkit:St,mobileWebkit3d:Et,msPointer:kt,pointer:Ot,touch:Bt,touchNative:At,mobileOpera:It,mobileGecko:Rt,retina:Nt,passiveEvents:Dt,canvas:jt,svg:Ht,vml:!Ht&&function(){try{var t=document.createElement("div"),e=(t.innerHTML='',t.firstChild);return e.style.behavior="url(#default#VML)",e&&"object"==typeof e.adj}catch(t){return!1}}(),inlineSvg:Ft,mac:0===navigator.platform.indexOf("Mac"),linux:0===navigator.platform.indexOf("Linux")},Wt=b.msPointer?"MSPointerDown":"pointerdown",Ut=b.msPointer?"MSPointerMove":"pointermove",Vt=b.msPointer?"MSPointerUp":"pointerup",qt=b.msPointer?"MSPointerCancel":"pointercancel",Gt={touchstart:Wt,touchmove:Ut,touchend:Vt,touchcancel:qt},Kt={touchstart:function(t,e){e.MSPOINTER_TYPE_TOUCH&&e.pointerType===e.MSPOINTER_TYPE_TOUCH&&O(e);ee(t,e)},touchmove:ee,touchend:ee,touchcancel:ee},Yt={},Xt=!1;function Jt(t,e,i){return"touchstart"!==e||Xt||(document.addEventListener(Wt,$t,!0),document.addEventListener(Ut,Qt,!0),document.addEventListener(Vt,te,!0),document.addEventListener(qt,te,!0),Xt=!0),Kt[e]?(i=Kt[e].bind(this,i),t.addEventListener(Gt[e],i,!1),i):(console.warn("wrong event specified:",e),u)}function $t(t){Yt[t.pointerId]=t}function Qt(t){Yt[t.pointerId]&&(Yt[t.pointerId]=t)}function te(t){delete Yt[t.pointerId]}function ee(t,e){if(e.pointerType!==(e.MSPOINTER_TYPE_MOUSE||"mouse")){for(var i in e.touches=[],Yt)e.touches.push(Yt[i]);e.changedTouches=[e],t(e)}}var ie=200;function ne(t,i){t.addEventListener("dblclick",i);var n,o=0;function e(t){var e;1!==t.detail?n=t.detail:"mouse"===t.pointerType||t.sourceCapabilities&&!t.sourceCapabilities.firesTouchEvents||((e=Ne(t)).some(function(t){return t instanceof HTMLLabelElement&&t.attributes.for})&&!e.some(function(t){return t instanceof HTMLInputElement||t instanceof HTMLSelectElement})||((e=Date.now())-o<=ie?2===++n&&i(function(t){var e,i,n={};for(i in t)e=t[i],n[i]=e&&e.bind?e.bind(t):e;return(t=n).type="dblclick",n.detail=2,n.isTrusted=!1,n._simulated=!0,n}(t)):n=1,o=e))}return t.addEventListener("click",e),{dblclick:i,simDblclick:e}}var oe,se,re,ae,he,le,ue=we(["transform","webkitTransform","OTransform","MozTransform","msTransform"]),ce=we(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),de="webkitTransition"===ce||"OTransition"===ce?ce+"End":"transitionend";function _e(t){return"string"==typeof t?document.getElementById(t):t}function pe(t,e){var i=t.style[e]||t.currentStyle&&t.currentStyle[e];return"auto"===(i=i&&"auto"!==i||!document.defaultView?i:(t=document.defaultView.getComputedStyle(t,null))?t[e]:null)?null:i}function P(t,e,i){t=document.createElement(t);return t.className=e||"",i&&i.appendChild(t),t}function T(t){var e=t.parentNode;e&&e.removeChild(t)}function me(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function fe(t){var e=t.parentNode;e&&e.lastChild!==t&&e.appendChild(t)}function ge(t){var e=t.parentNode;e&&e.firstChild!==t&&e.insertBefore(t,e.firstChild)}function ve(t,e){return void 0!==t.classList?t.classList.contains(e):0<(t=xe(t)).length&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(t)}function M(t,e){var i;if(void 0!==t.classList)for(var n=W(e),o=0,s=n.length;othis.options.maxZoom)?this.setZoom(t):this},panInsideBounds:function(t,e){this._enforcingBounds=!0;var i=this.getCenter(),t=this._limitCenter(i,this._zoom,g(t));return i.equals(t)||this.panTo(t,e),this._enforcingBounds=!1,this},panInside:function(t,e){var i=m((e=e||{}).paddingTopLeft||e.padding||[0,0]),n=m(e.paddingBottomRight||e.padding||[0,0]),o=this.project(this.getCenter()),t=this.project(t),s=this.getPixelBounds(),i=_([s.min.add(i),s.max.subtract(n)]),s=i.getSize();return i.contains(t)||(this._enforcingBounds=!0,n=t.subtract(i.getCenter()),i=i.extend(t).getSize().subtract(s),o.x+=n.x<0?-i.x:i.x,o.y+=n.y<0?-i.y:i.y,this.panTo(this.unproject(o),e),this._enforcingBounds=!1),this},invalidateSize:function(t){if(!this._loaded)return this;t=l({animate:!1,pan:!0},!0===t?{animate:!0}:t);var e=this.getSize(),i=(this._sizeChanged=!0,this._lastCenter=null,this.getSize()),n=e.divideBy(2).round(),o=i.divideBy(2).round(),n=n.subtract(o);return n.x||n.y?(t.animate&&t.pan?this.panBy(n):(t.pan&&this._rawPanBy(n),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(a(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:e,newSize:i})):this},stop:function(){return this.setZoom(this._limitZoom(this._zoom)),this.options.zoomSnap||this.fire("viewreset"),this._stop()},locate:function(t){var e,i;return t=this._locateOptions=l({timeout:1e4,watch:!1},t),"geolocation"in navigator?(e=a(this._handleGeolocationResponse,this),i=a(this._handleGeolocationError,this),t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t)):this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e;this._container._leaflet_id&&(e=t.code,t=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout"),this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+t+"."}))},_handleGeolocationResponse:function(t){if(this._container._leaflet_id){var e,i,n=new v(t.coords.latitude,t.coords.longitude),o=n.toBounds(2*t.coords.accuracy),s=this._locateOptions,r=(s.setView&&(e=this.getBoundsZoom(o),this.setView(n,s.maxZoom?Math.min(e,s.maxZoom):e)),{latlng:n,bounds:o,timestamp:t.timestamp});for(i in t.coords)"number"==typeof t.coords[i]&&(r[i]=t.coords[i]);this.fire("locationfound",r)}},addHandler:function(t,e){return e&&(e=this[t]=new e(this),this._handlers.push(e),this.options[t]&&e.enable()),this},remove:function(){if(this._initEvents(!0),this.options.maxBounds&&this.off("moveend",this._panInsideMaxBounds),this._containerId!==this._container._leaflet_id)throw new Error("Map container is being reused by another instance");try{delete this._container._leaflet_id,delete this._containerId}catch(t){this._container._leaflet_id=void 0,this._containerId=void 0}for(var t in void 0!==this._locationWatchId&&this.stopLocate(),this._stop(),T(this._mapPane),this._clearControlPos&&this._clearControlPos(),this._resizeRequest&&(r(this._resizeRequest),this._resizeRequest=null),this._clearHandlers(),this._loaded&&this.fire("unload"),this._layers)this._layers[t].remove();for(t in this._panes)T(this._panes[t]);return this._layers=[],this._panes=[],delete this._mapPane,delete this._renderer,this},createPane:function(t,e){e=P("div","leaflet-pane"+(t?" leaflet-"+t.replace("Pane","")+"-pane":""),e||this._mapPane);return t&&(this._panes[t]=e),e},getCenter:function(){return this._checkIfLoaded(),this._lastCenter&&!this._moved()?this._lastCenter.clone():this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds();return new s(this.unproject(t.getBottomLeft()),this.unproject(t.getTopRight()))},getMinZoom:function(){return void 0===this.options.minZoom?this._layersMinZoom||0:this.options.minZoom},getMaxZoom:function(){return void 0===this.options.maxZoom?void 0===this._layersMaxZoom?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,e,i){t=g(t),i=m(i||[0,0]);var n=this.getZoom()||0,o=this.getMinZoom(),s=this.getMaxZoom(),r=t.getNorthWest(),t=t.getSouthEast(),i=this.getSize().subtract(i),t=_(this.project(t,n),this.project(r,n)).getSize(),r=b.any3d?this.options.zoomSnap:1,a=i.x/t.x,i=i.y/t.y,t=e?Math.max(a,i):Math.min(a,i),n=this.getScaleZoom(t,n);return r&&(n=Math.round(n/(r/100))*(r/100),n=e?Math.ceil(n/r)*r:Math.floor(n/r)*r),Math.max(o,Math.min(s,n))},getSize:function(){return this._size&&!this._sizeChanged||(this._size=new p(this._container.clientWidth||0,this._container.clientHeight||0),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(t,e){t=this._getTopLeftPoint(t,e);return new f(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._pixelOrigin},getPixelWorldBounds:function(t){return this.options.crs.getProjectedBounds(void 0===t?this.getZoom():t)},getPane:function(t){return"string"==typeof t?this._panes[t]:t},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t,e){var i=this.options.crs;return e=void 0===e?this._zoom:e,i.scale(t)/i.scale(e)},getScaleZoom:function(t,e){var i=this.options.crs,t=(e=void 0===e?this._zoom:e,i.zoom(t*i.scale(e)));return isNaN(t)?1/0:t},project:function(t,e){return e=void 0===e?this._zoom:e,this.options.crs.latLngToPoint(w(t),e)},unproject:function(t,e){return e=void 0===e?this._zoom:e,this.options.crs.pointToLatLng(m(t),e)},layerPointToLatLng:function(t){t=m(t).add(this.getPixelOrigin());return this.unproject(t)},latLngToLayerPoint:function(t){return this.project(w(t))._round()._subtract(this.getPixelOrigin())},wrapLatLng:function(t){return this.options.crs.wrapLatLng(w(t))},wrapLatLngBounds:function(t){return this.options.crs.wrapLatLngBounds(g(t))},distance:function(t,e){return this.options.crs.distance(w(t),w(e))},containerPointToLayerPoint:function(t){return m(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return m(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){t=this.containerPointToLayerPoint(m(t));return this.layerPointToLatLng(t)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(w(t)))},mouseEventToContainerPoint:function(t){return De(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){t=this._container=_e(t);if(!t)throw new Error("Map container not found.");if(t._leaflet_id)throw new Error("Map container is already initialized.");S(t,"scroll",this._onScroll,this),this._containerId=h(t)},_initLayout:function(){var t=this._container,e=(this._fadeAnimated=this.options.fadeAnimation&&b.any3d,M(t,"leaflet-container"+(b.touch?" leaflet-touch":"")+(b.retina?" leaflet-retina":"")+(b.ielt9?" leaflet-oldie":"")+(b.safari?" leaflet-safari":"")+(this._fadeAnimated?" leaflet-fade-anim":"")),pe(t,"position"));"absolute"!==e&&"relative"!==e&&"fixed"!==e&&"sticky"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._paneRenderers={},this._mapPane=this.createPane("mapPane",this._container),Z(this._mapPane,new p(0,0)),this.createPane("tilePane"),this.createPane("overlayPane"),this.createPane("shadowPane"),this.createPane("markerPane"),this.createPane("tooltipPane"),this.createPane("popupPane"),this.options.markerZoomAnimation||(M(t.markerPane,"leaflet-zoom-hide"),M(t.shadowPane,"leaflet-zoom-hide"))},_resetView:function(t,e,i){Z(this._mapPane,new p(0,0));var n=!this._loaded,o=(this._loaded=!0,e=this._limitZoom(e),this.fire("viewprereset"),this._zoom!==e);this._moveStart(o,i)._move(t,e)._moveEnd(o),this.fire("viewreset"),n&&this.fire("load")},_moveStart:function(t,e){return t&&this.fire("zoomstart"),e||this.fire("movestart"),this},_move:function(t,e,i,n){void 0===e&&(e=this._zoom);var o=this._zoom!==e;return this._zoom=e,this._lastCenter=t,this._pixelOrigin=this._getNewPixelOrigin(t),n?i&&i.pinch&&this.fire("zoom",i):((o||i&&i.pinch)&&this.fire("zoom",i),this.fire("move",i)),this},_moveEnd:function(t){return t&&this.fire("zoomend"),this.fire("moveend")},_stop:function(){return r(this._flyToFrame),this._panAnim&&this._panAnim.stop(),this},_rawPanBy:function(t){Z(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){this._enforcingBounds||this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(t){this._targets={};var e=t?k:S;e((this._targets[h(this._container)]=this)._container,"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress keydown keyup",this._handleDOMEvent,this),this.options.trackResize&&e(window,"resize",this._onResize,this),b.any3d&&this.options.transform3DLimit&&(t?this.off:this.on).call(this,"moveend",this._onMoveEnd)},_onResize:function(){r(this._resizeRequest),this._resizeRequest=x(function(){this.invalidateSize({debounceMoveend:!0})},this)},_onScroll:function(){this._container.scrollTop=0,this._container.scrollLeft=0},_onMoveEnd:function(){var t=this._getMapPanePos();Math.max(Math.abs(t.x),Math.abs(t.y))>=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,e){for(var i,n=[],o="mouseout"===e||"mouseover"===e,s=t.target||t.srcElement,r=!1;s;){if((i=this._targets[h(s)])&&("click"===e||"preclick"===e)&&this._draggableMoved(i)){r=!0;break}if(i&&i.listens(e,!0)){if(o&&!Fe(s,t))break;if(n.push(i),o)break}if(s===this._container)break;s=s.parentNode}return n=n.length||r||o||!this.listens(e,!0)?n:[this]},_isClickDisabled:function(t){for(;t&&t!==this._container;){if(t._leaflet_disable_click)return!0;t=t.parentNode}},_handleDOMEvent:function(t){var e,i=t.target||t.srcElement;!this._loaded||i._leaflet_disable_events||"click"===t.type&&this._isClickDisabled(i)||("mousedown"===(e=t.type)&&Me(i),this._fireDOMEvent(t,e))},_mouseEvents:["click","dblclick","mouseover","mouseout","contextmenu"],_fireDOMEvent:function(t,e,i){"click"===t.type&&((a=l({},t)).type="preclick",this._fireDOMEvent(a,a.type,i));var n=this._findEventTargets(t,e);if(i){for(var o=[],s=0;sthis.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),n=this._getCenterOffset(t)._divideBy(1-1/n);if(!0!==i.animate&&!this.getSize().contains(n))return!1;x(function(){this._moveStart(!0,!1)._animateZoom(t,e,!0)},this)}return!0},_animateZoom:function(t,e,i,n){this._mapPane&&(i&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=e,M(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:t,zoom:e,noUpdate:n}),this._tempFireZoomEvent||(this._tempFireZoomEvent=this._zoom!==this._animateToZoom),this._move(this._animateToCenter,this._animateToZoom,void 0,!0),setTimeout(a(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&z(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom,void 0,!0),this._tempFireZoomEvent&&this.fire("zoom"),delete this._tempFireZoomEvent,this.fire("move"),this._moveEnd(!0))}});function Ue(t){return new B(t)}var Ve,B=et.extend({options:{position:"topright"},initialize:function(t){c(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this.remove(),this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),t=t._controlCorners[i];return M(e,"leaflet-control"),-1!==i.indexOf("bottom")?t.insertBefore(e,t.firstChild):t.appendChild(e),this._map.on("unload",this.remove,this),this},remove:function(){return this._map&&(T(this._container),this.onRemove&&this.onRemove(this._map),this._map.off("unload",this.remove,this),this._map=null),this},_refocusOnMap:function(t){this._map&&t&&0",e=document.createElement("div");return e.innerHTML=t,e.firstChild},_addItem:function(t){var e,i=document.createElement("label"),n=this._map.hasLayer(t.layer),n=(t.overlay?((e=document.createElement("input")).type="checkbox",e.className="leaflet-control-layers-selector",e.defaultChecked=n):e=this._createRadioElement("leaflet-base-layers_"+h(this),n),this._layerControlInputs.push(e),e.layerId=h(t.layer),S(e,"click",this._onInputClick,this),document.createElement("span")),o=(n.innerHTML=" "+t.name,document.createElement("span"));return i.appendChild(o),o.appendChild(e),o.appendChild(n),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(i),this._checkDisabledLayers(),i},_onInputClick:function(){var t,e,i=this._layerControlInputs,n=[],o=[];this._handlingClick=!0;for(var s=i.length-1;0<=s;s--)t=i[s],e=this._getLayer(t.layerId).layer,t.checked?n.push(e):t.checked||o.push(e);for(s=0;se.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expandSafely:function(){var t=this._section;S(t,"click",O),this.expand(),setTimeout(function(){k(t,"click",O)})}})),Ge=B.extend({options:{position:"topleft",zoomInText:'',zoomInTitle:"Zoom in",zoomOutText:'',zoomOutTitle:"Zoom out"},onAdd:function(t){var e="leaflet-control-zoom",i=P("div",e+" leaflet-bar"),n=this.options;return this._zoomInButton=this._createButton(n.zoomInText,n.zoomInTitle,e+"-in",i,this._zoomIn),this._zoomOutButton=this._createButton(n.zoomOutText,n.zoomOutTitle,e+"-out",i,this._zoomOut),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(t){!this._disabled&&this._map._zoomthis._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(t.shiftKey?3:1))},_createButton:function(t,e,i,n,o){i=P("a",i,n);return i.innerHTML=t,i.href="#",i.title=e,i.setAttribute("role","button"),i.setAttribute("aria-label",e),Ie(i),S(i,"click",Re),S(i,"click",o,this),S(i,"click",this._refocusOnMap,this),i},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";z(this._zoomInButton,e),z(this._zoomOutButton,e),this._zoomInButton.setAttribute("aria-disabled","false"),this._zoomOutButton.setAttribute("aria-disabled","false"),!this._disabled&&t._zoom!==t.getMinZoom()||(M(this._zoomOutButton,e),this._zoomOutButton.setAttribute("aria-disabled","true")),!this._disabled&&t._zoom!==t.getMaxZoom()||(M(this._zoomInButton,e),this._zoomInButton.setAttribute("aria-disabled","true"))}}),Ke=(A.mergeOptions({zoomControl:!0}),A.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new Ge,this.addControl(this.zoomControl))}),B.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var e="leaflet-control-scale",i=P("div",e),n=this.options;return this._addScales(n,e+"-line",i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=P("div",e,i)),t.imperial&&(this._iScale=P("div",e,i))},_update:function(){var t=this._map,e=t.getSize().y/2,t=t.distance(t.containerPointToLatLng([0,e]),t.containerPointToLatLng([this.options.maxWidth,e]));this._updateScales(t)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var e=this._getRoundNum(t);this._updateScale(this._mScale,e<1e3?e+" m":e/1e3+" km",e/t)},_updateImperial:function(t){var e,i,t=3.2808399*t;5280'+(b.inlineSvg?' ':"")+"Leaflet"},initialize:function(t){c(this,t),this._attributions={}},onAdd:function(t){for(var e in(t.attributionControl=this)._container=P("div","leaflet-control-attribution"),Ie(this._container),t._layers)t._layers[e].getAttribution&&this.addAttribution(t._layers[e].getAttribution());return this._update(),t.on("layeradd",this._addAttribution,this),this._container},onRemove:function(t){t.off("layeradd",this._addAttribution,this)},_addAttribution:function(t){t.layer.getAttribution&&(this.addAttribution(t.layer.getAttribution()),t.layer.once("remove",function(){this.removeAttribution(t.layer.getAttribution())},this))},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t&&(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update()),this},removeAttribution:function(t){return t&&this._attributions[t]&&(this._attributions[t]--,this._update()),this},_update:function(){if(this._map){var t,e=[];for(t in this._attributions)this._attributions[t]&&e.push(t);var i=[];this.options.prefix&&i.push(this.options.prefix),e.length&&i.push(e.join(", ")),this._container.innerHTML=i.join(' ')}}}),n=(A.mergeOptions({attributionControl:!0}),A.addInitHook(function(){this.options.attributionControl&&(new Ye).addTo(this)}),B.Layers=qe,B.Zoom=Ge,B.Scale=Ke,B.Attribution=Ye,Ue.layers=function(t,e,i){return new qe(t,e,i)},Ue.zoom=function(t){return new Ge(t)},Ue.scale=function(t){return new Ke(t)},Ue.attribution=function(t){return new Ye(t)},et.extend({initialize:function(t){this._map=t},enable:function(){return this._enabled||(this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled&&(this._enabled=!1,this.removeHooks()),this},enabled:function(){return!!this._enabled}})),ft=(n.addTo=function(t,e){return t.addHandler(e,this),this},{Events:e}),Xe=b.touch?"touchstart mousedown":"mousedown",Je=it.extend({options:{clickTolerance:3},initialize:function(t,e,i,n){c(this,n),this._element=t,this._dragStartTarget=e||t,this._preventOutline=i},enable:function(){this._enabled||(S(this._dragStartTarget,Xe,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(Je._dragging===this&&this.finishDrag(!0),k(this._dragStartTarget,Xe,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(t){var e,i;this._enabled&&(this._moved=!1,ve(this._element,"leaflet-zoom-anim")||(t.touches&&1!==t.touches.length?Je._dragging===this&&this.finishDrag():Je._dragging||t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||((Je._dragging=this)._preventOutline&&Me(this._element),Le(),re(),this._moving||(this.fire("down"),i=t.touches?t.touches[0]:t,e=Ce(this._element),this._startPoint=new p(i.clientX,i.clientY),this._startPos=Pe(this._element),this._parentScale=Ze(e),i="mousedown"===t.type,S(document,i?"mousemove":"touchmove",this._onMove,this),S(document,i?"mouseup":"touchend touchcancel",this._onUp,this)))))},_onMove:function(t){var e;this._enabled&&(t.touches&&1e&&(i.push(t[n]),o=n);oe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i}function ni(t,e,i,n){var o=e.x,e=e.y,s=i.x-o,r=i.y-e,a=s*s+r*r;return 0this._layersMaxZoom&&this.setZoom(this._layersMaxZoom),void 0===this.options.minZoom&&this._layersMinZoom&&this.getZoom()t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(l=!l);return l||vi.prototype._containsPoint.call(this,t,!0)}});var xi=ui.extend({initialize:function(t,e){c(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,o=d(t)?t:t.features;if(o){for(e=0,i=o.length;es.x&&(r=i.x+a-s.x+o.x),i.x-r-n.x<(a=0)&&(r=i.x-n.x),i.y+e+o.y>s.y&&(a=i.y+e-s.y+o.y),i.y-a-n.y<0&&(a=i.y-n.y),(r||a)&&(this.options.keepInView&&(this._autopanning=!0),t.fire("autopanstart").panBy([r,a]))))},_getAnchor:function(){return m(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}})),Bi=(A.mergeOptions({closePopupOnClick:!0}),A.include({openPopup:function(t,e,i){return this._initOverlay(Ai,t,e,i).openOn(this),this},closePopup:function(t){return(t=arguments.length?t:this._popup)&&t.close(),this}}),o.include({bindPopup:function(t,e){return this._popup=this._initOverlay(Ai,this._popup,t,e),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(t){return this._popup&&(this instanceof ui||(this._popup._source=this),this._popup._prepareOpen(t||this._latlng)&&this._popup.openOn(this._map)),this},closePopup:function(){return this._popup&&this._popup.close(),this},togglePopup:function(){return this._popup&&this._popup.toggle(this),this},isPopupOpen:function(){return!!this._popup&&this._popup.isOpen()},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},getPopup:function(){return this._popup},_openPopup:function(t){var e;this._popup&&this._map&&(Re(t),e=t.layer||t.target,this._popup._source!==e||e instanceof mi?(this._popup._source=e,this.openPopup(t.latlng)):this._map.hasLayer(this._popup)?this.closePopup():this.openPopup(t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)},_onKeyPress:function(t){13===t.originalEvent.keyCode&&this._openPopup(t)}}),Oi.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,opacity:.9},onAdd:function(t){Oi.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire("tooltipopen",{tooltip:this}),this._source&&(this.addEventParent(this._source),this._source.fire("tooltipopen",{tooltip:this},!0))},onRemove:function(t){Oi.prototype.onRemove.call(this,t),t.fire("tooltipclose",{tooltip:this}),this._source&&(this.removeEventParent(this._source),this._source.fire("tooltipclose",{tooltip:this},!0))},getEvents:function(){var t=Oi.prototype.getEvents.call(this);return this.options.permanent||(t.preclick=this.close),t},_initLayout:function(){var t="leaflet-tooltip "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=P("div",t),this._container.setAttribute("role","tooltip"),this._container.setAttribute("id","leaflet-tooltip-"+h(this))},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var e,i=this._map,n=this._container,o=i.latLngToContainerPoint(i.getCenter()),i=i.layerPointToContainerPoint(t),s=this.options.direction,r=n.offsetWidth,a=n.offsetHeight,h=m(this.options.offset),l=this._getAnchor(),i="top"===s?(e=r/2,a):"bottom"===s?(e=r/2,0):(e="center"===s?r/2:"right"===s?0:"left"===s?r:i.xthis.options.maxZoom||nthis.options.maxZoom||void 0!==this.options.minZoom&&oi.max.x)||!e.wrapLat&&(t.yi.max.y))return!1}return!this.options.bounds||(e=this._tileCoordsToBounds(t),g(this.options.bounds).overlaps(e))},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToNwSe:function(t){var e=this._map,i=this.getTileSize(),n=t.scaleBy(i),i=n.add(i);return[e.unproject(n,t.z),e.unproject(i,t.z)]},_tileCoordsToBounds:function(t){t=this._tileCoordsToNwSe(t),t=new s(t[0],t[1]);return t=this.options.noWrap?t:this._map.wrapLatLngBounds(t)},_tileCoordsToKey:function(t){return t.x+":"+t.y+":"+t.z},_keyToTileCoords:function(t){var t=t.split(":"),e=new p(+t[0],+t[1]);return e.z=+t[2],e},_removeTile:function(t){var e=this._tiles[t];e&&(T(e.el),delete this._tiles[t],this.fire("tileunload",{tile:e.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){M(t,"leaflet-tile");var e=this.getTileSize();t.style.width=e.x+"px",t.style.height=e.y+"px",t.onselectstart=u,t.onmousemove=u,b.ielt9&&this.options.opacity<1&&C(t,this.options.opacity)},_addTile:function(t,e){var i=this._getTilePos(t),n=this._tileCoordsToKey(t),o=this.createTile(this._wrapCoords(t),a(this._tileReady,this,t));this._initTile(o),this.createTile.length<2&&x(a(this._tileReady,this,t,null,o)),Z(o,i),this._tiles[n]={el:o,coords:t,current:!0},e.appendChild(o),this.fire("tileloadstart",{tile:o,coords:t})},_tileReady:function(t,e,i){e&&this.fire("tileerror",{error:e,tile:i,coords:t});var n=this._tileCoordsToKey(t);(i=this._tiles[n])&&(i.loaded=+new Date,this._map._fadeAnimated?(C(i.el,0),r(this._fadeFrame),this._fadeFrame=x(this._updateOpacity,this)):(i.active=!0,this._pruneTiles()),e||(M(i.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:i.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),b.ielt9||!this._map._fadeAnimated?x(this._pruneTiles,this):setTimeout(a(this._pruneTiles,this),250)))},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var e=new p(this._wrapX?H(t.x,this._wrapX):t.x,this._wrapY?H(t.y,this._wrapY):t.y);return e.z=t.z,e},_pxBoundsToTileRange:function(t){var e=this.getTileSize();return new f(t.min.unscaleBy(e).floor(),t.max.unscaleBy(e).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}});var Ni=Ri.extend({options:{minZoom:0,maxZoom:18,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1,referrerPolicy:!1},initialize:function(t,e){this._url=t,(e=c(this,e)).detectRetina&&b.retina&&0')}}catch(t){}return function(t){return document.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}(),zt={_initContainer:function(){this._container=P("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(Hi.prototype._update.call(this),this.fire("update"))},_initPath:function(t){var e=t._container=Ui("shape");M(e,"leaflet-vml-shape "+(this.options.className||"")),e.coordsize="1 1",t._path=Ui("path"),e.appendChild(t._path),this._updateStyle(t),this._layers[h(t)]=t},_addPath:function(t){var e=t._container;this._container.appendChild(e),t.options.interactive&&t.addInteractiveTarget(e)},_removePath:function(t){var e=t._container;T(e),t.removeInteractiveTarget(e),delete this._layers[h(t)]},_updateStyle:function(t){var e=t._stroke,i=t._fill,n=t.options,o=t._container;o.stroked=!!n.stroke,o.filled=!!n.fill,n.stroke?(e=e||(t._stroke=Ui("stroke")),o.appendChild(e),e.weight=n.weight+"px",e.color=n.color,e.opacity=n.opacity,n.dashArray?e.dashStyle=d(n.dashArray)?n.dashArray.join(" "):n.dashArray.replace(/( *, *)/g," "):e.dashStyle="",e.endcap=n.lineCap.replace("butt","flat"),e.joinstyle=n.lineJoin):e&&(o.removeChild(e),t._stroke=null),n.fill?(i=i||(t._fill=Ui("fill")),o.appendChild(i),i.color=n.fillColor||n.color,i.opacity=n.fillOpacity):i&&(o.removeChild(i),t._fill=null)},_updateCircle:function(t){var e=t._point.round(),i=Math.round(t._radius),n=Math.round(t._radiusY||i);this._setPath(t,t._empty()?"M0 0":"AL "+e.x+","+e.y+" "+i+","+n+" 0,23592600")},_setPath:function(t,e){t._path.v=e},_bringToFront:function(t){fe(t._container)},_bringToBack:function(t){ge(t._container)}},Vi=b.vml?Ui:ct,qi=Hi.extend({_initContainer:function(){this._container=Vi("svg"),this._container.setAttribute("pointer-events","none"),this._rootGroup=Vi("g"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){T(this._container),k(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_update:function(){var t,e,i;this._map._animatingZoom&&this._bounds||(Hi.prototype._update.call(this),e=(t=this._bounds).getSize(),i=this._container,this._svgSize&&this._svgSize.equals(e)||(this._svgSize=e,i.setAttribute("width",e.x),i.setAttribute("height",e.y)),Z(i,t.min),i.setAttribute("viewBox",[t.min.x,t.min.y,e.x,e.y].join(" ")),this.fire("update"))},_initPath:function(t){var e=t._path=Vi("path");t.options.className&&M(e,t.options.className),t.options.interactive&&M(e,"leaflet-interactive"),this._updateStyle(t),this._layers[h(t)]=t},_addPath:function(t){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(t._path),t.addInteractiveTarget(t._path)},_removePath:function(t){T(t._path),t.removeInteractiveTarget(t._path),delete this._layers[h(t)]},_updatePath:function(t){t._project(),t._update()},_updateStyle:function(t){var e=t._path,t=t.options;e&&(t.stroke?(e.setAttribute("stroke",t.color),e.setAttribute("stroke-opacity",t.opacity),e.setAttribute("stroke-width",t.weight),e.setAttribute("stroke-linecap",t.lineCap),e.setAttribute("stroke-linejoin",t.lineJoin),t.dashArray?e.setAttribute("stroke-dasharray",t.dashArray):e.removeAttribute("stroke-dasharray"),t.dashOffset?e.setAttribute("stroke-dashoffset",t.dashOffset):e.removeAttribute("stroke-dashoffset")):e.setAttribute("stroke","none"),t.fill?(e.setAttribute("fill",t.fillColor||t.color),e.setAttribute("fill-opacity",t.fillOpacity),e.setAttribute("fill-rule",t.fillRule||"evenodd")):e.setAttribute("fill","none"))},_updatePoly:function(t,e){this._setPath(t,dt(t._parts,e))},_updateCircle:function(t){var e=t._point,i=Math.max(Math.round(t._radius),1),n="a"+i+","+(Math.max(Math.round(t._radiusY),1)||i)+" 0 1,0 ",e=t._empty()?"M0 0":"M"+(e.x-i)+","+e.y+n+2*i+",0 "+n+2*-i+",0 ";this._setPath(t,e)},_setPath:function(t,e){t._path.setAttribute("d",e)},_bringToFront:function(t){fe(t._path)},_bringToBack:function(t){ge(t._path)}});function Gi(t){return b.svg||b.vml?new qi(t):null}b.vml&&qi.include(zt),A.include({getRenderer:function(t){t=(t=t.options.renderer||this._getPaneRenderer(t.options.pane)||this.options.renderer||this._renderer)||(this._renderer=this._createRenderer());return this.hasLayer(t)||this.addLayer(t),t},_getPaneRenderer:function(t){var e;return"overlayPane"!==t&&void 0!==t&&(void 0===(e=this._paneRenderers[t])&&(e=this._createRenderer({pane:t}),this._paneRenderers[t]=e),e)},_createRenderer:function(t){return this.options.preferCanvas&&Wi(t)||Gi(t)}});var Ki=yi.extend({initialize:function(t,e){yi.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){return this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return[(t=g(t)).getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}});qi.create=Vi,qi.pointsToPath=dt,xi.geometryToLayer=wi,xi.coordsToLatLng=Pi,xi.coordsToLatLngs=Li,xi.latLngToCoords=Ti,xi.latLngsToCoords=Mi,xi.getFeature=zi,xi.asFeature=Ci,A.mergeOptions({boxZoom:!0});var _t=n.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){S(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){k(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){T(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),re(),Le(),this._startPoint=this._map.mouseEventToContainerPoint(t),S(document,{contextmenu:Re,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=P("div","leaflet-zoom-box",this._container),M(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t);var t=new f(this._point,this._startPoint),e=t.getSize();Z(this._box,t.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(T(this._box),z(this._container,"leaflet-crosshair")),ae(),Te(),k(document,{contextmenu:Re,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){1!==t.which&&1!==t.button||(this._finish(),this._moved&&(this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(a(this._resetState,this),0),t=new s(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point)),this._map.fitBounds(t).fire("boxzoomend",{boxZoomBounds:t})))},_onKeyDown:function(t){27===t.keyCode&&(this._finish(),this._clearDeferredResetState(),this._resetState())}}),Ct=(A.addInitHook("addHandler","boxZoom",_t),A.mergeOptions({doubleClickZoom:!0}),n.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var e=this._map,i=e.getZoom(),n=e.options.zoomDelta,i=t.originalEvent.shiftKey?i-n:i+n;"center"===e.options.doubleClickZoom?e.setZoom(i):e.setZoomAround(t.containerPoint,i)}})),Zt=(A.addInitHook("addHandler","doubleClickZoom",Ct),A.mergeOptions({dragging:!0,inertia:!0,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0}),n.extend({addHooks:function(){var t;this._draggable||(t=this._map,this._draggable=new Je(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on("predrag",this._onPreDragLimit,this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDragWrap,this),t.on("zoomend",this._onZoomEnd,this),t.whenReady(this._onZoomEnd,this))),M(this._map._container,"leaflet-grab leaflet-touch-drag"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){z(this._map._container,"leaflet-grab"),z(this._map._container,"leaflet-touch-drag"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var t,e=this._map;e._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity?(t=g(this._map.options.maxBounds),this._offsetLimit=_(this._map.latLngToContainerPoint(t.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(t.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))):this._offsetLimit=null,e.fire("movestart").fire("dragstart"),e.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(t){var e,i;this._map.options.inertia&&(e=this._lastTime=+new Date,i=this._lastPos=this._draggable._absPos||this._draggable._newPos,this._positions.push(i),this._times.push(e),this._prunePositions(e)),this._map.fire("move",t).fire("drag",t)},_prunePositions:function(t){for(;1e.max.x&&(t.x=this._viscousLimit(t.x,e.max.x)),t.y>e.max.y&&(t.y=this._viscousLimit(t.y,e.max.y)),this._draggable._newPos=this._draggable._startPos.add(t))},_onPreDragWrap:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,n=(n+e+i)%t-e-i,t=Math.abs(o+i)e.getMaxZoom()&&1=i;)t=t.__parent;return this._currentShownBounds.contains(t.getLatLng())&&(this.options.animateAddingMarkers?this._animationAddLayer(e,t):this._animationAddLayerNonAnimated(e,t)),this},removeLayer:function(e){return e instanceof L.LayerGroup?this.removeLayers([e]):e.getLatLng?this._map?e.__parent?(this._unspiderfy&&(this._unspiderfy(),this._unspiderfyLayer(e)),this._removeLayer(e,!0),this.fire("layerremove",{layer:e}),this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons(),e.off(this._childMarkerEventHandlers,this),this._featureGroup.hasLayer(e)&&(this._featureGroup.removeLayer(e),e.clusterShow&&e.clusterShow()),this):this:(!this._arraySplice(this._needsClustering,e)&&this.hasLayer(e)&&this._needsRemoving.push({layer:e,latlng:e._latlng}),this.fire("layerremove",{layer:e}),this):(this._nonPointGroup.removeLayer(e),this.fire("layerremove",{layer:e}),this)},addLayers:function(e,t){if(!L.Util.isArray(e))return this.addLayer(e);var i,n=this._featureGroup,r=this._nonPointGroup,s=this.options.chunkedLoading,o=this.options.chunkInterval,a=this.options.chunkProgress,h=e.length,l=0,u=!0;if(this._map){var _=(new Date).getTime(),d=L.bind(function(){for(var c=(new Date).getTime();h>l;l++){if(s&&0===l%200){var p=(new Date).getTime()-c;if(p>o)break}if(i=e[l],i instanceof L.LayerGroup)u&&(e=e.slice(),u=!1),this._extractNonGroupLayers(i,e),h=e.length;else if(i.getLatLng){if(!this.hasLayer(i)&&(this._addLayer(i,this._maxZoom),t||this.fire("layeradd",{layer:i}),i.__parent&&2===i.__parent.getChildCount())){var f=i.__parent.getAllChildMarkers(),m=f[0]===i?f[1]:f[0];n.removeLayer(m)}}else r.addLayer(i),t||this.fire("layeradd",{layer:i})}a&&a(l,h,(new Date).getTime()-_),l===h?(this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons(),this._topClusterLevel._recursivelyAddChildrenToMap(null,this._zoom,this._currentShownBounds)):setTimeout(d,this.options.chunkDelay)},this);d()}else for(var c=this._needsClustering;h>l;l++)i=e[l],i instanceof L.LayerGroup?(u&&(e=e.slice(),u=!1),this._extractNonGroupLayers(i,e),h=e.length):i.getLatLng?this.hasLayer(i)||c.push(i):r.addLayer(i);return this},removeLayers:function(e){var t,i,n=e.length,r=this._featureGroup,s=this._nonPointGroup,o=!0;if(!this._map){for(t=0;n>t;t++)i=e[t],i instanceof L.LayerGroup?(o&&(e=e.slice(),o=!1),this._extractNonGroupLayers(i,e),n=e.length):(this._arraySplice(this._needsClustering,i),s.removeLayer(i),this.hasLayer(i)&&this._needsRemoving.push({layer:i,latlng:i._latlng}),this.fire("layerremove",{layer:i}));return this}if(this._unspiderfy){this._unspiderfy();var a=e.slice(),h=n;for(t=0;h>t;t++)i=a[t],i instanceof L.LayerGroup?(this._extractNonGroupLayers(i,a),h=a.length):this._unspiderfyLayer(i)}for(t=0;n>t;t++)i=e[t],i instanceof L.LayerGroup?(o&&(e=e.slice(),o=!1),this._extractNonGroupLayers(i,e),n=e.length):i.__parent?(this._removeLayer(i,!0,!0),this.fire("layerremove",{layer:i}),r.hasLayer(i)&&(r.removeLayer(i),i.clusterShow&&i.clusterShow())):(s.removeLayer(i),this.fire("layerremove",{layer:i}));return this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons(),this._topClusterLevel._recursivelyAddChildrenToMap(null,this._zoom,this._currentShownBounds),this},clearLayers:function(){return this._map||(this._needsClustering=[],this._needsRemoving=[],delete this._gridClusters,delete this._gridUnclustered),this._noanimationUnspiderfy&&this._noanimationUnspiderfy(),this._featureGroup.clearLayers(),this._nonPointGroup.clearLayers(),this.eachLayer(function(e){e.off(this._childMarkerEventHandlers,this),delete e.__parent},this),this._map&&this._generateInitialClusters(),this},getBounds:function(){var e=new L.LatLngBounds;this._topClusterLevel&&e.extend(this._topClusterLevel._bounds);for(var t=this._needsClustering.length-1;t>=0;t--)e.extend(this._needsClustering[t].getLatLng());return e.extend(this._nonPointGroup.getBounds()),e},eachLayer:function(e,t){var i,n,r,s=this._needsClustering.slice(),o=this._needsRemoving;for(this._topClusterLevel&&this._topClusterLevel.getAllChildMarkers(s),n=s.length-1;n>=0;n--){for(i=!0,r=o.length-1;r>=0;r--)if(o[r].layer===s[n]){i=!1;break}i&&e.call(t,s[n])}this._nonPointGroup.eachLayer(e,t)},getLayers:function(){var e=[];return this.eachLayer(function(t){e.push(t)}),e},getLayer:function(e){var t=null;return e=parseInt(e,10),this.eachLayer(function(i){L.stamp(i)===e&&(t=i)}),t},hasLayer:function(e){if(!e)return!1;var t,i=this._needsClustering;for(t=i.length-1;t>=0;t--)if(i[t]===e)return!0;for(i=this._needsRemoving,t=i.length-1;t>=0;t--)if(i[t].layer===e)return!1;return!(!e.__parent||e.__parent._group!==this)||this._nonPointGroup.hasLayer(e)},zoomToShowLayer:function(e,t){"function"!=typeof t&&(t=function(){});var i=function(){!e._icon&&!e.__parent._icon||this._inZoomAnimation||(this._map.off("moveend",i,this),this.off("animationend",i,this),e._icon?t():e.__parent._icon&&(this.once("spiderfied",t,this),e.__parent.spiderfy()))};e._icon&&this._map.getBounds().contains(e.getLatLng())?t():e.__parent._zoomt;t++)n=this._needsRemoving[t],n.newlatlng=n.layer._latlng,n.layer._latlng=n.latlng;for(t=0,i=this._needsRemoving.length;i>t;t++)n=this._needsRemoving[t],this._removeLayer(n.layer,!0),n.layer._latlng=n.newlatlng;this._needsRemoving=[],this._zoom=Math.round(this._map._zoom),this._currentShownBounds=this._getExpandedVisibleBounds(),this._map.on("zoomend",this._zoomEnd,this),this._map.on("moveend",this._moveEnd,this),this._spiderfierOnAdd&&this._spiderfierOnAdd(),this._bindEvents(),i=this._needsClustering,this._needsClustering=[],this.addLayers(i,!0)},onRemove:function(e){e.off("zoomend",this._zoomEnd,this),e.off("moveend",this._moveEnd,this),this._unbindEvents(),this._map._mapPane.className=this._map._mapPane.className.replace(" leaflet-cluster-anim",""),this._spiderfierOnRemove&&this._spiderfierOnRemove(),delete this._maxLat,this._hideCoverage(),this._featureGroup.remove(),this._nonPointGroup.remove(),this._featureGroup.clearLayers(),this._map=null},getVisibleParent:function(e){for(var t=e;t&&!t._icon;)t=t.__parent;return t||null},_arraySplice:function(e,t){for(var i=e.length-1;i>=0;i--)if(e[i]===t)return e.splice(i,1),!0},_removeFromGridUnclustered:function(e,t){for(var i=this._map,n=this._gridUnclustered,r=Math.floor(this._map.getMinZoom());t>=r&&n[t].removeObject(e,i.project(e.getLatLng(),t));t--);},_childMarkerDragStart:function(e){e.target.__dragStart=e.target._latlng},_childMarkerMoved:function(e){if(!this._ignoreMove&&!e.target.__dragStart){var t=e.target._popup&&e.target._popup.isOpen();this._moveChild(e.target,e.oldLatLng,e.latlng),t&&e.target.openPopup()}},_moveChild:function(e,t,i){e._latlng=t,this.removeLayer(e),e._latlng=i,this.addLayer(e)},_childMarkerDragEnd:function(e){var t=e.target.__dragStart;delete e.target.__dragStart,t&&this._moveChild(e.target,t,e.target._latlng)},_removeLayer:function(e,t,i){var n=this._gridClusters,r=this._gridUnclustered,s=this._featureGroup,o=this._map,a=Math.floor(this._map.getMinZoom());t&&this._removeFromGridUnclustered(e,this._maxZoom);var h,l=e.__parent,u=l._markers;for(this._arraySplice(u,e);l&&(l._childCount--,l._boundsNeedUpdate=!0,!(l._zoomt?"small":100>t?"medium":"large",new L.DivIcon({html:"
"+t+"
",className:"marker-cluster"+i,iconSize:new L.Point(40,40)})},_bindEvents:function(){var e=this._map,t=this.options.spiderfyOnMaxZoom,i=this.options.showCoverageOnHover,n=this.options.zoomToBoundsOnClick;(t||n)&&this.on("clusterclick",this._zoomOrSpiderfy,this),i&&(this.on("clustermouseover",this._showCoverage,this),this.on("clustermouseout",this._hideCoverage,this),e.on("zoomend",this._hideCoverage,this))},_zoomOrSpiderfy:function(e){for(var t=e.layer,i=t;1===i._childClusters.length;)i=i._childClusters[0];i._zoom===this._maxZoom&&i._childCount===t._childCount&&this.options.spiderfyOnMaxZoom?t.spiderfy():this.options.zoomToBoundsOnClick&&t.zoomToBounds(),e.originalEvent&&13===e.originalEvent.keyCode&&this._map._container.focus()},_showCoverage:function(e){var t=this._map;this._inZoomAnimation||(this._shownPolygon&&t.removeLayer(this._shownPolygon),e.layer.getChildCount()>2&&e.layer!==this._spiderfied&&(this._shownPolygon=new L.Polygon(e.layer.getConvexHull(),this.options.polygonOptions),t.addLayer(this._shownPolygon)))},_hideCoverage:function(){this._shownPolygon&&(this._map.removeLayer(this._shownPolygon),this._shownPolygon=null)},_unbindEvents:function(){var e=this.options.spiderfyOnMaxZoom,t=this.options.showCoverageOnHover,i=this.options.zoomToBoundsOnClick,n=this._map;(e||i)&&this.off("clusterclick",this._zoomOrSpiderfy,this),t&&(this.off("clustermouseover",this._showCoverage,this),this.off("clustermouseout",this._hideCoverage,this),n.off("zoomend",this._hideCoverage,this))},_zoomEnd:function(){this._map&&(this._mergeSplitClusters(),this._zoom=Math.round(this._map._zoom),this._currentShownBounds=this._getExpandedVisibleBounds())},_moveEnd:function(){if(!this._inZoomAnimation){var e=this._getExpandedVisibleBounds();this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,Math.floor(this._map.getMinZoom()),this._zoom,e),this._topClusterLevel._recursivelyAddChildrenToMap(null,Math.round(this._map._zoom),e),this._currentShownBounds=e}},_generateInitialClusters:function(){var e=Math.ceil(this._map.getMaxZoom()),t=Math.floor(this._map.getMinZoom()),i=this.options.maxClusterRadius,n=i;"function"!=typeof i&&(n=function(){return i}),null!==this.options.disableClusteringAtZoom&&(e=this.options.disableClusteringAtZoom-1),this._maxZoom=e,this._gridClusters={},this._gridUnclustered={};for(var r=e;r>=t;r--)this._gridClusters[r]=new L.DistanceGrid(n(r)),this._gridUnclustered[r]=new L.DistanceGrid(n(r));this._topClusterLevel=new this._markerCluster(this,t-1)},_addLayer:function(e,t){var i,n,r=this._gridClusters,s=this._gridUnclustered,o=Math.floor(this._map.getMinZoom());for(this.options.singleMarkerMode&&this._overrideMarkerIcon(e),e.on(this._childMarkerEventHandlers,this);t>=o;t--){i=this._map.project(e.getLatLng(),t);var a=r[t].getNearObject(i);if(a)return a._addChild(e),e.__parent=a,void 0;if(a=s[t].getNearObject(i)){var h=a.__parent;h&&this._removeLayer(a,!1);var l=new this._markerCluster(this,t,a,e);r[t].addObject(l,this._map.project(l._cLatLng,t)),a.__parent=l,e.__parent=l;var u=l;for(n=t-1;n>h._zoom;n--)u=new this._markerCluster(this,n,u),r[n].addObject(u,this._map.project(a.getLatLng(),n));return h._addChild(u),this._removeFromGridUnclustered(a,t),void 0}s[t].addObject(e,i)}this._topClusterLevel._addChild(e),e.__parent=this._topClusterLevel},_refreshClustersIcons:function(){this._featureGroup.eachLayer(function(e){e instanceof L.MarkerCluster&&e._iconNeedsUpdate&&e._updateIcon()})},_enqueue:function(e){this._queue.push(e),this._queueTimeout||(this._queueTimeout=setTimeout(L.bind(this._processQueue,this),300))},_processQueue:function(){for(var e=0;ee?(this._animationStart(),this._animationZoomOut(this._zoom,e)):this._moveEnd()},_getExpandedVisibleBounds:function(){return this.options.removeOutsideVisibleBounds?L.Browser.mobile?this._checkBoundsMaxLat(this._map.getBounds()):this._checkBoundsMaxLat(this._map.getBounds().pad(1)):this._mapBoundsInfinite},_checkBoundsMaxLat:function(e){var t=this._maxLat;return void 0!==t&&(e.getNorth()>=t&&(e._northEast.lat=1/0),e.getSouth()<=-t&&(e._southWest.lat=-1/0)),e},_animationAddLayerNonAnimated:function(e,t){if(t===e)this._featureGroup.addLayer(e);else if(2===t._childCount){t._addToMap();var i=t.getAllChildMarkers();this._featureGroup.removeLayer(i[0]),this._featureGroup.removeLayer(i[1])}else t._updateIcon()},_extractNonGroupLayers:function(e,t){var i,n=e.getLayers(),r=0;for(t=t||[];r=0;i--)o=h[i],n.contains(o._latlng)||r.removeLayer(o)}),this._forceLayout(),this._topClusterLevel._recursivelyBecomeVisible(n,t),r.eachLayer(function(e){e instanceof L.MarkerCluster||!e._icon||e.clusterShow()}),this._topClusterLevel._recursively(n,e,t,function(e){e._recursivelyRestoreChildPositions(t)}),this._ignoreMove=!1,this._enqueue(function(){this._topClusterLevel._recursively(n,e,s,function(e){r.removeLayer(e),e.clusterShow()}),this._animationEnd()})},_animationZoomOut:function(e,t){this._animationZoomOutSingle(this._topClusterLevel,e-1,t),this._topClusterLevel._recursivelyAddChildrenToMap(null,t,this._getExpandedVisibleBounds()),this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,Math.floor(this._map.getMinZoom()),e,this._getExpandedVisibleBounds())},_animationAddLayer:function(e,t){var i=this,n=this._featureGroup;n.addLayer(e),t!==e&&(t._childCount>2?(t._updateIcon(),this._forceLayout(),this._animationStart(),e._setPos(this._map.latLngToLayerPoint(t.getLatLng())),e.clusterHide(),this._enqueue(function(){n.removeLayer(e),e.clusterShow(),i._animationEnd()})):(this._forceLayout(),i._animationStart(),i._animationZoomOutSingle(t,this._map.getMaxZoom(),this._zoom)))}},_animationZoomOutSingle:function(e,t,i){var n=this._getExpandedVisibleBounds(),r=Math.floor(this._map.getMinZoom());e._recursivelyAnimateChildrenInAndAddSelfToMap(n,r,t+1,i);var s=this;this._forceLayout(),e._recursivelyBecomeVisible(n,i),this._enqueue(function(){if(1===e._childCount){var o=e._markers[0];this._ignoreMove=!0,o.setLatLng(o.getLatLng()),this._ignoreMove=!1,o.clusterShow&&o.clusterShow()}else e._recursively(n,i,r,function(e){e._recursivelyRemoveChildrenFromMap(n,r,t+1)});s._animationEnd()})},_animationEnd:function(){this._map&&(this._map._mapPane.className=this._map._mapPane.className.replace(" leaflet-cluster-anim","")),this._inZoomAnimation--,this.fire("animationend")},_forceLayout:function(){L.Util.falseFn(document.body.offsetWidth)}}),L.markerClusterGroup=function(e){return new L.MarkerClusterGroup(e)};var i=L.MarkerCluster=L.Marker.extend({options:L.Icon.prototype.options,initialize:function(e,t,i,n){L.Marker.prototype.initialize.call(this,i?i._cLatLng||i.getLatLng():new L.LatLng(0,0),{icon:this,pane:e.options.clusterPane}),this._group=e,this._zoom=t,this._markers=[],this._childClusters=[],this._childCount=0,this._iconNeedsUpdate=!0,this._boundsNeedUpdate=!0,this._bounds=new L.LatLngBounds,i&&this._addChild(i),n&&this._addChild(n)},getAllChildMarkers:function(e,t){e=e||[];for(var i=this._childClusters.length-1;i>=0;i--)this._childClusters[i].getAllChildMarkers(e);for(var n=this._markers.length-1;n>=0;n--)t&&this._markers[n].__dragStart||e.push(this._markers[n]);return e},getChildCount:function(){return this._childCount},zoomToBounds:function(e){for(var t,i=this._childClusters.slice(),n=this._group._map,r=n.getBoundsZoom(this._bounds),s=this._zoom+1,o=n.getZoom();i.length>0&&r>s;){s++;var a=[];for(t=0;ts?this._group._map.setView(this._latlng,s):o>=r?this._group._map.setView(this._latlng,o+1):this._group._map.fitBounds(this._bounds,e)},getBounds:function(){var e=new L.LatLngBounds;return e.extend(this._bounds),e},_updateIcon:function(){this._iconNeedsUpdate=!0,this._icon&&this.setIcon(this)},createIcon:function(){return this._iconNeedsUpdate&&(this._iconObj=this._group.options.iconCreateFunction(this),this._iconNeedsUpdate=!1),this._iconObj.createIcon()},createShadow:function(){return this._iconObj.createShadow()},_addChild:function(e,t){this._iconNeedsUpdate=!0,this._boundsNeedUpdate=!0,this._setClusterCenter(e),e instanceof L.MarkerCluster?(t||(this._childClusters.push(e),e.__parent=this),this._childCount+=e._childCount):(t||this._markers.push(e),this._childCount++),this.__parent&&this.__parent._addChild(e,!0)},_setClusterCenter:function(e){this._cLatLng||(this._cLatLng=e._cLatLng||e._latlng)},_resetBounds:function(){var e=this._bounds;e._southWest&&(e._southWest.lat=1/0,e._southWest.lng=1/0),e._northEast&&(e._northEast.lat=-1/0,e._northEast.lng=-1/0)},_recalculateBounds:function(){var e,t,i,n,r=this._markers,s=this._childClusters,o=0,a=0,h=this._childCount;if(0!==h){for(this._resetBounds(),e=0;e=0;i--)n=r[i],n._icon&&(n._setPos(t),n.clusterHide())},function(e){var i,n,r=e._childClusters;for(i=r.length-1;i>=0;i--)n=r[i],n._icon&&(n._setPos(t),n.clusterHide())})},_recursivelyAnimateChildrenInAndAddSelfToMap:function(e,t,i,n){this._recursively(e,n,t,function(r){r._recursivelyAnimateChildrenIn(e,r._group._map.latLngToLayerPoint(r.getLatLng()).round(),i),r._isSingleParent()&&i-1===n?(r.clusterShow(),r._recursivelyRemoveChildrenFromMap(e,t,i)):r.clusterHide(),r._addToMap()})},_recursivelyBecomeVisible:function(e,t){this._recursively(e,this._group._map.getMinZoom(),t,null,function(e){e.clusterShow()})},_recursivelyAddChildrenToMap:function(e,t,i){this._recursively(i,this._group._map.getMinZoom()-1,t,function(n){if(t!==n._zoom)for(var r=n._markers.length-1;r>=0;r--){var s=n._markers[r];i.contains(s._latlng)&&(e&&(s._backupLatlng=s.getLatLng(),s.setLatLng(e),s.clusterHide&&s.clusterHide()),n._group._featureGroup.addLayer(s))}},function(t){t._addToMap(e)})},_recursivelyRestoreChildPositions:function(e){for(var t=this._markers.length-1;t>=0;t--){var i=this._markers[t];i._backupLatlng&&(i.setLatLng(i._backupLatlng),delete i._backupLatlng)}if(e-1===this._zoom)for(var n=this._childClusters.length-1;n>=0;n--)this._childClusters[n]._restorePosition();else for(var r=this._childClusters.length-1;r>=0;r--)this._childClusters[r]._recursivelyRestoreChildPositions(e)},_restorePosition:function(){this._backupLatlng&&(this.setLatLng(this._backupLatlng),delete this._backupLatlng)},_recursivelyRemoveChildrenFromMap:function(e,t,i,n){var r,s;this._recursively(e,t-1,i-1,function(e){for(s=e._markers.length-1;s>=0;s--)r=e._markers[s],n&&n.contains(r._latlng)||(e._group._featureGroup.removeLayer(r),r.clusterShow&&r.clusterShow())},function(e){for(s=e._childClusters.length-1;s>=0;s--)r=e._childClusters[s],n&&n.contains(r._latlng)||(e._group._featureGroup.removeLayer(r),r.clusterShow&&r.clusterShow())})},_recursively:function(e,t,i,n,r){var s,o,a=this._childClusters,h=this._zoom;if(h>=t&&(n&&n(this),r&&h===i&&r(this)),t>h||i>h)for(s=a.length-1;s>=0;s--)o=a[s],o._boundsNeedUpdate&&o._recalculateBounds(),e.intersects(o._bounds)&&o._recursively(e,t,i,n,r)},_isSingleParent:function(){return this._childClusters.length>0&&this._childClusters[0]._childCount===this._childCount}});L.Marker.include({clusterHide:function(){var e=this.options.opacity;return this.setOpacity(0),this.options.opacity=e,this},clusterShow:function(){return this.setOpacity(this.options.opacity)}}),L.DistanceGrid=function(e){this._cellSize=e,this._sqCellSize=e*e,this._grid={},this._objectPoint={}},L.DistanceGrid.prototype={addObject:function(e,t){var i=this._getCoord(t.x),n=this._getCoord(t.y),r=this._grid,s=r[n]=r[n]||{},o=s[i]=s[i]||[],a=L.Util.stamp(e);this._objectPoint[a]=t,o.push(e)},updateObject:function(e,t){this.removeObject(e),this.addObject(e,t)},removeObject:function(e,t){var i,n,r=this._getCoord(t.x),s=this._getCoord(t.y),o=this._grid,a=o[s]=o[s]||{},h=a[r]=a[r]||[];for(delete this._objectPoint[L.Util.stamp(e)],i=0,n=h.length;n>i;i++)if(h[i]===e)return h.splice(i,1),1===n&&delete a[r],!0},eachObject:function(e,t){var i,n,r,s,o,a,h,l=this._grid;for(i in l){o=l[i];for(n in o)for(a=o[n],r=0,s=a.length;s>r;r++)h=e.call(t,a[r]),h&&(r--,s--)}},getNearObject:function(e){var t,i,n,r,s,o,a,h,l=this._getCoord(e.x),u=this._getCoord(e.y),_=this._objectPoint,d=this._sqCellSize,c=null;for(t=u-1;u+1>=t;t++)if(r=this._grid[t])for(i=l-1;l+1>=i;i++)if(s=r[i])for(n=0,o=s.length;o>n;n++)a=s[n],h=this._sqDist(_[L.Util.stamp(a)],e),(d>h||d>=h&&null===c)&&(d=h,c=a);return c},_getCoord:function(e){var t=Math.floor(e/this._cellSize);return isFinite(t)?t:e},_sqDist:function(e,t){var i=t.x-e.x,n=t.y-e.y;return i*i+n*n}},function(){L.QuickHull={getDistant:function(e,t){var i=t[1].lat-t[0].lat,n=t[0].lng-t[1].lng;return n*(e.lat-t[0].lat)+i*(e.lng-t[0].lng)},findMostDistantPointFromBaseLine:function(e,t){var i,n,r,s=0,o=null,a=[];for(i=t.length-1;i>=0;i--)n=t[i],r=this.getDistant(n,e),r>0&&(a.push(n),r>s&&(s=r,o=n));return{maxPoint:o,newPoints:a}},buildConvexHull:function(e,t){var i=[],n=this.findMostDistantPointFromBaseLine(e,t);return n.maxPoint?(i=i.concat(this.buildConvexHull([e[0],n.maxPoint],n.newPoints)),i=i.concat(this.buildConvexHull([n.maxPoint,e[1]],n.newPoints))):[e[0]]},getConvexHull:function(e){var t,i=!1,n=!1,r=!1,s=!1,o=null,a=null,h=null,l=null,u=null,_=null;for(t=e.length-1;t>=0;t--){var d=e[t];(i===!1||d.lat>i)&&(o=d,i=d.lat),(n===!1||d.latr)&&(h=d,r=d.lng),(s===!1||d.lng=0;t--)e=i[t].getLatLng(),n.push(e);return L.QuickHull.getConvexHull(n)}}),L.MarkerCluster.include({_2PI:2*Math.PI,_circleFootSeparation:25,_circleStartAngle:0,_spiralFootSeparation:28,_spiralLengthStart:11,_spiralLengthFactor:5,_circleSpiralSwitchover:9,spiderfy:function(){if(this._group._spiderfied!==this&&!this._group._inZoomAnimation){var e,t=this.getAllChildMarkers(null,!0),i=this._group,n=i._map,r=n.latLngToLayerPoint(this._latlng);this._group._unspiderfy(),this._group._spiderfied=this,t.length>=this._circleSpiralSwitchover?e=this._generatePointsSpiral(t.length,r):(r.y+=10,e=this._generatePointsCircle(t.length,r)),this._animationSpiderfy(t,e)}},unspiderfy:function(e){this._group._inZoomAnimation||(this._animationUnspiderfy(e),this._group._spiderfied=null)},_generatePointsCircle:function(e,t){var i,n,r=this._group.options.spiderfyDistanceMultiplier*this._circleFootSeparation*(2+e),s=r/this._2PI,o=this._2PI/e,a=[];for(s=Math.max(s,35),a.length=e,i=0;e>i;i++)n=this._circleStartAngle+i*o,a[i]=new L.Point(t.x+s*Math.cos(n),t.y+s*Math.sin(n))._round();return a},_generatePointsSpiral:function(e,t){var i,n=this._group.options.spiderfyDistanceMultiplier,r=n*this._spiralLengthStart,s=n*this._spiralFootSeparation,o=n*this._spiralLengthFactor*this._2PI,a=0,h=[];for(h.length=e,i=e;i>=0;i--)e>i&&(h[i]=new L.Point(t.x+r*Math.cos(a),t.y+r*Math.sin(a))._round()),a+=s/r+5e-4*i,r+=o/a;return h},_noanimationUnspiderfy:function(){var e,t,i=this._group,n=i._map,r=i._featureGroup,s=this.getAllChildMarkers(null,!0);for(i._ignoreMove=!0,this.setOpacity(1),t=s.length-1;t>=0;t--)e=s[t],r.removeLayer(e),e._preSpiderfyLatlng&&(e.setLatLng(e._preSpiderfyLatlng),delete e._preSpiderfyLatlng),e.setZIndexOffset&&e.setZIndexOffset(0),e._spiderLeg&&(n.removeLayer(e._spiderLeg),delete e._spiderLeg);i.fire("unspiderfied",{cluster:this,markers:s}),i._ignoreMove=!1,i._spiderfied=null}}),L.MarkerClusterNonAnimated=L.MarkerCluster.extend({_animationSpiderfy:function(e,t){var i,n,r,s,o=this._group,a=o._map,h=o._featureGroup,l=this._group.options.spiderLegPolylineOptions;for(o._ignoreMove=!0,i=0;i=0;i--)a=u.layerPointToLatLng(t[i]),n=e[i],n._preSpiderfyLatlng=n._latlng,n.setLatLng(a),n.clusterShow&&n.clusterShow(),p&&(r=n._spiderLeg,s=r._path,s.style.strokeDashoffset=0,r.setStyle({opacity:m}));this.setOpacity(.3),l._ignoreMove=!1,setTimeout(function(){l._animationEnd(),l.fire("spiderfied",{cluster:h,markers:e})},200)},_animationUnspiderfy:function(e){var t,i,n,r,s,o,a=this,h=this._group,l=h._map,u=h._featureGroup,_=e?l._latLngToNewLayerPoint(this._latlng,e.zoom,e.center):l.latLngToLayerPoint(this._latlng),d=this.getAllChildMarkers(null,!0),c=L.Path.SVG;for(h._ignoreMove=!0,h._animationStart(),this.setOpacity(1),i=d.length-1;i>=0;i--)t=d[i],t._preSpiderfyLatlng&&(t.closePopup(),t.setLatLng(t._preSpiderfyLatlng),delete t._preSpiderfyLatlng,o=!0,t._setPos&&(t._setPos(_),o=!1),t.clusterHide&&(t.clusterHide(),o=!1),o&&u.removeLayer(t),c&&(n=t._spiderLeg,r=n._path,s=r.getTotalLength()+.1,r.style.strokeDashoffset=s,n.setStyle({opacity:0})));h._ignoreMove=!1,setTimeout(function(){var e=0;for(i=d.length-1;i>=0;i--)t=d[i],t._spiderLeg&&e++;for(i=d.length-1;i>=0;i--)t=d[i],t._spiderLeg&&(t.clusterShow&&t.clusterShow(),t.setZIndexOffset&&t.setZIndexOffset(0),e>1&&u.removeLayer(t),l.removeLayer(t._spiderLeg),delete t._spiderLeg);h._animationEnd(),h.fire("unspiderfied",{cluster:a,markers:d})},200)}}),L.MarkerClusterGroup.include({_spiderfied:null,unspiderfy:function(){this._unspiderfy.apply(this,arguments)},_spiderfierOnAdd:function(){this._map.on("click",this._unspiderfyWrapper,this),this._map.options.zoomAnimation&&this._map.on("zoomstart",this._unspiderfyZoomStart,this),this._map.on("zoomend",this._noanimationUnspiderfy,this),L.Browser.touch||this._map.getRenderer(this)},_spiderfierOnRemove:function(){this._map.off("click",this._unspiderfyWrapper,this),this._map.off("zoomstart",this._unspiderfyZoomStart,this),this._map.off("zoomanim",this._unspiderfyZoomAnim,this),this._map.off("zoomend",this._noanimationUnspiderfy,this),this._noanimationUnspiderfy() +},_unspiderfyZoomStart:function(){this._map&&this._map.on("zoomanim",this._unspiderfyZoomAnim,this)},_unspiderfyZoomAnim:function(e){L.DomUtil.hasClass(this._map._mapPane,"leaflet-touching")||(this._map.off("zoomanim",this._unspiderfyZoomAnim,this),this._unspiderfy(e))},_unspiderfyWrapper:function(){this._unspiderfy()},_unspiderfy:function(e){this._spiderfied&&this._spiderfied.unspiderfy(e)},_noanimationUnspiderfy:function(){this._spiderfied&&this._spiderfied._noanimationUnspiderfy()},_unspiderfyLayer:function(e){e._spiderLeg&&(this._featureGroup.removeLayer(e),e.clusterShow&&e.clusterShow(),e.setZIndexOffset&&e.setZIndexOffset(0),this._map.removeLayer(e._spiderLeg),delete e._spiderLeg)}}),L.MarkerClusterGroup.include({refreshClusters:function(e){return e?e instanceof L.MarkerClusterGroup?e=e._topClusterLevel.getAllChildMarkers():e instanceof L.LayerGroup?e=e._layers:e instanceof L.MarkerCluster?e=e.getAllChildMarkers():e instanceof L.Marker&&(e=[e]):e=this._topClusterLevel.getAllChildMarkers(),this._flagParentsIconsNeedUpdate(e),this._refreshClustersIcons(),this.options.singleMarkerMode&&this._refreshSingleMarkerModeMarkers(e),this},_flagParentsIconsNeedUpdate:function(e){var t,i;for(t in e)for(i=e[t].__parent;i;)i._iconNeedsUpdate=!0,i=i.__parent},_refreshSingleMarkerModeMarkers:function(e){var t,i;for(t in e)i=e[t],this.hasLayer(i)&&i.setIcon(this._overrideMarkerIcon(i))}}),L.Marker.include({refreshIconOptions:function(e,t){var i=this.options.icon;return L.setOptions(i,e),this.setIcon(i),t&&this.__parent&&this.__parent._group.refreshClusters(this),this}}),e.MarkerClusterGroup=t,e.MarkerCluster=i}); +//# sourceMappingURL=leaflet.markercluster.js.map \ No newline at end of file diff --git a/sut/frontend/public/leaflet/marker_cluster/leaflet.markercluster.js.map b/sut/frontend/public/leaflet/marker_cluster/leaflet.markercluster.js.map new file mode 100644 index 0000000..a4b459c --- /dev/null +++ b/sut/frontend/public/leaflet/marker_cluster/leaflet.markercluster.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/MarkerClusterGroup.js","../src/MarkerCluster.js","../src/MarkerOpacity.js","../src/DistanceGrid.js","../src/MarkerCluster.QuickHull.js","../src/MarkerCluster.Spiderfier.js","../src/MarkerClusterGroup.Refresh.js"],"names":[],"mappings":"0PAIO,IAAI,GAAqB,EAAE,mBAAqB,EAAE,aAAa,QAErE,SACC,iBAAkB,GAClB,mBAAoB,KACpB,YAAa,EAAE,OAAO,UAAU,QAAQ,KAExC,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAElB,wBAAyB,KAIzB,4BAA4B,EAK5B,SAAS,EAIT,sBAAsB,EAGtB,2BAA4B,EAG5B,0BAA4B,OAAQ,IAAK,MAAO,OAAQ,QAAS,IAGjE,gBAAgB,EAChB,cAAe,IACf,WAAY,GACZ,cAAe,KAGf,mBAGD,WAAY,SAAU,GACrB,EAAE,KAAK,WAAW,KAAM,GACnB,KAAK,QAAQ,qBACjB,KAAK,QAAQ,mBAAqB,KAAK,4BAGxC,KAAK,cAAgB,EAAE,eACvB,KAAK,cAAc,eAAe,MAElC,KAAK,eAAiB,EAAE,eACxB,KAAK,eAAe,eAAe,MAEnC,KAAK,iBAAmB,EACxB,KAAK,oBACL,KAAK,kBAEL,KAAK,oBAAsB,KAE3B,KAAK,UAEL,KAAK,2BACJ,UAAa,KAAK,sBAClB,KAAQ,KAAK,kBACb,QAAW,KAAK,oBAIjB,IAAI,GAAU,EAAE,QAAQ,YAAc,KAAK,QAAQ,OACnD,GAAE,OAAO,KAAM,EAAU,KAAK,eAAiB,KAAK,cAEpD,KAAK,eAAiB,EAAU,EAAE,cAAgB,EAAE,0BAGrD,SAAU,SAAU,GAEnB,GAAI,YAAiB,GAAE,WACtB,MAAO,MAAK,WAAW,GAIxB,KAAK,EAAM,UAGV,MAFA,MAAK,eAAe,SAAS,GAC7B,KAAK,KAAK,YAAc,MAAO,IACxB,IAGR,KAAK,KAAK,KAGT,MAFA,MAAK,iBAAiB,KAAK,GAC3B,KAAK,KAAK,YAAc,MAAO,IACxB,IAGR,IAAI,KAAK,SAAS,GACjB,MAAO,KAMJ,MAAK,aACR,KAAK,cAGN,KAAK,UAAU,EAAO,KAAK,UAC3B,KAAK,KAAK,YAAc,MAAO,IAG/B,KAAK,iBAAiB,qBAEtB,KAAK,uBAGL,IAAI,GAAe,EACf,EAAc,KAAK,KACvB,IAAI,EAAM,SACT,KAAO,EAAa,SAAS,OAAS,GACrC,EAAe,EAAa,QAW9B,OAPI,MAAK,oBAAoB,SAAS,EAAa,eAC9C,KAAK,QAAQ,qBAChB,KAAK,mBAAmB,EAAO,GAE/B,KAAK,8BAA8B,EAAO,IAGrC,MAGR,YAAa,SAAU,GAEtB,MAAI,aAAiB,GAAE,WACf,KAAK,cAAc,IAItB,EAAM,UAMN,KAAK,KAQL,EAAM,UAIP,KAAK,cACR,KAAK,cACL,KAAK,iBAAiB,IAIvB,KAAK,aAAa,GAAO,GACzB,KAAK,KAAK,eAAiB,MAAO,IAGlC,KAAK,iBAAiB,qBAEtB,KAAK,wBAEL,EAAM,IAAI,KAAK,0BAA2B,MAEtC,KAAK,cAAc,SAAS,KAC/B,KAAK,cAAc,YAAY,GAC3B,EAAM,aACT,EAAM,eAID,MA1BC,OARF,KAAK,aAAa,KAAK,iBAAkB,IAAU,KAAK,SAAS,IACrE,KAAK,eAAe,MAAO,MAAO,EAAO,OAAQ,EAAM,UAExD,KAAK,KAAK,eAAiB,MAAO,IAC3B,OAVP,KAAK,eAAe,YAAY,GAChC,KAAK,KAAK,eAAiB,MAAO,IAC3B,OA0CT,UAAW,SAAU,EAAa,GACjC,IAAK,EAAE,KAAK,QAAQ,GACnB,MAAO,MAAK,SAAS,EAGtB,IAQI,GARA,EAAK,KAAK,cACV,EAAM,KAAK,eACX,EAAU,KAAK,QAAQ,eACvB,EAAgB,KAAK,QAAQ,cAC7B,EAAgB,KAAK,QAAQ,cAC7B,EAAI,EAAY,OAChB,EAAS,EACT,GAAgB,CAGpB,IAAI,KAAK,KAAM,CACd,GAAI,IAAU,GAAK,OAAQ,UACvB,EAAU,EAAE,KAAK,WAEpB,IADA,GAAI,IAAQ,GAAK,OAAQ,UACT,EAAT,EAAY,IAAU,CAC5B,GAAI,GAA4B,IAAjB,EAAS,IAAW,CAElC,GAAI,IAAU,GAAK,OAAQ,UAAY,CACvC,IAAI,EAAU,EACb,MAYF,GARA,EAAI,EAAY,GAQZ,YAAa,GAAE,WACd,IACH,EAAc,EAAY,QAC1B,GAAgB,GAEjB,KAAK,uBAAuB,EAAG,GAC/B,EAAI,EAAY,WAKjB,IAAK,EAAE,WAQP,IAAI,KAAK,SAAS,KAIlB,KAAK,UAAU,EAAG,KAAK,UAClB,GACJ,KAAK,KAAK,YAAc,MAAO,IAI5B,EAAE,UAC8B,IAA/B,EAAE,SAAS,iBAAuB,CACrC,GAAI,GAAU,EAAE,SAAS,qBACrB,EAAc,EAAQ,KAAO,EAAI,EAAQ,GAAK,EAAQ,EAC1D,GAAG,YAAY,QArBhB,GAAI,SAAS,GACR,GACJ,KAAK,KAAK,YAAc,MAAO,IAwB9B,GAEH,EAAc,EAAQ,GAAG,GAAK,OAAQ,UAAY,GAI/C,IAAW,GAGd,KAAK,iBAAiB,qBAEtB,KAAK,wBAEL,KAAK,iBAAiB,6BAA6B,KAAM,KAAK,MAAO,KAAK,sBAE1E,WAAW,EAAS,KAAK,QAAQ,aAEhC,KAEH,SAIA,KAFA,GAAI,GAAkB,KAAK,iBAEX,EAAT,EAAY,IAClB,EAAI,EAAY,GAGZ,YAAa,GAAE,YACd,IACH,EAAc,EAAY,QAC1B,GAAgB,GAEjB,KAAK,uBAAuB,EAAG,GAC/B,EAAI,EAAY,QAKZ,EAAE,UAKH,KAAK,SAAS,IAIlB,EAAgB,KAAK,GARpB,EAAI,SAAS,EAWhB,OAAO,OAIR,aAAc,SAAU,GACvB,GAAI,GAAG,EACH,EAAI,EAAY,OAChB,EAAK,KAAK,cACV,EAAM,KAAK,eACX,GAAgB,CAEpB,KAAK,KAAK,KAAM,CACf,IAAK,EAAI,EAAO,EAAJ,EAAO,IAClB,EAAI,EAAY,GAGZ,YAAa,GAAE,YACd,IACH,EAAc,EAAY,QAC1B,GAAgB,GAEjB,KAAK,uBAAuB,EAAG,GAC/B,EAAI,EAAY,SAIjB,KAAK,aAAa,KAAK,iBAAkB,GACzC,EAAI,YAAY,GACZ,KAAK,SAAS,IACjB,KAAK,eAAe,MAAO,MAAO,EAAG,OAAQ,EAAE,UAEhD,KAAK,KAAK,eAAiB,MAAO,IAEnC,OAAO,MAGR,GAAI,KAAK,YAAa,CACrB,KAAK,aAGL,IAAI,GAAe,EAAY,QAC3B,EAAK,CACT,KAAK,EAAI,EAAO,EAAJ,EAAQ,IACnB,EAAI,EAAa,GAGb,YAAa,GAAE,YAClB,KAAK,uBAAuB,EAAG,GAC/B,EAAK,EAAa,QAInB,KAAK,iBAAiB,GAIxB,IAAK,EAAI,EAAO,EAAJ,EAAO,IAClB,EAAI,EAAY,GAGZ,YAAa,GAAE,YACd,IACH,EAAc,EAAY,QAC1B,GAAgB,GAEjB,KAAK,uBAAuB,EAAG,GAC/B,EAAI,EAAY,QAIZ,EAAE,UAMP,KAAK,aAAa,GAAG,GAAM,GAC3B,KAAK,KAAK,eAAiB,MAAO,IAE9B,EAAG,SAAS,KACf,EAAG,YAAY,GACX,EAAE,aACL,EAAE,iBAXH,EAAI,YAAY,GAChB,KAAK,KAAK,eAAiB,MAAO,IAuBpC,OAPA,MAAK,iBAAiB,qBAEtB,KAAK,wBAGL,KAAK,iBAAiB,6BAA6B,KAAM,KAAK,MAAO,KAAK,qBAEnE,MAIR,YAAa,WA6BZ,MAzBK,MAAK,OACT,KAAK,oBACL,KAAK,wBACE,MAAK,oBACL,MAAK,kBAGT,KAAK,wBACR,KAAK,yBAIN,KAAK,cAAc,cACnB,KAAK,eAAe,cAEpB,KAAK,UAAU,SAAU,GACxB,EAAO,IAAI,KAAK,0BAA2B,YACpC,GAAO,UACZ,MAEC,KAAK,MAER,KAAK,2BAGC,MAIR,UAAW,WACV,GAAI,GAAS,GAAI,GAAE,YAEf,MAAK,kBACR,EAAO,OAAO,KAAK,iBAAiB,QAGrC,KAAK,GAAI,GAAI,KAAK,iBAAiB,OAAS,EAAG,GAAK,EAAG,IACtD,EAAO,OAAO,KAAK,iBAAiB,GAAG,YAKxC,OAFA,GAAO,OAAO,KAAK,eAAe,aAE3B,GAIR,UAAW,SAAU,EAAQ,GAC5B,GAEC,GAAmB,EAAG,EAFnB,EAAU,KAAK,iBAAiB,QACnC,EAAgB,KAAK,cAOtB,KAJI,KAAK,kBACR,KAAK,iBAAiB,mBAAmB,GAGrC,EAAI,EAAQ,OAAS,EAAG,GAAK,EAAG,IAAK,CAGzC,IAFA,GAAoB,EAEf,EAAI,EAAc,OAAS,EAAG,GAAK,EAAG,IAC1C,GAAI,EAAc,GAAG,QAAU,EAAQ,GAAI,CAC1C,GAAoB,CACpB,OAIE,GACH,EAAO,KAAK,EAAS,EAAQ,IAI/B,KAAK,eAAe,UAAU,EAAQ,IAIvC,UAAW,WACV,GAAI,KAIJ,OAHA,MAAK,UAAU,SAAU,GACxB,EAAO,KAAK,KAEN,GAIR,SAAU,SAAU,GACnB,GAAI,GAAS,IAUb,OARA,GAAK,SAAS,EAAI,IAElB,KAAK,UAAU,SAAU,GACpB,EAAE,MAAM,KAAO,IAClB,EAAS,KAIJ,GAIR,SAAU,SAAU,GACnB,IAAK,EACJ,OAAO,CAGR,IAAI,GAAG,EAAU,KAAK,gBAEtB,KAAK,EAAI,EAAQ,OAAS,EAAG,GAAK,EAAG,IACpC,GAAI,EAAQ,KAAO,EAClB,OAAO,CAKT,KADA,EAAU,KAAK,eACV,EAAI,EAAQ,OAAS,EAAG,GAAK,EAAG,IACpC,GAAI,EAAQ,GAAG,QAAU,EACxB,OAAO,CAIT,UAAU,EAAM,UAAY,EAAM,SAAS,SAAW,OAAS,KAAK,eAAe,SAAS,IAI7F,gBAAiB,SAAU,EAAO,GAET,kBAAb,KACV,EAAW,aAGZ,IAAI,GAAa,YACX,EAAM,QAAS,EAAM,SAAS,OAAW,KAAK,mBAClD,KAAK,KAAK,IAAI,UAAW,EAAY,MACrC,KAAK,IAAI,eAAgB,EAAY,MAEjC,EAAM,MACT,IACU,EAAM,SAAS,QACzB,KAAK,KAAK,aAAc,EAAU,MAClC,EAAM,SAAS,aAKd,GAAM,OAAS,KAAK,KAAK,YAAY,SAAS,EAAM,aAEvD,IACU,EAAM,SAAS,MAAQ,KAAK,MAAM,KAAK,KAAK,QAEtD,KAAK,KAAK,GAAG,UAAW,EAAY,MACpC,KAAK,KAAK,MAAM,EAAM,eAEtB,KAAK,KAAK,GAAG,UAAW,EAAY,MACpC,KAAK,GAAG,eAAgB,EAAY,MACpC,EAAM,SAAS,iBAKjB,MAAO,SAAU,GAChB,KAAK,KAAO,CACZ,IAAI,GAAG,EAAG,CAEV,KAAK,SAAS,KAAK,KAAK,cACvB,KAAM,8BAaP,KAVA,KAAK,cAAc,MAAM,GACzB,KAAK,eAAe,MAAM,GAErB,KAAK,eACT,KAAK,2BAGN,KAAK,QAAU,EAAI,QAAQ,IAAI,WAAW,aAGrC,EAAI,EAAG,EAAI,KAAK,eAAe,OAAY,EAAJ,EAAO,IAClD,EAAQ,KAAK,eAAe,GAC5B,EAAM,UAAY,EAAM,MAAM,QAC9B,EAAM,MAAM,QAAU,EAAM,MAG7B,KAAK,EAAI,EAAG,EAAI,KAAK,eAAe,OAAY,EAAJ,EAAO,IAClD,EAAQ,KAAK,eAAe,GAC5B,KAAK,aAAa,EAAM,OAAO,GAC/B,EAAM,MAAM,QAAU,EAAM,SAE7B,MAAK,kBAGL,KAAK,MAAQ,KAAK,MAAM,KAAK,KAAK,OAClC,KAAK,oBAAsB,KAAK,4BAEhC,KAAK,KAAK,GAAG,UAAW,KAAK,SAAU,MACvC,KAAK,KAAK,GAAG,UAAW,KAAK,SAAU,MAEnC,KAAK,kBACR,KAAK,mBAGN,KAAK,cAGL,EAAI,KAAK,iBACT,KAAK,oBACL,KAAK,UAAU,GAAG,IAInB,SAAU,SAAU,GACnB,EAAI,IAAI,UAAW,KAAK,SAAU,MAClC,EAAI,IAAI,UAAW,KAAK,SAAU,MAElC,KAAK,gBAGL,KAAK,KAAK,SAAS,UAAY,KAAK,KAAK,SAAS,UAAU,QAAQ,wBAAyB,IAEzF,KAAK,qBACR,KAAK,4BAGC,MAAK,QAGZ,KAAK,gBACL,KAAK,cAAc,SACnB,KAAK,eAAe,SAEpB,KAAK,cAAc,cAEnB,KAAK,KAAO,MAGb,iBAAkB,SAAU,GAE3B,IADA,GAAI,GAAU,EACP,IAAY,EAAQ,OAC1B,EAAU,EAAQ,QAEnB,OAAO,IAAW,MAInB,aAAc,SAAU,EAAS,GAChC,IAAK,GAAI,GAAI,EAAQ,OAAS,EAAG,GAAK,EAAG,IACxC,GAAI,EAAQ,KAAO,EAElB,MADA,GAAQ,OAAO,EAAG,IACX,GAWV,2BAA4B,SAAU,EAAQ,GAK7C,IAJA,GAAI,GAAM,KAAK,KACX,EAAkB,KAAK,iBAC1B,EAAU,KAAK,MAAM,KAAK,KAAK,cAEzB,GAAK,GACN,EAAgB,GAAG,aAAa,EAAQ,EAAI,QAAQ,EAAO,YAAa,IADzD,OAOtB,sBAAuB,SAAU,GAChC,EAAE,OAAO,YAAc,EAAE,OAAO,SAGjC,kBAAmB,SAAU,GAC5B,IAAK,KAAK,cAAgB,EAAE,OAAO,YAAa,CAC/C,GAAI,GAAc,EAAE,OAAO,QAAU,EAAE,OAAO,OAAO,QAErD,MAAK,WAAW,EAAE,OAAQ,EAAE,UAAW,EAAE,QAErC,GACH,EAAE,OAAO,cAKZ,WAAY,SAAU,EAAO,EAAM,GAClC,EAAM,QAAU,EAChB,KAAK,YAAY,GAEjB,EAAM,QAAU,EAChB,KAAK,SAAS,IAGf,oBAAqB,SAAU,GAC9B,GAAI,GAAY,EAAE,OAAO,kBAClB,GAAE,OAAO,YACZ,GACH,KAAK,WAAW,EAAE,OAAQ,EAAW,EAAE,OAAO,UAOhD,aAAc,SAAU,EAAQ,EAAwB,GACvD,GAAI,GAAe,KAAK,cACvB,EAAkB,KAAK,iBACvB,EAAK,KAAK,cACV,EAAM,KAAK,KACX,EAAU,KAAK,MAAM,KAAK,KAAK,aAG5B,IACH,KAAK,2BAA2B,EAAQ,KAAK,SAI9C,IAEC,GAFG,EAAU,EAAO,SACpB,EAAU,EAAQ,QAMnB,KAFA,KAAK,aAAa,EAAS,GAEpB,IACN,EAAQ,cACR,EAAQ,mBAAoB,IAExB,EAAQ,MAAQ,KAGT,GAA0B,EAAQ,aAAe,GAE3D,EAAc,EAAQ,SAAS,KAAO,EAAS,EAAQ,SAAS,GAAK,EAAQ,SAAS,GAGtF,EAAa,EAAQ,OAAO,aAAa,EAAS,EAAI,QAAQ,EAAQ,SAAU,EAAQ,QACxF,EAAgB,EAAQ,OAAO,UAAU,EAAa,EAAI,QAAQ,EAAY,YAAa,EAAQ,QAGnG,KAAK,aAAa,EAAQ,SAAS,eAAgB,GACnD,EAAQ,SAAS,SAAS,KAAK,GAC/B,EAAY,SAAW,EAAQ,SAE3B,EAAQ,QAEX,EAAG,YAAY,GACV,GACJ,EAAG,SAAS,KAId,EAAQ,kBAAmB,EAG5B,EAAU,EAAQ,eAGZ,GAAO,UAGf,cAAe,SAAU,EAAI,GAC5B,KAAO,GAAK,CACX,GAAI,IAAO,EACV,OAAO,CAER,GAAM,EAAI,WAEX,OAAO,GAIR,KAAM,SAAU,EAAM,EAAM,GAC3B,GAAI,GAAQ,EAAK,gBAAiB,GAAE,cAAe,CAElD,GAAI,EAAK,eAAiB,KAAK,cAAc,EAAK,MAAM,MAAO,EAAK,cAAc,eACjF,MAED,GAAO,UAAY,EAGpB,EAAE,aAAa,UAAU,KAAK,KAAK,KAAM,EAAM,EAAM,IAItD,QAAS,SAAU,EAAM,GACxB,MAAO,GAAE,aAAa,UAAU,QAAQ,KAAK,KAAM,EAAM,IAAc,EAAE,aAAa,UAAU,QAAQ,KAAK,KAAM,UAAY,EAAM,IAItI,2BAA4B,SAAU,GACrC,GAAI,GAAa,EAAQ,gBAErB,EAAI,kBASR,OAPC,IADgB,GAAb,EACE,QACkB,IAAb,EACL,SAEA,QAGC,GAAI,GAAE,SAAU,KAAM,cAAgB,EAAa,gBAAiB,UAAW,iBAAmB,EAAG,SAAU,GAAI,GAAE,MAAM,GAAI,OAGvI,YAAa,WACZ,GAAI,GAAM,KAAK,KACX,EAAoB,KAAK,QAAQ,kBACjC,EAAsB,KAAK,QAAQ,oBACnC,EAAsB,KAAK,QAAQ,qBAGnC,GAAqB,IACxB,KAAK,GAAG,eAAgB,KAAK,gBAAiB,MAI3C,IACH,KAAK,GAAG,mBAAoB,KAAK,cAAe,MAChD,KAAK,GAAG,kBAAmB,KAAK,cAAe,MAC/C,EAAI,GAAG,UAAW,KAAK,cAAe,QAIxC,gBAAiB,SAAU,GAI1B,IAHA,GAAI,GAAU,EAAE,MACZ,EAAgB,EAE2B,IAAxC,EAAc,eAAe,QACnC,EAAgB,EAAc,eAAe,EAG1C,GAAc,QAAU,KAAK,UAChC,EAAc,cAAgB,EAAQ,aACtC,KAAK,QAAQ,kBAGb,EAAQ,WACE,KAAK,QAAQ,qBACvB,EAAQ,eAIL,EAAE,eAA6C,KAA5B,EAAE,cAAc,SACtC,KAAK,KAAK,WAAW,SAIvB,cAAe,SAAU,GACxB,GAAI,GAAM,KAAK,IACX,MAAK,mBAGL,KAAK,eACR,EAAI,YAAY,KAAK,eAElB,EAAE,MAAM,gBAAkB,GAAK,EAAE,QAAU,KAAK,cACnD,KAAK,cAAgB,GAAI,GAAE,QAAQ,EAAE,MAAM,gBAAiB,KAAK,QAAQ,gBACzE,EAAI,SAAS,KAAK,kBAIpB,cAAe,WACV,KAAK,gBACR,KAAK,KAAK,YAAY,KAAK,eAC3B,KAAK,cAAgB,OAIvB,cAAe,WACd,GAAI,GAAoB,KAAK,QAAQ,kBACpC,EAAsB,KAAK,QAAQ,oBACnC,EAAsB,KAAK,QAAQ,oBACnC,EAAM,KAAK,MAER,GAAqB,IACxB,KAAK,IAAI,eAAgB,KAAK,gBAAiB,MAE5C,IACH,KAAK,IAAI,mBAAoB,KAAK,cAAe,MACjD,KAAK,IAAI,kBAAmB,KAAK,cAAe,MAChD,EAAI,IAAI,UAAW,KAAK,cAAe,QAIzC,SAAU,WACJ,KAAK,OAGV,KAAK,sBAEL,KAAK,MAAQ,KAAK,MAAM,KAAK,KAAK,OAClC,KAAK,oBAAsB,KAAK,8BAGjC,SAAU,WACT,IAAI,KAAK,iBAAT,CAIA,GAAI,GAAY,KAAK,2BAErB,MAAK,iBAAiB,kCAAkC,KAAK,oBAAqB,KAAK,MAAM,KAAK,KAAK,cAAe,KAAK,MAAO,GAClI,KAAK,iBAAiB,6BAA6B,KAAM,KAAK,MAAM,KAAK,KAAK,OAAQ,GAEtF,KAAK,oBAAsB,IAI5B,yBAA0B,WACzB,GAAI,GAAU,KAAK,KAAK,KAAK,KAAK,cACjC,EAAU,KAAK,MAAM,KAAK,KAAK,cAC/B,EAAS,KAAK,QAAQ,iBACtB,EAAW,CAKU,mBAAX,KACV,EAAW,WAAc,MAAO,KAGY,OAAzC,KAAK,QAAQ,0BAChB,EAAU,KAAK,QAAQ,wBAA0B,GAElD,KAAK,SAAW,EAChB,KAAK,iBACL,KAAK,mBAGL,KAAK,GAAI,GAAO,EAAS,GAAQ,EAAS,IACzC,KAAK,cAAc,GAAQ,GAAI,GAAE,aAAa,EAAS,IACvD,KAAK,iBAAiB,GAAQ,GAAI,GAAE,aAAa,EAAS,GAI3D,MAAK,iBAAmB,GAAI,MAAK,eAAe,KAAM,EAAU,IAIjE,UAAW,SAAU,EAAO,GAC3B,GAGI,GAAa,EAHb,EAAe,KAAK,cACpB,EAAkB,KAAK,iBAC1B,EAAU,KAAK,MAAM,KAAK,KAAK,aAUhC,KAPI,KAAK,QAAQ,kBAChB,KAAK,oBAAoB,GAG1B,EAAM,GAAG,KAAK,0BAA2B,MAGlC,GAAQ,EAAS,IAAQ,CAC/B,EAAc,KAAK,KAAK,QAAQ,EAAM,YAAa,EAGnD,IAAI,GAAU,EAAa,GAAM,cAAc,EAC/C,IAAI,EAGH,MAFA,GAAQ,UAAU,GAClB,EAAM,SAAW,EACjB,MAKD,IADA,EAAU,EAAgB,GAAM,cAAc,GACjC,CACZ,GAAI,GAAS,EAAQ,QACjB,IACH,KAAK,aAAa,GAAS,EAK5B,IAAI,GAAa,GAAI,MAAK,eAAe,KAAM,EAAM,EAAS,EAC9D,GAAa,GAAM,UAAU,EAAY,KAAK,KAAK,QAAQ,EAAW,SAAU,IAChF,EAAQ,SAAW,EACnB,EAAM,SAAW,CAGjB,IAAI,GAAa,CACjB,KAAK,EAAI,EAAO,EAAG,EAAI,EAAO,MAAO,IACpC,EAAa,GAAI,MAAK,eAAe,KAAM,EAAG,GAC9C,EAAa,GAAG,UAAU,EAAY,KAAK,KAAK,QAAQ,EAAQ,YAAa,GAO9E,OALA,GAAO,UAAU,GAGjB,KAAK,2BAA2B,EAAS,GAEzC,OAID,EAAgB,GAAM,UAAU,EAAO,GAIxC,KAAK,iBAAiB,UAAU,GAChC,EAAM,SAAW,KAAK,kBASvB,sBAAuB,WACtB,KAAK,cAAc,UAAU,SAAU,GAClC,YAAa,GAAE,eAAiB,EAAE,kBACrC,EAAE,iBAML,SAAU,SAAU,GACnB,KAAK,OAAO,KAAK,GACZ,KAAK,gBACT,KAAK,cAAgB,WAAW,EAAE,KAAK,KAAK,cAAe,MAAO,OAGpE,cAAe,WACd,IAAK,GAAI,GAAI,EAAG,EAAI,KAAK,OAAO,OAAQ,IACvC,KAAK,OAAO,GAAG,KAAK,KAErB,MAAK,OAAO,OAAS,EACrB,aAAa,KAAK,eAClB,KAAK,cAAgB,MAItB,oBAAqB,WACpB,GAAI,GAAU,KAAK,MAAM,KAAK,KAAK,MAGnC,MAAK,gBAED,KAAK,MAAQ,GAAW,KAAK,oBAAoB,WAAW,KAAK,8BACpE,KAAK,kBAEL,KAAK,iBAAiB,kCAAkC,KAAK,oBAAqB,KAAK,MAAM,KAAK,KAAK,cAAe,KAAK,MAAO,KAAK,6BAEvI,KAAK,iBAAiB,KAAK,MAAO,IAExB,KAAK,MAAQ,GACvB,KAAK,kBAEL,KAAK,kBAAkB,KAAK,MAAO,IAEnC,KAAK,YAKP,0BAA2B,WAC1B,MAAK,MAAK,QAAQ,2BAEP,EAAE,QAAQ,OACb,KAAK,mBAAmB,KAAK,KAAK,aAGnC,KAAK,mBAAmB,KAAK,KAAK,YAAY,IAAI,IALjD,KAAK,oBAkBd,mBAAoB,SAAU,GAC7B,GAAI,GAAS,KAAK,OAWlB,OATe,UAAX,IACC,EAAO,YAAc,IACxB,EAAO,WAAW,IAAM,KAErB,EAAO,aAAe,IACzB,EAAO,WAAW,KAAO,MAIpB,GAIR,8BAA+B,SAAU,EAAO,GAC/C,GAAI,IAAe,EAClB,KAAK,cAAc,SAAS,OACtB,IAA+B,IAA3B,EAAW,YAAmB,CACxC,EAAW,WAEX,IAAI,GAAU,EAAW,oBACzB,MAAK,cAAc,YAAY,EAAQ,IACvC,KAAK,cAAc,YAAY,EAAQ,QAEvC,GAAW,eAWb,uBAAwB,SAAU,EAAO,GACxC,GAEI,GAFA,EAAS,EAAM,YACf,EAAI,CAKR,KAFA,EAAS,MAEF,EAAI,EAAO,OAAQ,IACzB,EAAQ,EAAO,GAEX,YAAiB,GAAE,WACtB,KAAK,uBAAuB,EAAO,GAIpC,EAAO,KAAK,EAGb,OAAO,IASR,oBAAqB,SAAU,GAC9B,GAAI,GAAO,EAAM,QAAQ,KAAO,KAAK,QAAQ,oBAC5C,cAAe,WACd,MAAO,IAER,mBAAoB,WACnB,OAAQ,KAIV,OAAO,KAKT,GAAE,mBAAmB,SACpB,mBAAoB,GAAI,GAAE,aAAa,GAAI,GAAE,QAAQ,KAAW,KAAW,GAAI,GAAE,OAAO,IAAU,QAGnG,EAAE,mBAAmB,SACpB,cAEC,gBAAiB,aAGjB,iBAAkB,SAAU,EAAmB,GAC9C,KAAK,iBAAiB,kCAAkC,KAAK,oBAAqB,KAAK,MAAM,KAAK,KAAK,cAAe,GACtH,KAAK,iBAAiB,6BAA6B,KAAM,EAAc,KAAK,6BAG5E,KAAK,KAAK,iBAEX,kBAAmB,SAAU,EAAmB,GAC/C,KAAK,iBAAiB,kCAAkC,KAAK,oBAAqB,KAAK,MAAM,KAAK,KAAK,cAAe,GACtH,KAAK,iBAAiB,6BAA6B,KAAM,EAAc,KAAK,6BAG5E,KAAK,KAAK,iBAEX,mBAAoB,SAAU,EAAO,GACpC,KAAK,8BAA8B,EAAO,KAI5C,gBAEC,gBAAiB,WAChB,KAAK,KAAK,SAAS,WAAa,wBAChC,KAAK,oBAGN,iBAAkB,SAAU,EAAmB,GAC9C,GAGI,GAHA,EAAS,KAAK,4BACd,EAAK,KAAK,cACb,EAAU,KAAK,MAAM,KAAK,KAAK,aAGhC,MAAK,aAAc,EAGnB,KAAK,iBAAiB,aAAa,EAAQ,EAAmB,EAAS,SAAU,GAChF,GAEI,GAFA,EAAW,EAAE,QACb,EAAW,EAAE,QAkBjB,KAfK,EAAO,SAAS,KACpB,EAAW,MAGR,EAAE,mBAAqB,EAAoB,IAAM,GACpD,EAAG,YAAY,GACf,EAAE,6BAA6B,KAAM,EAAc,KAGnD,EAAE,cACF,EAAE,6BAA6B,EAAU,EAAc,IAKnD,EAAI,EAAQ,OAAS,EAAG,GAAK,EAAG,IACpC,EAAI,EAAQ,GACP,EAAO,SAAS,EAAE,UACtB,EAAG,YAAY,KAMlB,KAAK,eAGL,KAAK,iBAAiB,0BAA0B,EAAQ,GAExD,EAAG,UAAU,SAAU,GAChB,YAAa,GAAE,gBAAkB,EAAE,OACxC,EAAE,gBAKJ,KAAK,iBAAiB,aAAa,EAAQ,EAAmB,EAAc,SAAU,GACrF,EAAE,kCAAkC,KAGrC,KAAK,aAAc,EAGnB,KAAK,SAAS,WAEb,KAAK,iBAAiB,aAAa,EAAQ,EAAmB,EAAS,SAAU,GAChF,EAAG,YAAY,GACf,EAAE,gBAGH,KAAK,mBAIP,kBAAmB,SAAU,EAAmB,GAC/C,KAAK,wBAAwB,KAAK,iBAAkB,EAAoB,EAAG,GAG3E,KAAK,iBAAiB,6BAA6B,KAAM,EAAc,KAAK,6BAE5E,KAAK,iBAAiB,kCAAkC,KAAK,oBAAqB,KAAK,MAAM,KAAK,KAAK,cAAe,EAAmB,KAAK,8BAG/I,mBAAoB,SAAU,EAAO,GACpC,GAAI,GAAK,KACL,EAAK,KAAK,aAEd,GAAG,SAAS,GACR,IAAe,IACd,EAAW,YAAc,GAE5B,EAAW,cACX,KAAK,eACL,KAAK,kBAEL,EAAM,QAAQ,KAAK,KAAK,mBAAmB,EAAW,cACtD,EAAM,cAEN,KAAK,SAAS,WACb,EAAG,YAAY,GACf,EAAM,cAEN,EAAG,oBAIJ,KAAK,eAEL,EAAG,kBACH,EAAG,wBAAwB,EAAY,KAAK,KAAK,aAAc,KAAK,WAOxE,wBAAyB,SAAU,EAAS,EAAmB,GAC9D,GAAI,GAAS,KAAK,4BACjB,EAAU,KAAK,MAAM,KAAK,KAAK,aAGhC,GAAQ,6CAA6C,EAAQ,EAAS,EAAoB,EAAG,EAE7F,IAAI,GAAK,IAGT,MAAK,eACL,EAAQ,0BAA0B,EAAQ,GAI1C,KAAK,SAAS,WAGb,GAA4B,IAAxB,EAAQ,YAAmB,CAC9B,GAAI,GAAI,EAAQ,SAAS,EAEzB,MAAK,aAAc,EACnB,EAAE,UAAU,EAAE,aACd,KAAK,aAAc,EACf,EAAE,aACL,EAAE,kBAGH,GAAQ,aAAa,EAAQ,EAAc,EAAS,SAAU,GAC7D,EAAE,kCAAkC,EAAQ,EAAS,EAAoB,IAG3E,GAAG,mBAIL,cAAe,WACV,KAAK,OACR,KAAK,KAAK,SAAS,UAAY,KAAK,KAAK,SAAS,UAAU,QAAQ,wBAAyB,KAE9F,KAAK,mBACL,KAAK,KAAK,iBAKX,aAAc,WAIb,EAAE,KAAK,QAAQ,SAAS,KAAK,gBAI/B,EAAE,mBAAqB,SAAU,GAChC,MAAO,IAAI,GAAE,mBAAmB,GC51C1B,IAAI,GAAgB,EAAE,cAAgB,EAAE,OAAO,QACrD,QAAS,EAAE,KAAK,UAAU,QAE1B,WAAY,SAAU,EAAO,EAAM,EAAG,GAErC,EAAE,OAAO,UAAU,WAAW,KAAK,KAAM,EAAK,EAAE,UAAY,EAAE,YAAe,GAAI,GAAE,OAAO,EAAG,IACjF,KAAM,KAAM,KAAM,EAAM,QAAQ,cAE5C,KAAK,OAAS,EACd,KAAK,MAAQ,EAEb,KAAK,YACL,KAAK,kBACL,KAAK,YAAc,EACnB,KAAK,kBAAmB,EACxB,KAAK,mBAAoB,EAEzB,KAAK,QAAU,GAAI,GAAE,aAEjB,GACH,KAAK,UAAU,GAEZ,GACH,KAAK,UAAU,IAKjB,mBAAoB,SAAU,EAAc,GAC3C,EAAe,KAEf,KAAK,GAAI,GAAI,KAAK,eAAe,OAAS,EAAG,GAAK,EAAG,IACpD,KAAK,eAAe,GAAG,mBAAmB,EAG3C,KAAK,GAAI,GAAI,KAAK,SAAS,OAAS,EAAG,GAAK,EAAG,IAC1C,GAAuB,KAAK,SAAS,GAAG,aAG5C,EAAa,KAAK,KAAK,SAAS,GAGjC,OAAO,IAIR,cAAe,WACd,MAAO,MAAK,aAIb,aAAc,SAAU,GASvB,IARA,GAKC,GALG,EAAgB,KAAK,eAAe,QACvC,EAAM,KAAK,OAAO,KAClB,EAAa,EAAI,cAAc,KAAK,SACpC,EAAO,KAAK,MAAQ,EACpB,EAAU,EAAI,UAIR,EAAc,OAAS,GAAK,EAAa,GAAM,CACrD,GACA,IAAI,KACJ,KAAK,EAAI,EAAG,EAAI,EAAc,OAAQ,IACrC,EAAc,EAAY,OAAO,EAAc,GAAG,eAEnD,GAAgB,EAGb,EAAa,EAChB,KAAK,OAAO,KAAK,QAAQ,KAAK,QAAS,GACf,GAAd,EACV,KAAK,OAAO,KAAK,QAAQ,KAAK,QAAS,EAAU,GAEjD,KAAK,OAAO,KAAK,UAAU,KAAK,QAAS,IAI3C,UAAW,WACV,GAAI,GAAS,GAAI,GAAE,YAEnB,OADA,GAAO,OAAO,KAAK,SACZ,GAGR,YAAa,WACZ,KAAK,kBAAmB,EACpB,KAAK,OACR,KAAK,QAAQ,OAKf,WAAY,WAKX,MAJI,MAAK,mBACR,KAAK,SAAW,KAAK,OAAO,QAAQ,mBAAmB,MACvD,KAAK,kBAAmB,GAElB,KAAK,SAAS,cAEtB,aAAc,WACb,MAAO,MAAK,SAAS,gBAItB,UAAW,SAAU,EAAM,GAE1B,KAAK,kBAAmB,EAExB,KAAK,mBAAoB,EACzB,KAAK,kBAAkB,GAEnB,YAAgB,GAAE,eAChB,IACJ,KAAK,eAAe,KAAK,GACzB,EAAK,SAAW,MAEjB,KAAK,aAAe,EAAK,cAEpB,GACJ,KAAK,SAAS,KAAK,GAEpB,KAAK,eAGF,KAAK,UACR,KAAK,SAAS,UAAU,GAAM,IAShC,kBAAmB,SAAU,GACvB,KAAK,WAET,KAAK,SAAW,EAAM,UAAY,EAAM,UAU1C,aAAc,WACb,GAAI,GAAS,KAAK,OAEd,GAAO,aACV,EAAO,WAAW,IAAM,IACxB,EAAO,WAAW,IAAM,KAErB,EAAO,aACV,EAAO,WAAW,KAAO,IACzB,EAAO,WAAW,KAAO,MAI3B,mBAAoB,WACnB,GAKI,GAAG,EAAO,EAAa,EALvB,EAAU,KAAK,SACf,EAAgB,KAAK,eACrB,EAAS,EACT,EAAS,EACT,EAAa,KAAK,WAItB,IAAmB,IAAf,EAAJ,CAQA,IAHA,KAAK,eAGA,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAC/B,EAAc,EAAQ,GAAG,QAEzB,KAAK,QAAQ,OAAO,GAEpB,GAAU,EAAY,IACtB,GAAU,EAAY,GAIvB,KAAK,EAAI,EAAG,EAAI,EAAc,OAAQ,IACrC,EAAQ,EAAc,GAGlB,EAAM,mBACT,EAAM,qBAGP,KAAK,QAAQ,OAAO,EAAM,SAE1B,EAAc,EAAM,SACpB,EAAa,EAAM,YAEnB,GAAU,EAAY,IAAM,EAC5B,GAAU,EAAY,IAAM,CAG7B,MAAK,QAAU,KAAK,SAAW,GAAI,GAAE,OAAO,EAAS,EAAY,EAAS,GAG1E,KAAK,mBAAoB,IAI1B,UAAW,SAAU,GAChB,IACH,KAAK,cAAgB,KAAK,QAC1B,KAAK,UAAU,IAEhB,KAAK,OAAO,cAAc,SAAS,OAGpC,8BAA+B,SAAU,EAAQ,EAAQ,GACxD,KAAK,aAAa,EAAQ,KAAK,OAAO,KAAK,aAAc,EAAU,EAClE,SAAU,GACT,GACC,GAAG,EADA,EAAU,EAAE,QAEhB,KAAK,EAAI,EAAQ,OAAS,EAAG,GAAK,EAAG,IACpC,EAAI,EAAQ,GAGR,EAAE,QACL,EAAE,QAAQ,GACV,EAAE,gBAIL,SAAU,GACT,GACC,GAAG,EADA,EAAgB,EAAE,cAEtB,KAAK,EAAI,EAAc,OAAS,EAAG,GAAK,EAAG,IAC1C,EAAK,EAAc,GACf,EAAG,QACN,EAAG,QAAQ,GACX,EAAG,kBAOR,6CAA8C,SAAU,EAAQ,EAAY,EAAmB,GAC9F,KAAK,aAAa,EAAQ,EAAc,EACvC,SAAU,GACT,EAAE,8BAA8B,EAAQ,EAAE,OAAO,KAAK,mBAAmB,EAAE,aAAa,QAAS,GAI7F,EAAE,mBAAqB,EAAoB,IAAM,GACpD,EAAE,cACF,EAAE,kCAAkC,EAAQ,EAAY,IAExD,EAAE,cAGH,EAAE,eAKL,0BAA2B,SAAU,EAAQ,GAC5C,KAAK,aAAa,EAAQ,KAAK,OAAO,KAAK,aAAc,EAAW,KAAM,SAAU,GACnF,EAAE,iBAIJ,6BAA8B,SAAU,EAAU,EAAW,GAC5D,KAAK,aAAa,EAAQ,KAAK,OAAO,KAAK,aAAe,EAAG,EAC5D,SAAU,GACT,GAAI,IAAc,EAAE,MAKpB,IAAK,GAAI,GAAI,EAAE,SAAS,OAAS,EAAG,GAAK,EAAG,IAAK,CAChD,GAAI,GAAK,EAAE,SAAS,EAEf,GAAO,SAAS,EAAG,WAIpB,IACH,EAAG,cAAgB,EAAG,YAEtB,EAAG,UAAU,GACT,EAAG,aACN,EAAG,eAIL,EAAE,OAAO,cAAc,SAAS,MAGlC,SAAU,GACT,EAAE,UAAU,MAKf,kCAAmC,SAAU,GAE5C,IAAK,GAAI,GAAI,KAAK,SAAS,OAAS,EAAG,GAAK,EAAG,IAAK,CACnD,GAAI,GAAK,KAAK,SAAS,EACnB,GAAG,gBACN,EAAG,UAAU,EAAG,qBACT,GAAG,eAIZ,GAAI,EAAY,IAAM,KAAK,MAE1B,IAAK,GAAI,GAAI,KAAK,eAAe,OAAS,EAAG,GAAK,EAAG,IACpD,KAAK,eAAe,GAAG,uBAGxB,KAAK,GAAI,GAAI,KAAK,eAAe,OAAS,EAAG,GAAK,EAAG,IACpD,KAAK,eAAe,GAAG,kCAAkC,IAK5D,iBAAkB,WACb,KAAK,gBACR,KAAK,UAAU,KAAK,qBACb,MAAK,gBAKd,kCAAmC,SAAU,EAAgB,EAAY,EAAW,GACnF,GAAI,GAAG,CACP,MAAK,aAAa,EAAgB,EAAa,EAAG,EAAY,EAC7D,SAAU,GAET,IAAK,EAAI,EAAE,SAAS,OAAS,EAAG,GAAK,EAAG,IACvC,EAAI,EAAE,SAAS,GACV,GAAiB,EAAa,SAAS,EAAE,WAC7C,EAAE,OAAO,cAAc,YAAY,GAC/B,EAAE,aACL,EAAE,gBAKN,SAAU,GAET,IAAK,EAAI,EAAE,eAAe,OAAS,EAAG,GAAK,EAAG,IAC7C,EAAI,EAAE,eAAe,GAChB,GAAiB,EAAa,SAAS,EAAE,WAC7C,EAAE,OAAO,cAAc,YAAY,GAC/B,EAAE,aACL,EAAE,kBAcR,aAAc,SAAU,EAAiB,EAAkB,EAAiB,EAAiB,GAC5F,GAEI,GAAG,EAFH,EAAgB,KAAK,eACrB,EAAO,KAAK,KAYhB,IATwB,GAApB,IACC,GACH,EAAgB,MAEb,GAAoB,IAAS,GAChC,EAAiB,OAIR,EAAP,GAAkC,EAAP,EAC9B,IAAK,EAAI,EAAc,OAAS,EAAG,GAAK,EAAG,IAC1C,EAAI,EAAc,GACd,EAAE,mBACL,EAAE,qBAEC,EAAgB,WAAW,EAAE,UAChC,EAAE,aAAa,EAAiB,EAAkB,EAAiB,EAAiB,IAOxF,gBAAiB,WAEhB,MAAO,MAAK,eAAe,OAAS,GAAK,KAAK,eAAe,GAAG,cAAgB,KAAK,cC1YvF,GAAE,OAAO,SACR,YAAa,WACZ,GAAI,GAAS,KAAK,QAAQ,OAG1B,OAFA,MAAK,WAAW,GAChB,KAAK,QAAQ,QAAU,EAChB,MAGR,YAAa,WACZ,MAAO,MAAK,WAAW,KAAK,QAAQ,YChBtC,EAAE,aAAe,SAAU,GAC1B,KAAK,UAAY,EACjB,KAAK,YAAc,EAAW,EAC9B,KAAK,SACL,KAAK,iBAGN,EAAE,aAAa,WAEd,UAAW,SAAU,EAAK,GACzB,GAAI,GAAI,KAAK,UAAU,EAAM,GACzB,EAAI,KAAK,UAAU,EAAM,GACzB,EAAO,KAAK,MACZ,EAAM,EAAK,GAAK,EAAK,OACrB,EAAO,EAAI,GAAK,EAAI,OACpB,EAAQ,EAAE,KAAK,MAAM,EAEzB,MAAK,aAAa,GAAS,EAE3B,EAAK,KAAK,IAGX,aAAc,SAAU,EAAK,GAC5B,KAAK,aAAa,GAClB,KAAK,UAAU,EAAK,IAIrB,aAAc,SAAU,EAAK,GAC5B,GAKI,GAAG,EALH,EAAI,KAAK,UAAU,EAAM,GACzB,EAAI,KAAK,UAAU,EAAM,GACzB,EAAO,KAAK,MACZ,EAAM,EAAK,GAAK,EAAK,OACrB,EAAO,EAAI,GAAK,EAAI,MAKxB,WAFO,MAAK,aAAa,EAAE,KAAK,MAAM,IAEjC,EAAI,EAAG,EAAM,EAAK,OAAY,EAAJ,EAAS,IACvC,GAAI,EAAK,KAAO,EAQf,MANA,GAAK,OAAO,EAAG,GAEH,IAAR,SACI,GAAI,IAGL,GAMV,WAAY,SAAU,EAAI,GACzB,GAAI,GAAG,EAAG,EAAG,EAAK,EAAK,EAAM,EACzB,EAAO,KAAK,KAEhB,KAAK,IAAK,GAAM,CACf,EAAM,EAAK,EAEX,KAAK,IAAK,GAGT,IAFA,EAAO,EAAI,GAEN,EAAI,EAAG,EAAM,EAAK,OAAY,EAAJ,EAAS,IACvC,EAAU,EAAG,KAAK,EAAS,EAAK,IAC5B,IACH,IACA,OAOL,cAAe,SAAU,GACxB,GAEI,GAAG,EAAG,EAAG,EAAK,EAAM,EAAK,EAAK,EAF9B,EAAI,KAAK,UAAU,EAAM,GACzB,EAAI,KAAK,UAAU,EAAM,GAEzB,EAAc,KAAK,aACnB,EAAgB,KAAK,YACrB,EAAU,IAEd,KAAK,EAAI,EAAI,EAAQ,EAAI,GAAT,EAAY,IAE3B,GADA,EAAM,KAAK,MAAM,GAGhB,IAAK,EAAI,EAAI,EAAQ,EAAI,GAAT,EAAY,IAE3B,GADA,EAAO,EAAI,GAGV,IAAK,EAAI,EAAG,EAAM,EAAK,OAAY,EAAJ,EAAS,IACvC,EAAM,EAAK,GACX,EAAO,KAAK,QAAQ,EAAY,EAAE,KAAK,MAAM,IAAO,IACzC,EAAP,GACK,GAAR,GAAqC,OAAZ,KACzB,EAAgB,EAChB,EAAU,EAOhB,OAAO,IAGR,UAAW,SAAU,GACpB,GAAI,GAAQ,KAAK,MAAM,EAAI,KAAK,UAChC,OAAO,UAAS,GAAS,EAAQ,GAGlC,QAAS,SAAU,EAAG,GACrB,GAAI,GAAK,EAAG,EAAI,EAAE,EACd,EAAK,EAAG,EAAI,EAAE,CAClB,OAAO,GAAK,EAAK,EAAK,ICzFvB,WACA,EAAE,WAQD,WAAY,SAAU,EAAK,GAC1B,GAAI,GAAK,EAAG,GAAG,IAAM,EAAG,GAAG,IAC1B,EAAK,EAAG,GAAG,IAAM,EAAG,GAAG,GACxB,OAAQ,IAAM,EAAI,IAAM,EAAG,GAAG,KAAO,GAAM,EAAI,IAAM,EAAG,GAAG,MAU5D,iCAAkC,SAAU,EAAU,GACrD,GAGC,GAAG,EAAI,EAHJ,EAAO,EACV,EAAQ,KACR,IAGD,KAAK,EAAI,EAAQ,OAAS,EAAG,GAAK,EAAG,IACpC,EAAK,EAAQ,GACb,EAAI,KAAK,WAAW,EAAI,GAEpB,EAAI,IACP,EAAU,KAAK,GAKZ,EAAI,IACP,EAAO,EACP,EAAQ,GAIV,QAAS,SAAU,EAAO,UAAW,IAWtC,gBAAiB,SAAU,EAAU,GACpC,GAAI,MACH,EAAI,KAAK,iCAAiC,EAAU,EAErD,OAAI,GAAE,UACL,EACC,EAAoB,OACnB,KAAK,iBAAiB,EAAS,GAAI,EAAE,UAAW,EAAE,YAEpD,EACC,EAAoB,OACnB,KAAK,iBAAiB,EAAE,SAAU,EAAS,IAAK,EAAE,cAI5C,EAAS,KAWnB,cAAe,SAAU,GAExB,GAKC,GALG,GAAS,EAAO,GAAS,EAC5B,GAAS,EAAO,GAAS,EACzB,EAAW,KAAM,EAAW,KAC5B,EAAW,KAAM,EAAW,KAC5B,EAAQ,KAAM,EAAQ,IAGvB,KAAK,EAAI,EAAQ,OAAS,EAAG,GAAK,EAAG,IAAK,CACzC,GAAI,GAAK,EAAQ,IACb,KAAW,GAAS,EAAG,IAAM,KAChC,EAAW,EACX,EAAS,EAAG,MAET,KAAW,GAAS,EAAG,IAAM,KAChC,EAAW,EACX,EAAS,EAAG,MAET,KAAW,GAAS,EAAG,IAAM,KAChC,EAAW,EACX,EAAS,EAAG,MAET,KAAW,GAAS,EAAG,IAAM,KAChC,EAAW,EACX,EAAS,EAAG,KAIV,IAAW,GACd,EAAQ,EACR,EAAQ,IAER,EAAQ,EACR,EAAQ,EAGT,IAAI,MAAQ,OAAO,KAAK,iBAAiB,EAAO,GAAQ,GACnD,KAAK,iBAAiB,EAAO,GAAQ,GAC1C,OAAO,QAKV,EAAE,cAAc,SACf,cAAe,WACd,GAEC,GAAG,EAFA,EAAe,KAAK,qBACvB,IAGD,KAAK,EAAI,EAAa,OAAS,EAAG,GAAK,EAAG,IACzC,EAAI,EAAa,GAAG,YACpB,EAAO,KAAK,EAGb,OAAO,GAAE,UAAU,cAAc,MC/JnC,EAAE,cAAc,SAEf,KAAgB,EAAV,KAAK,GACX,sBAAuB,GACvB,kBAAmB,EAEnB,sBAAwB,GACxB,mBAAoB,GACpB,oBAAqB,EAErB,wBAAyB,EAGzB,SAAU,WACT,GAAI,KAAK,OAAO,cAAgB,OAAQ,KAAK,OAAO,iBAApD,CAIA,GAIC,GAJG,EAAe,KAAK,mBAAmB,MAAM,GAChD,EAAQ,KAAK,OACb,EAAM,EAAM,KACZ,EAAS,EAAI,mBAAmB,KAAK,QAGtC,MAAK,OAAO,cACZ,KAAK,OAAO,YAAc,KAItB,EAAa,QAAU,KAAK,wBAC/B,EAAY,KAAK,sBAAsB,EAAa,OAAQ,IAE5D,EAAO,GAAK,GACZ,EAAY,KAAK,sBAAsB,EAAa,OAAQ,IAG7D,KAAK,mBAAmB,EAAc,KAGvC,WAAY,SAAU,GAEjB,KAAK,OAAO,mBAGhB,KAAK,qBAAqB,GAE1B,KAAK,OAAO,YAAc,OAG3B,sBAAuB,SAAU,EAAO,GACvC,GAIC,GAAG,EAJA,EAAgB,KAAK,OAAO,QAAQ,2BAA6B,KAAK,uBAAyB,EAAI,GACtG,EAAY,EAAgB,KAAK,KACjC,EAAY,KAAK,KAAO,EACxB,IAOD,KAJA,EAAY,KAAK,IAAI,EAAW,IAEhC,EAAI,OAAS,EAER,EAAI,EAAO,EAAJ,EAAW,IACtB,EAAQ,KAAK,kBAAoB,EAAI,EACrC,EAAI,GAAK,GAAI,GAAE,MAAM,EAAS,EAAI,EAAY,KAAK,IAAI,GAAQ,EAAS,EAAI,EAAY,KAAK,IAAI,IAAQ,QAG1G,OAAO,IAGR,sBAAuB,SAAU,EAAO,GACvC,GAMC,GANG,EAA6B,KAAK,OAAO,QAAQ,2BACpD,EAAY,EAA6B,KAAK,mBAC9C,EAAa,EAA6B,KAAK,sBAC/C,EAAe,EAA6B,KAAK,oBAAsB,KAAK,KAC5E,EAAQ,EACR,IAMD,KAHA,EAAI,OAAS,EAGR,EAAI,EAAO,GAAK,EAAG,IAGf,EAAJ,IACH,EAAI,GAAK,GAAI,GAAE,MAAM,EAAS,EAAI,EAAY,KAAK,IAAI,GAAQ,EAAS,EAAI,EAAY,KAAK,IAAI,IAAQ,UAE1G,GAAS,EAAa,EAAgB,KAAJ,EAClC,GAAa,EAAe,CAE7B,OAAO,IAGR,uBAAwB,WACvB,GAIC,GAAG,EAJA,EAAQ,KAAK,OAChB,EAAM,EAAM,KACZ,EAAK,EAAM,cACX,EAAe,KAAK,mBAAmB,MAAM,EAM9C,KAHA,EAAM,aAAc,EAEpB,KAAK,WAAW,GACX,EAAI,EAAa,OAAS,EAAG,GAAK,EAAG,IACzC,EAAI,EAAa,GAEjB,EAAG,YAAY,GAEX,EAAE,qBACL,EAAE,UAAU,EAAE,0BACP,GAAE,oBAEN,EAAE,iBACL,EAAE,gBAAgB,GAGf,EAAE,aACL,EAAI,YAAY,EAAE,kBACX,GAAE,WAIX,GAAM,KAAK,gBACV,QAAS,KACT,QAAS,IAEV,EAAM,aAAc,EACpB,EAAM,YAAc,QAKtB,EAAE,yBAA2B,EAAE,cAAc,QAC5C,mBAAoB,SAAU,EAAc,GAC3C,GAIC,GAAG,EAAG,EAAK,EAJR,EAAQ,KAAK,OAChB,EAAM,EAAM,KACZ,EAAK,EAAM,cACX,EAAa,KAAK,OAAO,QAAQ,wBAOlC,KAJA,EAAM,aAAc,EAIf,EAAI,EAAG,EAAI,EAAa,OAAQ,IACpC,EAAS,EAAI,mBAAmB,EAAU,IAC1C,EAAI,EAAa,GAGjB,EAAM,GAAI,GAAE,UAAU,KAAK,QAAS,GAAS,GAC7C,EAAI,SAAS,GACb,EAAE,WAAa,EAGf,EAAE,mBAAqB,EAAE,QACzB,EAAE,UAAU,GACR,EAAE,iBACL,EAAE,gBAAgB,KAGnB,EAAG,SAAS,EAEb,MAAK,WAAW,IAEhB,EAAM,aAAc,EACpB,EAAM,KAAK,cACV,QAAS,KACT,QAAS,KAIX,qBAAsB,WACrB,KAAK,4BAKP,EAAE,cAAc,SAEf,mBAAoB,SAAU,EAAc,GAC3C,GASC,GAAG,EAAG,EAAK,EAAS,EAAW,EAT5B,EAAK,KACR,EAAQ,KAAK,OACb,EAAM,EAAM,KACZ,EAAK,EAAM,cACX,EAAkB,KAAK,QACvB,EAAe,EAAI,mBAAmB,GACtC,EAAM,EAAE,KAAK,IACb,EAAa,EAAE,UAAW,KAAK,OAAO,QAAQ,0BAC9C,EAAkB,EAAW,OAuB9B,KApBwB,SAApB,IACH,EAAkB,EAAE,mBAAmB,UAAU,QAAQ,yBAAyB,SAG/E,GAEH,EAAW,QAAU,EAGrB,EAAW,WAAa,EAAW,WAAa,IAAM,+BAGtD,EAAW,QAAU,EAGtB,EAAM,aAAc,EAKf,EAAI,EAAG,EAAI,EAAa,OAAQ,IACpC,EAAI,EAAa,GAEjB,EAAS,EAAI,mBAAmB,EAAU,IAG1C,EAAM,GAAI,GAAE,UAAU,EAAiB,GAAS,GAChD,EAAI,SAAS,GACb,EAAE,WAAa,EAIX,IACH,EAAU,EAAI,MACd,EAAY,EAAQ,iBAAmB,GACvC,EAAQ,MAAM,gBAAkB,EAChC,EAAQ,MAAM,iBAAmB,GAI9B,EAAE,iBACL,EAAE,gBAAgB,KAEf,EAAE,aACL,EAAE,cAIH,EAAG,SAAS,GAER,EAAE,SACL,EAAE,QAAQ,EAQZ,KAJA,EAAM,eACN,EAAM,kBAGD,EAAI,EAAa,OAAS,EAAG,GAAK,EAAG,IACzC,EAAS,EAAI,mBAAmB,EAAU,IAC1C,EAAI,EAAa,GAGjB,EAAE,mBAAqB,EAAE,QACzB,EAAE,UAAU,GAER,EAAE,aACL,EAAE,cAIC,IACH,EAAM,EAAE,WACR,EAAU,EAAI,MACd,EAAQ,MAAM,iBAAmB,EAEjC,EAAI,UAAU,QAAS,IAGzB,MAAK,WAAW,IAEhB,EAAM,aAAc,EAEpB,WAAW,WACV,EAAM,gBACN,EAAM,KAAK,cACV,QAAS,EACT,QAAS,KAER,MAGJ,qBAAsB,SAAU,GAC/B,GAOC,GAAG,EAAG,EAAK,EAAS,EAAW,EAP5B,EAAK,KACR,EAAQ,KAAK,OACb,EAAM,EAAM,KACZ,EAAK,EAAM,cACX,EAAe,EAAc,EAAI,uBAAuB,KAAK,QAAS,EAAY,KAAM,EAAY,QAAU,EAAI,mBAAmB,KAAK,SAC1I,EAAe,KAAK,mBAAmB,MAAM,GAC7C,EAAM,EAAE,KAAK,GAQd,KALA,EAAM,aAAc,EACpB,EAAM,kBAGN,KAAK,WAAW,GACX,EAAI,EAAa,OAAS,EAAG,GAAK,EAAG,IACzC,EAAI,EAAa,GAGZ,EAAE,qBAKP,EAAE,aAGF,EAAE,UAAU,EAAE,0BACP,GAAE,mBAGT,GAAgB,EACZ,EAAE,UACL,EAAE,QAAQ,GACV,GAAgB,GAEb,EAAE,cACL,EAAE,cACF,GAAgB,GAEb,GACH,EAAG,YAAY,GAIZ,IACH,EAAM,EAAE,WACR,EAAU,EAAI,MACd,EAAY,EAAQ,iBAAmB,GACvC,EAAQ,MAAM,iBAAmB,EACjC,EAAI,UAAU,QAAS,KAIzB,GAAM,aAAc,EAEpB,WAAW,WAEV,GAAI,GAAuB,CAC3B,KAAK,EAAI,EAAa,OAAS,EAAG,GAAK,EAAG,IACzC,EAAI,EAAa,GACb,EAAE,YACL,GAKF,KAAK,EAAI,EAAa,OAAS,EAAG,GAAK,EAAG,IACzC,EAAI,EAAa,GAEZ,EAAE,aAIH,EAAE,aACL,EAAE,cAEC,EAAE,iBACL,EAAE,gBAAgB,GAGf,EAAuB,GAC1B,EAAG,YAAY,GAGhB,EAAI,YAAY,EAAE,kBACX,GAAE,WAEV,GAAM,gBACN,EAAM,KAAK,gBACV,QAAS,EACT,QAAS,KAER,QAKL,EAAE,mBAAmB,SAEpB,YAAa,KAEb,WAAY,WACX,KAAK,YAAY,MAAM,KAAM,YAG9B,iBAAkB,WACjB,KAAK,KAAK,GAAG,QAAS,KAAK,mBAAoB,MAE3C,KAAK,KAAK,QAAQ,eACrB,KAAK,KAAK,GAAG,YAAa,KAAK,qBAAsB,MAGtD,KAAK,KAAK,GAAG,UAAW,KAAK,uBAAwB,MAEhD,EAAE,QAAQ,OACd,KAAK,KAAK,YAAY,OAOxB,oBAAqB,WACpB,KAAK,KAAK,IAAI,QAAS,KAAK,mBAAoB,MAChD,KAAK,KAAK,IAAI,YAAa,KAAK,qBAAsB,MACtD,KAAK,KAAK,IAAI,WAAY,KAAK,oBAAqB,MACpD,KAAK,KAAK,IAAI,UAAW,KAAK,uBAAwB,MAItD,KAAK;EAKN,qBAAsB,WAChB,KAAK,MAIV,KAAK,KAAK,GAAG,WAAY,KAAK,oBAAqB,OAGpD,oBAAqB,SAAU,GAE1B,EAAE,QAAQ,SAAS,KAAK,KAAK,SAAU,sBAI3C,KAAK,KAAK,IAAI,WAAY,KAAK,oBAAqB,MACpD,KAAK,YAAY,KAGlB,mBAAoB,WAEnB,KAAK,eAGN,YAAa,SAAU,GAClB,KAAK,aACR,KAAK,YAAY,WAAW,IAI9B,uBAAwB,WACnB,KAAK,aACR,KAAK,YAAY,0BAKnB,iBAAkB,SAAU,GACvB,EAAM,aACT,KAAK,cAAc,YAAY,GAE3B,EAAM,aACT,EAAM,cAGH,EAAM,iBACT,EAAM,gBAAgB,GAGvB,KAAK,KAAK,YAAY,EAAM,kBACrB,GAAM,eC/chB,EAAE,mBAAmB,SASpB,gBAAiB,SAAU,GAoB1B,MAnBK,GAEM,YAAkB,GAAE,mBAC9B,EAAS,EAAO,iBAAiB,qBACvB,YAAkB,GAAE,WAC9B,EAAS,EAAO,QACN,YAAkB,GAAE,cAC9B,EAAS,EAAO,qBACN,YAAkB,GAAE,SAC9B,GAAU,IARV,EAAS,KAAK,iBAAiB,qBAUhC,KAAK,4BAA4B,GACjC,KAAK,wBAGD,KAAK,QAAQ,kBAChB,KAAK,gCAAgC,GAG/B,MAQR,4BAA6B,SAAU,GACtC,GAAI,GAAI,CAGR,KAAK,IAAM,GAOV,IADA,EAAS,EAAO,GAAI,SACb,GACN,EAAO,kBAAmB,EAC1B,EAAS,EAAO,UAWnB,gCAAiC,SAAU,GAC1C,GAAI,GAAI,CAER,KAAK,IAAM,GACV,EAAQ,EAAO,GAGX,KAAK,SAAS,IAEjB,EAAM,QAAQ,KAAK,oBAAoB,OAM3C,EAAE,OAAO,SAQR,mBAAoB,SAAU,EAAS,GACtC,GAAI,GAAO,KAAK,QAAQ,IAcxB,OAZA,GAAE,WAAW,EAAM,GAEnB,KAAK,QAAQ,GAMT,GAA2B,KAAK,UACnC,KAAK,SAAS,OAAO,gBAAgB,MAG/B","file":"dist/leaflet.markercluster.js"} \ No newline at end of file diff --git a/sut/frontend/public/leaflet/smooth_bounce/BouncingMotion.js b/sut/frontend/public/leaflet/smooth_bounce/BouncingMotion.js new file mode 100644 index 0000000..b57377e --- /dev/null +++ b/sut/frontend/public/leaflet/smooth_bounce/BouncingMotion.js @@ -0,0 +1,307 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +var _leaflet = require("leaflet"); + +var _BouncingOptions = _interopRequireDefault(require("./BouncingOptions.js")); + +var _Cache = _interopRequireDefault(require("./Cache.js")); + +var _Styles = _interopRequireDefault(require("./Styles.js")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : {"default": obj}; +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, {value: value, enumerable: true, configurable: true, writable: true}); + } else { + obj[key] = value; + } + return obj; +} + +var bonceEndEvent = 'bounceend'; + +var BouncingMotion = /*#__PURE__*/function () { + // TODO: check if this cache working right (keys don't need prefix) + + /** + * Constructor. + * + * @param marker {Marker} marker + * @param position {Point} marker current position on the map canvas + * @param bouncingOptions {BouncingOptions} options of bouncing animation + */ + function BouncingMotion(marker, position, bouncingOptions) { + _classCallCheck(this, BouncingMotion); + + _defineProperty(this, "marker", void 0); + + _defineProperty(this, "position", void 0); + + _defineProperty(this, "bouncingOptions", void 0); + + _defineProperty(this, "moveSteps", void 0); + + _defineProperty(this, "moveDelays", void 0); + + _defineProperty(this, "resizeSteps", void 0); + + _defineProperty(this, "resizeDelays", void 0); + + _defineProperty(this, "isBouncing", false); + + _defineProperty(this, "iconStyles", void 0); + + _defineProperty(this, "shadowStyles", void 0); + + _defineProperty(this, "bouncingAnimationPlaying", false); + + this.marker = marker; + this.position = position; + this.updateBouncingOptions(bouncingOptions); + } + + _createClass(BouncingMotion, [{ + key: "updateBouncingOptions", + value: function updateBouncingOptions(options) { + this.bouncingOptions = options instanceof _BouncingOptions["default"] ? options : this.bouncingOptions.override(options); + var _this$bouncingOptions = this.bouncingOptions, + bounceHeight = _this$bouncingOptions.bounceHeight, + bounceSpeed = _this$bouncingOptions.bounceSpeed, + elastic = _this$bouncingOptions.elastic; + this.moveSteps = BouncingMotion.cache.get("moveSteps_".concat(bounceHeight), function () { + return BouncingMotion.calculateSteps(bounceHeight); + }); + this.moveDelays = BouncingMotion.cache.get("moveDelays_".concat(bounceHeight, "_").concat(bounceSpeed), function () { + return BouncingMotion.calculateDelays(bounceHeight, bounceSpeed); + }); + + if (elastic) { + var _this$bouncingOptions2 = this.bouncingOptions, + contractHeight = _this$bouncingOptions2.contractHeight, + contractSpeed = _this$bouncingOptions2.contractSpeed; + this.resizeSteps = BouncingMotion.cache.get("resizeSteps_".concat(contractHeight), function () { + return BouncingMotion.calculateSteps(contractHeight); + }); + this.resizeDelays = BouncingMotion.cache.get("resizeDelays_".concat(contractHeight, "_").concat(contractSpeed), function () { + return BouncingMotion.calculateDelays(contractHeight, contractSpeed); + }); + } + + this.recalculateMotion(this.position); + } + }, { + key: "resetStyles", + value: function resetStyles(marker) { + this.iconStyles = _Styles["default"].ofMarker(marker); + + if (marker._shadow) { + this.shadowStyles = _Styles["default"].parse(marker._shadow.style.cssText); + } + } + /** + * Recalculates bouncing motion for new marker position. + * @param position {Point} new marker position + */ + + }, { + key: "recalculateMotion", + value: function recalculateMotion(position) { + this.position = position; + } + /** + * @param times {number|null} + */ + + }, { + key: "bounce", + value: function bounce() { + var times = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + + if (this.bouncingAnimationPlaying) { + this.isBouncing = true; + return; + } + + this.isBouncing = true; + this.bouncingAnimationPlaying = true; + this.move(times); + } + }, { + key: "stopBouncing", + value: function stopBouncing() { + this.isBouncing = false; + } + /** + * @param times {number|null} + */ + + }, { + key: "move", + value: function move() { + var _this = this; + + var times = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + + if (times !== null) { + if (!--times) { + this.isBouncing = false; // this is the last bouncing + + this.bouncingAnimationPlaying = false; + } + } + /* Launch timeouts for every step of the movement animation */ + + + var i = this.moveSteps.length; + + while (i--) { + setTimeout(function (step) { + return _this.makeMoveStep(step); + }, this.moveDelays[i], this.moveSteps[i]); + } + + setTimeout(function () { + return _this.afterMove(times); + }, this.moveDelays[this.moveSteps.length - 1]); + } + }, { + key: "afterMove", + value: function afterMove(times) { + var _this2 = this; + + if (this.isBouncing) { + setTimeout(function () { + return _this2.move(times); + }, this.bouncingOptions.bounceSpeed); + } else { + this.bouncingAnimationPlaying = false; + this.marker.fire(bonceEndEvent); + } + } + /** + * @param step {number} + */ + + }, { + key: "makeMoveStep", + value: function makeMoveStep(step) { + this.marker._icon.style.cssText = this.iconStyles.toString(); + + if (this.marker._shadow) { + this.marker._shadow.style.cssText = this.shadowStyles.toString(); + } + } + /** + * Returns calculated array of animation steps. This function used to calculate both movement + * and resizing animations. + * + * @param height {number} height of movement or resizing (px) + * + * @return {number[]} array of animation steps + */ + + }], [{ + key: "calculateSteps", + value: function calculateSteps(height) { + /* Calculate the sequence of animation steps: + * steps = [1 .. height] concat [height-1 .. 0] + */ + var i = 1; + var steps = []; + + while (i <= height) { + steps.push(i++); + } + + i = height; + + while (i--) { + steps.push(i); + } + + return steps; + } + /** + * Returns calculated array of delays between animation start and the steps of animation. This + * function used to calculate both movement and resizing animations. Element with index i of + * this array contains the delay in milliseconds between animation start and the step number i. + * + * @param height {number} height of movement or resizing (px) + * @param speed {number} speed coefficient + * + * @return {number[]} array of delays before steps of animation + */ + + }, { + key: "calculateDelays", + value: function calculateDelays(height, speed) { + // Calculate delta time for bouncing animation + // Delta time to movement in one direction + var deltas = []; // time between steps of animation + + deltas[height] = speed; + deltas[0] = 0; + var i = height; + + while (--i) { + deltas[i] = Math.round(speed / (height - i)); + } // Delta time for movement in two directions + + + i = height; + + while (i--) { + deltas.push(deltas[i]); + } // Calculate move delays (cumulated deltas) + // TODO: instead of deltas.lenght write bounceHeight * 2 - 1 + + + var delays = []; // delays before steps from beginning of animation + + var totalDelay = 0; + + for (i = 0; i < deltas.length; i++) { + totalDelay += deltas[i]; + delays.push(totalDelay); + } + + return delays; + } + }]); + + return BouncingMotion; +}(); + +exports["default"] = BouncingMotion; + +_defineProperty(BouncingMotion, "cache", new _Cache["default"]()); \ No newline at end of file diff --git a/sut/frontend/public/leaflet/smooth_bounce/BouncingMotion3D.js b/sut/frontend/public/leaflet/smooth_bounce/BouncingMotion3D.js new file mode 100644 index 0000000..e3a623c --- /dev/null +++ b/sut/frontend/public/leaflet/smooth_bounce/BouncingMotion3D.js @@ -0,0 +1,373 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +var _leaflet = require("leaflet"); + +var _BouncingMotion2 = _interopRequireDefault(require("./BouncingMotion.js")); + +var _Matrix3D = _interopRequireDefault(require("./Matrix3D.js")); + +var _line = require("./line.js"); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : {"default": obj}; +} + +function _typeof(obj) { + "@babel/helpers - typeof"; + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof(obj); +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +function _get(target, property, receiver) { + if (typeof Reflect !== "undefined" && Reflect.get) { + _get = Reflect.get; + } else { + _get = function _get(target, property, receiver) { + var base = _superPropBase(target, property); + if (!base) return; + var desc = Object.getOwnPropertyDescriptor(base, property); + if (desc.get) { + return desc.get.call(receiver); + } + return desc.value; + }; + } + return _get(target, property, receiver || target); +} + +function _superPropBase(object, property) { + while (!Object.prototype.hasOwnProperty.call(object, property)) { + object = _getPrototypeOf(object); + if (object === null) break; + } + return object; +} + +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf(subClass, superClass); +} + +function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); +} + +function _createSuper(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct(); + return function _createSuperInternal() { + var Super = _getPrototypeOf(Derived), result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn(this, result); + }; +} + +function _possibleConstructorReturn(self, call) { + if (call && (_typeof(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized(self); +} + +function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; +} + +function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Date.prototype.toString.call(Reflect.construct(Date, [], function () { + })); + return true; + } catch (e) { + return false; + } +} + +function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, {value: value, enumerable: true, configurable: true, writable: true}); + } else { + obj[key] = value; + } + return obj; +} + +var moveMatrixFormat = _Matrix3D["default"].identity().toFormat('d1', 'd2'); + +var resizeMatrixFormat = _Matrix3D["default"].identity().toFormat('b2', 'd1', 'd2'); + +var BouncingMotion3D = /*#__PURE__*/function (_BouncingMotion) { + _inherits(BouncingMotion3D, _BouncingMotion); + + var _super = _createSuper(BouncingMotion3D); + + /** + * Constructor. + * + * @param marker {Marker} marker + * @param position {Point} marker current position on the map canvas + * @param bouncingOptions {BouncingOptions} options of bouncing animation + */ + function BouncingMotion3D(marker, position, bouncingOptions) { + var _this; + + _classCallCheck(this, BouncingMotion3D); + + _this = _super.call(this, marker, position, bouncingOptions); + + _defineProperty(_assertThisInitialized(_this), "iconMoveTransforms", void 0); + + _defineProperty(_assertThisInitialized(_this), "iconResizeTransforms", void 0); + + _defineProperty(_assertThisInitialized(_this), "shadowMoveTransforms", void 0); + + _defineProperty(_assertThisInitialized(_this), "shadowResizeTransforms", void 0); + + _this.recalculateMotion(position); + + return _this; + } + + _createClass(BouncingMotion3D, [{ + key: "recalculateMotion", + value: function recalculateMotion(position) { + var _this$marker$getIcon, _this$marker$getIcon$, _this$marker, _this$marker$_iconObj, + _this$marker$_iconObj2; + + _get(_getPrototypeOf(BouncingMotion3D.prototype), "recalculateMotion", this).call(this, position); + + var iconHeight = ((_this$marker$getIcon = this.marker.getIcon()) === null || _this$marker$getIcon === void 0 ? void 0 : (_this$marker$getIcon$ = _this$marker$getIcon.options) === null || _this$marker$getIcon$ === void 0 ? void 0 : _this$marker$getIcon$.iconSize[1]) || ((_this$marker = this.marker) === null || _this$marker === void 0 ? void 0 : (_this$marker$_iconObj = _this$marker._iconObj) === null || _this$marker$_iconObj === void 0 ? void 0 : (_this$marker$_iconObj2 = _this$marker$_iconObj.options) === null || _this$marker$_iconObj2 === void 0 ? void 0 : _this$marker$_iconObj2.iconSize[1]); + var x = position.x, + y = position.y; + var _this$bouncingOptions = this.bouncingOptions, + bounceHeight = _this$bouncingOptions.bounceHeight, + contractHeight = _this$bouncingOptions.contractHeight, + shadowAngle = _this$bouncingOptions.shadowAngle; + this.iconMoveTransforms = BouncingMotion3D.calculateIconMoveTransforms(x, y, bounceHeight); + this.iconResizeTransforms = BouncingMotion3D.calculateResizeTransforms(x, y, iconHeight, contractHeight); + + if (this.marker._shadow) { + var _this$marker$getIcon2, _this$marker$getIcon3; + + this.shadowMoveTransforms = BouncingMotion3D.calculateShadowMoveTransforms(x, y, bounceHeight, shadowAngle); + var shadowHeight = (_this$marker$getIcon2 = this.marker.getIcon()) === null || _this$marker$getIcon2 === void 0 ? void 0 : (_this$marker$getIcon3 = _this$marker$getIcon2.options) === null || _this$marker$getIcon3 === void 0 ? void 0 : _this$marker$getIcon3.shadowSize[1]; + this.shadowResizeTransforms = BouncingMotion3D.calculateResizeTransforms(x, y, shadowHeight, contractHeight); + } + } + }, { + key: "afterMove", + value: function afterMove(times) { + if (this.bouncingOptions.elastic) { + this.resize(times); + } else { + _get(_getPrototypeOf(BouncingMotion3D.prototype), "afterMove", this).call(this, times); + } + } + }, { + key: "resize", + value: function resize(times) { + var _this2 = this; + + var nbResizeSteps = this.resizeSteps.length; + var i = nbResizeSteps; + + while (i--) { + setTimeout(function (step) { + return _this2.makeResizeStep(step); + }, this.resizeDelays[i], this.resizeSteps[i]); + } + + setTimeout(function () { + if (!_this2.isBouncing) { + _this2.bouncingAnimationPlaying = false; + } + }, this.resizeDelays[this.resizeSteps.length]); + setTimeout(function () { + if (_this2.isBouncing) { + _this2.move(times); + } else { + _this2.marker.fire('bounceend'); + } + }, this.resizeDelays[nbResizeSteps - 1]); + } + }, { + key: "makeMoveStep", + value: function makeMoveStep(step) { + this.marker._icon.style.cssText = this.iconStyles.withTransform(this.iconMoveTransforms[step]).toString(); + + if (this.marker._shadow) { + this.marker._shadow.style.cssText = this.shadowStyles.withTransform(this.shadowMoveTransforms[step]).toString(); + } + } + /** + * @param step {number} + */ + + }, { + key: "makeResizeStep", + value: function makeResizeStep(step) { + this.marker._icon.style.cssText = this.iconStyles.withTransform(this.iconResizeTransforms[step]).toString(); + + if (this.marker._shadow && this.bouncingOptions.shadowAngle) { + this.marker._shadow.style.cssText = this.shadowStyles.withTransform(this.shadowResizeTransforms[step]).toString(); + } + } + /** + * Returns calculated array of transformation definitions for the animation of icon movement. + * Function defines one transform for every pixel of shift of the icon from it's original y + * position. + * + * @param x {number} x coordinate of original position of the marker + * @param y {number} y coordinate of original position of the marker + * @param bounceHeight {number} height of bouncing (px) + * + * @return {string[]} array of transformation definitions + */ + + }], [{ + key: "calculateIconMoveTransforms", + value: function calculateIconMoveTransforms(x, y, bounceHeight) { + var transforms = []; + var deltaY = bounceHeight + 1; // Use fast inverse while loop to fill the array + + while (deltaY--) { + transforms[deltaY] = moveMatrixFormat(x, y - deltaY); + } + + return transforms; + } + /** + * Returns calculated array of transformation definitions for the animation of icon resizing. + * Function defines one transform for every pixel of resizing of marker from it's original + * height. + * + * @param x {number} x coordinate of original position of marker + * @param y {number} y coordinate of original position of marker + * @param height {number} original marker height (px) + * @param contractHeight {number} height of marker contraction (px) + * + * @return {string[]} array of transformation definitions + */ + + }, { + key: "calculateResizeTransforms", + value: function calculateResizeTransforms(x, y, height, contractHeight) { + var transforms = []; + var deltaHeight = contractHeight + 1; // Use fast inverse while loop to fill the array + + while (deltaHeight--) { + transforms[deltaHeight] = resizeMatrixFormat((height - deltaHeight) / height, x, y + deltaHeight); + } + + return transforms; + } + /** + * Returns calculated array of transformation definitions for the animation of shadow movement. + * Function defines one transform for every pixel of shift of the shadow from it's original + * position. + * + * @param x {number} x coordinate of original position of marker + * @param y {number} y coordinate of original position of marker + * @param bounceHeight {number} height of bouncing (px) + * @param angle {number|null} shadow inclination angle, if null shadow don't moves from it's + * initial position (radians) + * + * @return {string[]} array of transformation definitions + */ + + }, { + key: "calculateShadowMoveTransforms", + value: function calculateShadowMoveTransforms(x, y, bounceHeight) { + var angle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; + // TODO: check this method to know if bounceHeight + 1 is normal + var transforms = []; + var deltaY = bounceHeight + 1; + var points = []; + + if (angle != null) { + // important: 0 is not null + points = (0, _line.calculateLine)(x, y, angle, bounceHeight + 1); + } else { + for (var i = 0; i <= bounceHeight; i++) { + points[i] = [x, y]; + } + } // Use fast inverse while loop to fill the array + + + while (deltaY--) { + transforms[deltaY] = moveMatrixFormat(points[deltaY][0], points[deltaY][1]); + } + + return transforms; + } + }]); + + return BouncingMotion3D; +}(_BouncingMotion2["default"]); + +exports["default"] = BouncingMotion3D; \ No newline at end of file diff --git a/sut/frontend/public/leaflet/smooth_bounce/BouncingMotionCss3.js b/sut/frontend/public/leaflet/smooth_bounce/BouncingMotionCss3.js new file mode 100644 index 0000000..9d2bb65 --- /dev/null +++ b/sut/frontend/public/leaflet/smooth_bounce/BouncingMotionCss3.js @@ -0,0 +1,481 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +var _leaflet = require("leaflet"); + +var _line = require("./line.js"); + +require("./bouncing.css"); + +var _BouncingOptions = _interopRequireDefault(require("./BouncingOptions.js")); + +var _Styles = _interopRequireDefault(require("./Styles.js")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : {"default": obj}; +} + +function _slicedToArray(arr, i) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); +} + +function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + return arr2; +} + +function _iterableToArrayLimit(arr, i) { + var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; + if (_i == null) return; + var _arr = []; + var _n = true; + var _d = false; + var _s, _e; + try { + for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) _i["return"](); + } finally { + if (_d) throw _e; + } + } + return _arr; +} + +function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", {writable: false}); + return Constructor; +} + +function _classPrivateFieldInitSpec(obj, privateMap, value) { + _checkPrivateRedeclaration(obj, privateMap); + privateMap.set(obj, value); +} + +function _checkPrivateRedeclaration(obj, privateCollection) { + if (privateCollection.has(obj)) { + throw new TypeError("Cannot initialize the same private elements twice on an object"); + } +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, {value: value, enumerable: true, configurable: true, writable: true}); + } else { + obj[key] = value; + } + return obj; +} + +function _classPrivateFieldGet(receiver, privateMap) { + var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); + return _classApplyDescriptorGet(receiver, descriptor); +} + +function _classApplyDescriptorGet(receiver, descriptor) { + if (descriptor.get) { + return descriptor.get.call(receiver); + } + return descriptor.value; +} + +function _classPrivateFieldSet(receiver, privateMap, value) { + var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); + _classApplyDescriptorSet(receiver, descriptor, value); + return value; +} + +function _classExtractFieldDescriptor(receiver, privateMap, action) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to " + action + " private field on non-instance"); + } + return privateMap.get(receiver); +} + +function _classApplyDescriptorSet(receiver, descriptor, value) { + if (descriptor.set) { + descriptor.set.call(receiver, value); + } else { + if (!descriptor.writable) { + throw new TypeError("attempted to set read only private field"); + } + descriptor.value = value; + } +} + +var animationNamePrefix = 'l-smooth-marker-bouncing-'; +var moveAnimationName = animationNamePrefix + 'move'; +var contractAnimationName = animationNamePrefix + 'contract'; +/* + * CSS3 animation runs faster than transform-based animation. We need to reduce speed in order + * to be compatible with old API. + */ + +var speedCoefficient = 0.8; + +/** + * Removes and then resets required classes on the HTML element. + * Used as hack to restart CSS3 animation. + * + * @param element {HTMLElement} HTML element + * @param classes {string[]} names of classes + */ + +function resetClasses(element, classes) { + classes.forEach(function (className) { + return _leaflet.DomUtil.removeClass(element, className); + }); + void element.offsetWidth; + classes.forEach(function (className) { + return _leaflet.DomUtil.addClass(element, className); + }); +} + +var _lastAnimationName = /*#__PURE__*/new WeakMap(); + +var _classes = /*#__PURE__*/new WeakMap(); + +var _eventCounter = /*#__PURE__*/new WeakMap(); + +var _times = /*#__PURE__*/new WeakMap(); + +var _listener = /*#__PURE__*/new WeakMap(); + +var BouncingMotionCss3 = /*#__PURE__*/function () { + /** + * Constructor. + * + * @param marker {Marker} marker + * @param position {Point} marker current position on the map canvas + * @param bouncingOptions {BouncingOptions} options of bouncing animation + */ + function BouncingMotionCss3(marker, position, bouncingOptions) { + var _this = this; + + _classCallCheck(this, BouncingMotionCss3); + + _defineProperty(this, "marker", void 0); + + _defineProperty(this, "position", void 0); + + _defineProperty(this, "bouncingOptions", void 0); + + _defineProperty(this, "isBouncing", false); + + _defineProperty(this, "iconStyles", void 0); + + _defineProperty(this, "shadowStyles", void 0); + + _defineProperty(this, "bouncingAnimationPlaying", false); + + _classPrivateFieldInitSpec(this, _lastAnimationName, { + writable: true, + value: contractAnimationName + }); + + _classPrivateFieldInitSpec(this, _classes, { + writable: true, + value: ['bouncing'] + }); + + _classPrivateFieldInitSpec(this, _eventCounter, { + writable: true, + value: void 0 + }); + + _classPrivateFieldInitSpec(this, _times, { + writable: true, + value: void 0 + }); + + _classPrivateFieldInitSpec(this, _listener, { + writable: true, + value: function value(event) { + return _this.onAnimationEnd(event); + } + }); + + this.marker = marker; + this.position = position; + this.updateBouncingOptions(bouncingOptions); + } + + _createClass(BouncingMotionCss3, [{ + key: "updateBouncingOptions", + value: function updateBouncingOptions(options) { + this.bouncingOptions = options instanceof _BouncingOptions["default"] ? options : this.bouncingOptions.override(options); + + if (this.bouncingOptions.elastic) { + _classPrivateFieldSet(this, _lastAnimationName, contractAnimationName); + + var index = _classPrivateFieldGet(this, _classes).indexOf('simple'); + + if (index > -1) { + _classPrivateFieldGet(this, _classes).splice(index, 1); + } + + if (this.marker._icon) { + _leaflet.DomUtil.removeClass(this.marker._icon, 'simple'); + } + } else { + _classPrivateFieldSet(this, _lastAnimationName, moveAnimationName); + + _classPrivateFieldGet(this, _classes).push('simple'); + } + + if (this.marker._icon) { + this.resetStyles(this.marker); + } + } + }, { + key: "onAnimationEnd", + value: function onAnimationEnd(event) { + var _this2 = this; + + if (event.animationName === _classPrivateFieldGet(this, _lastAnimationName)) { + var _this$eventCounter, _this$eventCounter2; + + _classPrivateFieldSet(this, _eventCounter, (_this$eventCounter = _classPrivateFieldGet(this, _eventCounter), _this$eventCounter2 = _this$eventCounter++, _this$eventCounter)), _this$eventCounter2; + + _classPrivateFieldSet(this, _eventCounter, _classPrivateFieldGet(this, _eventCounter) % 2); + + if (!_classPrivateFieldGet(this, _eventCounter)) { + var _this$times; + + if (this.isBouncing && (_classPrivateFieldGet(this, _times) === null || _classPrivateFieldSet(this, _times, (_this$times = _classPrivateFieldGet(this, _times), --_this$times)))) { + resetClasses(this.marker._icon, _classPrivateFieldGet(this, _classes)); + + if (this.marker._shadow && this.bouncingOptions.shadowAngle) { + resetClasses(this.marker._shadow, _classPrivateFieldGet(this, _classes)); + } + } else { + _classPrivateFieldGet(this, _classes).forEach(function (className) { + _leaflet.DomUtil.removeClass(_this2.marker._icon, className); + + if (_this2.marker._shadow) { + _leaflet.DomUtil.removeClass(_this2.marker._shadow, className); + } + }); + + this.bouncingAnimationPlaying = false; + this.marker.fire('bounceend'); + } + } + } + } + }, { + key: "resetStyles", + value: function resetStyles(marker) { + var _this$marker$getIcon, + _this$marker$getIcon$, + _this$marker, + _this$marker$_iconObj, + _this$marker$_iconObj2, + _this3 = this; + + this.marker = marker; + this.iconStyles = _Styles["default"].ofMarker(marker); + + if (marker._shadow) { + this.shadowStyles = _Styles["default"].parse(marker._shadow.style.cssText); + } + + var iconHeight = ((_this$marker$getIcon = this.marker.getIcon()) === null || _this$marker$getIcon === void 0 ? void 0 : (_this$marker$getIcon$ = _this$marker$getIcon.options) === null || _this$marker$getIcon$ === void 0 ? void 0 : _this$marker$getIcon$.iconSize[1]) || ((_this$marker = this.marker) === null || _this$marker === void 0 ? void 0 : (_this$marker$_iconObj = _this$marker._iconObj) === null || _this$marker$_iconObj === void 0 ? void 0 : (_this$marker$_iconObj2 = _this$marker$_iconObj.options) === null || _this$marker$_iconObj2 === void 0 ? void 0 : _this$marker$_iconObj2.iconSize[1]); + var iconAnimationParams = BouncingMotionCss3.animationParams(this.position, this.bouncingOptions, iconHeight); + this.iconStyles = this.iconStyles.withStyles(iconAnimationParams); + this.marker._icon.style.cssText = this.iconStyles.toString(); + + if (this.bouncingAnimationPlaying) { + resetClasses(this.marker._icon, _classPrivateFieldGet(this, _classes)); + + this.marker._icon.addEventListener('animationend', _classPrivateFieldGet(this, _listener)); + } + + var _this$bouncingOptions = this.bouncingOptions, + bounceHeight = _this$bouncingOptions.bounceHeight, + contractHeight = _this$bouncingOptions.contractHeight, + shadowAngle = _this$bouncingOptions.shadowAngle; + + if (this.marker._shadow) { + if (shadowAngle) { + var _this$marker$getIcon2, _this$marker$getIcon3; + + var _this$position = this.position, + x = _this$position.x, + y = _this$position.y; + var points = (0, _line.calculateLine)(x, y, shadowAngle, bounceHeight + 1); + + var _points$bounceHeight = _slicedToArray(points[bounceHeight], 2), + posXJump = _points$bounceHeight[0], + posYJump = _points$bounceHeight[1]; + + var shadowHeight = (_this$marker$getIcon2 = this.marker.getIcon()) === null || _this$marker$getIcon2 === void 0 ? void 0 : (_this$marker$getIcon3 = _this$marker$getIcon2.options) === null || _this$marker$getIcon3 === void 0 ? void 0 : _this$marker$getIcon3.shadowSize[1]; + var shadowScaleContract = BouncingMotionCss3.contractScale(shadowHeight, contractHeight); + this.shadowStyles = this.shadowStyles.withStyles(iconAnimationParams).withStyles({ + '--pos-x-jump': "".concat(posXJump, "px"), + '--pos-y-jump': "".concat(posYJump, "px"), + '--scale-contract': shadowScaleContract + }); + this.marker._shadow.style.cssText = this.shadowStyles.toString(); + + if (this.bouncingAnimationPlaying) { + resetClasses(this.marker._shadow, _classPrivateFieldGet(this, _classes)); + } + } else { + _classPrivateFieldGet(this, _classes).forEach(function (className) { + _leaflet.DomUtil.removeClass(_this3.marker._shadow, className); + }); + } + } + } + }, { + key: "bounce", + value: function bounce() { + var times = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + + _classPrivateFieldSet(this, _times, times); + + this.isBouncing = true; + + if (this.bouncingAnimationPlaying) { + return; + } + + _classPrivateFieldSet(this, _eventCounter, 0); + + this.bouncingAnimationPlaying = true; + resetClasses(this.marker._icon, _classPrivateFieldGet(this, _classes)); + + if (this.marker._shadow && this.bouncingOptions.shadowAngle) { + resetClasses(this.marker._shadow, _classPrivateFieldGet(this, _classes)); + } + + this.marker._icon.addEventListener('animationend', _classPrivateFieldGet(this, _listener)); + } + }, { + key: "stopBouncing", + value: function stopBouncing() { + this.isBouncing = false; + } + /** + * Calculates parameters of CSS3 animation of bouncing. + * + * @param position {Point} marker current position on the map canvas + * @param bouncingOptions {BouncingOptions} options of bouncing animation + * @param height {number} icons height + * @return {object} CSS3 animation parameters + */ + + }], [{ + key: "animationParams", + value: function animationParams(position, bouncingOptions, height) { + var x = position.x, + y = position.y; + var bounceHeight = bouncingOptions.bounceHeight, + contractHeight = bouncingOptions.contractHeight, + bounceSpeed = bouncingOptions.bounceSpeed, + contractSpeed = bouncingOptions.contractSpeed; + var scaleContract = BouncingMotionCss3.contractScale(height, contractHeight); + var durationJump = BouncingMotionCss3.calculateDuration(bounceHeight, bounceSpeed); + var durationContract = BouncingMotionCss3.calculateDuration(contractHeight, contractSpeed); + var delays = [0, durationJump, durationJump * 2, durationJump * 2 + durationContract]; + return { + '--pos-x': "".concat(x, "px"), + '--pos-y': "".concat(y, "px"), + '--pos-y-jump': "".concat(y - bounceHeight, "px"), + '--pos-y-contract': "".concat(y + contractHeight, "px"), + '--scale-contract': scaleContract, + '--duration-jump': "".concat(durationJump, "ms"), + '--duration-contract': "".concat(durationContract, "ms"), + '--delays': "0ms, ".concat(delays[1], "ms, ").concat(delays[2], "ms, ").concat(delays[3], "ms") + }; + } + /** + * Calculates scale of contracting. + * + * @param {number} height original height + * @param {number} contractHeight how much it must contract + * @return {number} contracting scale between 0 and 1 + */ + + }, { + key: "contractScale", + value: function contractScale(height, contractHeight) { + return (height - contractHeight) / height; + } + /** + * Calculates duration of animation. + * + * @param height {number} height of movement or resizing (px) + * @param speed {number} speed coefficient + * + * @return {number} duration of animation (ms) + */ + + }, { + key: "calculateDuration", + value: function calculateDuration(height, speed) { + var duration = Math.round(speed * speedCoefficient); + var i = height; + + while (--i) { + duration += Math.round(speed / (height - i)); + } + + return duration; + } + }]); + + return BouncingMotionCss3; +}(); + +exports["default"] = BouncingMotionCss3; \ No newline at end of file diff --git a/sut/frontend/public/leaflet/smooth_bounce/BouncingMotionSimple.js b/sut/frontend/public/leaflet/smooth_bounce/BouncingMotionSimple.js new file mode 100644 index 0000000..c4ee740 --- /dev/null +++ b/sut/frontend/public/leaflet/smooth_bounce/BouncingMotionSimple.js @@ -0,0 +1,267 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +var _BouncingMotion2 = _interopRequireDefault(require("./BouncingMotion.js")); + +var _line = require("./line.js"); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : {"default": obj}; +} + +function _typeof(obj) { + "@babel/helpers - typeof"; + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof(obj); +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +function _get(target, property, receiver) { + if (typeof Reflect !== "undefined" && Reflect.get) { + _get = Reflect.get; + } else { + _get = function _get(target, property, receiver) { + var base = _superPropBase(target, property); + if (!base) return; + var desc = Object.getOwnPropertyDescriptor(base, property); + if (desc.get) { + return desc.get.call(receiver); + } + return desc.value; + }; + } + return _get(target, property, receiver || target); +} + +function _superPropBase(object, property) { + while (!Object.prototype.hasOwnProperty.call(object, property)) { + object = _getPrototypeOf(object); + if (object === null) break; + } + return object; +} + +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf(subClass, superClass); +} + +function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); +} + +function _createSuper(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct(); + return function _createSuperInternal() { + var Super = _getPrototypeOf(Derived), result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn(this, result); + }; +} + +function _possibleConstructorReturn(self, call) { + if (call && (_typeof(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized(self); +} + +function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; +} + +function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Date.prototype.toString.call(Reflect.construct(Date, [], function () { + })); + return true; + } catch (e) { + return false; + } +} + +function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, {value: value, enumerable: true, configurable: true, writable: true}); + } else { + obj[key] = value; + } + return obj; +} + +var BouncingMotionSimple = /*#__PURE__*/function (_BouncingMotion) { + _inherits(BouncingMotionSimple, _BouncingMotion); + + var _super = _createSuper(BouncingMotionSimple); + + /** + * Constructor. + * + * @param marker {Marker} marker + * @param position {Point} marker current position on the map canvas + * @param bouncingOptions {BouncingOptions} options of bouncing animation + */ + function BouncingMotionSimple(marker, position, bouncingOptions) { + var _this; + + _classCallCheck(this, BouncingMotionSimple); + + _this = _super.call(this, marker, position, bouncingOptions); + + _defineProperty(_assertThisInitialized(_this), "iconMovePoints", void 0); + + _defineProperty(_assertThisInitialized(_this), "shadowMovePoints", void 0); + + _this.recalculateMotion(position); + + return _this; + } + + _createClass(BouncingMotionSimple, [{ + key: "recalculateMotion", + value: function recalculateMotion(position) { + _get(_getPrototypeOf(BouncingMotionSimple.prototype), "recalculateMotion", this).call(this, position); + + var x = position.x, + y = position.y; + var _this$bouncingOptions = this.bouncingOptions, + bounceHeight = _this$bouncingOptions.bounceHeight, + shadowAngle = _this$bouncingOptions.shadowAngle; + this.iconMovePoints = BouncingMotionSimple.calculateIconMovePoints(x, y, bounceHeight); + this.shadowMovePoints = BouncingMotionSimple.calculateShadowMovePoints(x, y, bounceHeight, shadowAngle); + } + }, { + key: "makeMoveStep", + value: function makeMoveStep(step) { + _get(_getPrototypeOf(BouncingMotionSimple.prototype), "makeMoveStep", this).call(this, step); + + this.marker._icon.style.left = this.iconMovePoints[step][0] + 'px'; + this.marker._icon.style.top = this.iconMovePoints[step][1] + 'px'; + + if (this.marker._shadow) { + this.marker._shadow.style.left = this.shadowMovePoints[step][0] + 'px'; + this.marker._shadow.style.top = this.shadowMovePoints[step][1] + 'px'; + } + } + /** + * Returns calculated array of points for icon movement. Used to animate markers in browsers + * that doesn't support 'transform' attribute. + * + * @param x {number} x coordinate of original position of the marker + * @param y {number} y coordinate of original position of the marker + * @param bounceHeight {number} height of bouncing (px) + * + * @return {[number, number][]} array of points + */ + + }], [{ + key: "calculateIconMovePoints", + value: function calculateIconMovePoints(x, y, bounceHeight) { + var deltaHeight = bounceHeight + 1; + var points = []; // Use fast inverse while loop to fill the array + + while (deltaHeight--) { + points[deltaHeight] = [x, y - deltaHeight]; + } + + return points; + } + /** + * Returns calculated array of points for shadow movement. Used to animate markers in browsers + * that doesn't support 'transform' attribute. + * + * @param x {number} x coordinate of original position of the marker + * @param y {number} y coordinate of original position of the marker + * @param bounceHeight {number} height of bouncing (px) + * @param angle {number} shadow inclination angle, if null shadow don't moves from it's initial + * position (radians) + * + * @return {[number, number][]} array of points + */ + + }, { + key: "calculateShadowMovePoints", + value: function calculateShadowMovePoints(x, y, bounceHeight, angle) { + if (angle != null) { + // important: 0 is not null + return (0, _line.calculateLine)(x, y, angle, bounceHeight + 1); + } else { + var points = []; + + for (var i = 0; i <= bounceHeight; i++) { + points[i] = [x, y]; + } + + return points; + } + } + }]); + + return BouncingMotionSimple; +}(_BouncingMotion2["default"]); + +exports["default"] = BouncingMotionSimple; \ No newline at end of file diff --git a/sut/frontend/public/leaflet/smooth_bounce/BouncingOptions.js b/sut/frontend/public/leaflet/smooth_bounce/BouncingOptions.js new file mode 100644 index 0000000..6a377a0 --- /dev/null +++ b/sut/frontend/public/leaflet/smooth_bounce/BouncingOptions.js @@ -0,0 +1,105 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", {writable: false}); + return Constructor; +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, {value: value, enumerable: true, configurable: true, writable: true}); + } else { + obj[key] = value; + } + return obj; +} + +var BouncingOptions = /*#__PURE__*/function () { + /** + * How high marker can bounce (px) + * @type {number} + */ + + /** + * How much marker can contract (px) + * @type {number} + */ + + /** + * Bouncing speed coefficient + * @type {number} + */ + + /** + * Contracting speed coefficient + * @type {number} + */ + + /** + * Shadow inclination angle(radians); null to cancel shadow movement + * @type {number} + */ + + /** + * Activate contract animation + * @type {boolean} + */ + + /** + * Many markers can bounce in the same time + * @type {boolean} + */ + function BouncingOptions(options) { + _classCallCheck(this, BouncingOptions); + + _defineProperty(this, "bounceHeight", 15); + + _defineProperty(this, "contractHeight", 12); + + _defineProperty(this, "bounceSpeed", 52); + + _defineProperty(this, "contractSpeed", 52); + + _defineProperty(this, "shadowAngle", -Math.PI / 4); + + _defineProperty(this, "elastic", true); + + _defineProperty(this, "exclusive", false); + + options && Object.assign(this, options); + } + + _createClass(BouncingOptions, [{ + key: "override", + value: function override(options) { + return Object.assign(new BouncingOptions(this), options); + } + }]); + + return BouncingOptions; +}(); + +exports["default"] = BouncingOptions; \ No newline at end of file diff --git a/sut/frontend/public/leaflet/smooth_bounce/Cache.js b/sut/frontend/public/leaflet/smooth_bounce/Cache.js new file mode 100644 index 0000000..c1361be --- /dev/null +++ b/sut/frontend/public/leaflet/smooth_bounce/Cache.js @@ -0,0 +1,65 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, {value: value, enumerable: true, configurable: true, writable: true}); + } else { + obj[key] = value; + } + return obj; +} + +var Cache = /*#__PURE__*/function () { + function Cache() { + _classCallCheck(this, Cache); + + _defineProperty(this, "cache", {}); + } + + _createClass(Cache, [{ + key: "get", + + /** + * If item with supplied {@code key} is present in cache, returns it, otherwise executes + * {@code supplier} function and caches the result. + * + * @param key {String} key of the cache + * @param supplier {function} item supplier + * @return {Object} item + */ + value: function get(key, supplier) { + return this.cache[key] || (this.cache[key] = supplier.apply()); + } + }]); + + return Cache; +}(); + +exports["default"] = Cache; \ No newline at end of file diff --git a/sut/frontend/public/leaflet/smooth_bounce/MarkerPrototypeExt.js b/sut/frontend/public/leaflet/smooth_bounce/MarkerPrototypeExt.js new file mode 100644 index 0000000..a0e80ad --- /dev/null +++ b/sut/frontend/public/leaflet/smooth_bounce/MarkerPrototypeExt.js @@ -0,0 +1,121 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +var _leaflet = require("leaflet"); + +var _BouncingOptions = _interopRequireDefault(require("./BouncingOptions.js")); + +var _Orchestration = _interopRequireDefault(require("./Orchestration.js")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : {"default": obj}; +} + +var oldSetPos = _leaflet.Marker.prototype._setPos; +var oldOnAdd = _leaflet.Marker.prototype.onAdd; +var oldSetIcon = _leaflet.Marker.prototype.setIcon; +var _default = { + /** Bouncing options shared by all markers. */ + _bouncingOptions: new _BouncingOptions["default"](), + _orchestration: new _Orchestration["default"](), + + /** + * Registers options of bouncing animation for this marker. After registration of options for + * this marker, it will ignore changes of default options. Function automatically recalculates + * animation steps and delays. + * + * @param options {BouncingOptions|object} options object + * @return {Marker} this marker + */ + setBouncingOptions: function setBouncingOptions(options) { + this._bouncingMotion.updateBouncingOptions(options); + + return this; + }, + + /** + * Returns true if this marker is bouncing. If this marker is not bouncing returns false. + * @return {boolean} true if marker is bouncing, false if not + */ + isBouncing: function isBouncing() { + return this._bouncingMotion.isBouncing; + }, + + /** + * Starts bouncing of this marker. + * @param times {number|null} number of times the marker must to bounce + * @return {Marker} this marker + */ + bounce: function bounce() { + var times = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + + this._bouncingMotion.bounce(times); + + var exclusive = this._bouncingMotion.bouncingOptions.exclusive; + + _leaflet.Marker.prototype._orchestration.addBouncingMarker(this, exclusive); + + return this; + }, + + /** + * Stops bouncing of this marker. + * Note: the bouncing not stops immediately after the call of this method. + * Instead, the animation is executed until marker returns to it's original position and takes + * it's full size. + * + * @return {Marker} this marker + */ + stopBouncing: function stopBouncing() { + this._bouncingMotion.stopBouncing(); + + _leaflet.Marker.prototype._orchestration.removeBouncingMarker(this); + + return this; + }, + + /** + * Starts/stops bouncing of this marker. + * @return {Marker} marker + */ + toggleBouncing: function toggleBouncing() { + if (this._bouncingMotion.isBouncing) { + this.stopBouncing(); + } else { + this.bounce(); + } + + return this; + }, + isRealMarker: function isRealMarker() { + return this.__proto__ === _leaflet.Marker.prototype; + }, + _setPos: function _setPos(position) { + oldSetPos.call(this, position); + + if (this.isRealMarker()) { + this._bouncingMotion.position = position; + + this._bouncingMotion.resetStyles(this); + } + }, + onAdd: function onAdd(map) { + oldOnAdd.call(this, map); + + if (this.isRealMarker()) { + this._bouncingMotion.resetStyles(this); + } + }, + setIcon: function setIcon(icon) { + oldSetIcon.call(this, icon); + + if (this.isRealMarker() && this._icon) { + this._bouncingMotion.resetStyles(this); + } + } +}; +exports["default"] = _default; \ No newline at end of file diff --git a/sut/frontend/public/leaflet/smooth_bounce/Matrix3D.js b/sut/frontend/public/leaflet/smooth_bounce/Matrix3D.js new file mode 100644 index 0000000..c06f222 --- /dev/null +++ b/sut/frontend/public/leaflet/smooth_bounce/Matrix3D.js @@ -0,0 +1,166 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); +} + +function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _iterableToArray(iter) { + if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); +} + +function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return _arrayLikeToArray(arr); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + return arr2; +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +function _classPrivateFieldGet(receiver, privateMap) { + var descriptor = privateMap.get(receiver); + if (!descriptor) { + throw new TypeError("attempted to get private field on non-instance"); + } + if (descriptor.get) { + return descriptor.get.call(receiver); + } + return descriptor.value; +} + +function _classPrivateFieldSet(receiver, privateMap, value) { + var descriptor = privateMap.get(receiver); + if (!descriptor) { + throw new TypeError("attempted to set private field on non-instance"); + } + if (descriptor.set) { + descriptor.set.call(receiver, value); + } else { + if (!descriptor.writable) { + throw new TypeError("attempted to set read only private field"); + } + descriptor.value = value; + } + return value; +} + +var rowMap = { + 'a': 0, + 'b': 1, + 'c': 2, + 'd': 3 +}; +var zeros = Array(16).fill(0); +var _identity = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; +/** + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d + */ + +var _matrix = new WeakMap(); + +var Matrix3D = /*#__PURE__*/function () { + function Matrix3D() { + var matrix = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : zeros; + + _classCallCheck(this, Matrix3D); + + _matrix.set(this, { + writable: true, + value: void 0 + }); + + _classPrivateFieldSet(this, _matrix, _toConsumableArray(matrix)); + } + + _createClass(Matrix3D, [{ + key: "toFormat", + value: function toFormat() { + for (var _len = arguments.length, placeholders = new Array(_len), _key = 0; _key < _len; _key++) { + placeholders[_key] = arguments[_key]; + } + + placeholders = placeholders.map(Matrix3D.valueNameToIndex); + var nextPlaceholderIndex = 0; + + var fnBody = _classPrivateFieldGet(this, _matrix).map(function (value, index) { + return index === placeholders[nextPlaceholderIndex] ? "'+arguments[".concat(nextPlaceholderIndex++, "]+'") : value; + }).join(','); + + fnBody = "return ' matrix3d(".concat(fnBody, ") ';"); + + function formatFn() { + return Function.apply(this, [fnBody]); + } + + formatFn.prototype = Function.prototype; + return new formatFn(); + } + }, { + key: "toString", + value: function toString() { + return " matrix3d(".concat(_classPrivateFieldGet(this, _matrix).join(','), ") "); + } + }], [{ + key: "zeros", + value: function zeros() { + return new Matrix3D(); + } + }, { + key: "identity", + value: function identity() { + return new Matrix3D(_identity); + } + }, { + key: "valueNameToIndex", + value: function valueNameToIndex(valueName) { + return rowMap[valueName[0]] * 4 + parseInt(valueName[1]) - 1; + } + }]); + + return Matrix3D; +}(); + +exports["default"] = Matrix3D; \ No newline at end of file diff --git a/sut/frontend/public/leaflet/smooth_bounce/Orchestration.js b/sut/frontend/public/leaflet/smooth_bounce/Orchestration.js new file mode 100644 index 0000000..b9316da --- /dev/null +++ b/sut/frontend/public/leaflet/smooth_bounce/Orchestration.js @@ -0,0 +1,147 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +var _leaflet = require("leaflet"); + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", {writable: false}); + return Constructor; +} + +function _classPrivateFieldInitSpec(obj, privateMap, value) { + _checkPrivateRedeclaration(obj, privateMap); + privateMap.set(obj, value); +} + +function _checkPrivateRedeclaration(obj, privateCollection) { + if (privateCollection.has(obj)) { + throw new TypeError("Cannot initialize the same private elements twice on an object"); + } +} + +function _classPrivateFieldGet(receiver, privateMap) { + var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); + return _classApplyDescriptorGet(receiver, descriptor); +} + +function _classExtractFieldDescriptor(receiver, privateMap, action) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to " + action + " private field on non-instance"); + } + return privateMap.get(receiver); +} + +function _classApplyDescriptorGet(receiver, descriptor) { + if (descriptor.get) { + return descriptor.get.call(receiver); + } + return descriptor.value; +} + +var _bouncingMarkers = /*#__PURE__*/new WeakMap(); + +var Orchestration = /*#__PURE__*/function () { + function Orchestration() { + _classCallCheck(this, Orchestration); + + _classPrivateFieldInitSpec(this, _bouncingMarkers, { + writable: true, + value: [] + }); + } + + _createClass(Orchestration, [{ + key: "getBouncingMarkers", + value: function getBouncingMarkers() { + return _classPrivateFieldGet(this, _bouncingMarkers); + } + /** + * Adds the marker to the list of bouncing markers. + * If flag 'exclusive' is set to true, stops all bouncing markers before. + * + * @param marker {Marker} marker object + * @param exclusive {boolean} flag of exclusive bouncing. If set to true, stops the bouncing + * of all other markers. + */ + + }, { + key: "addBouncingMarker", + value: function addBouncingMarker(marker, exclusive) { + if (exclusive || marker._bouncingMotion.bouncingOptions.exclusive) { + this.stopAllBouncingMarkers(); + } else { + this.stopExclusiveMarkerBouncing(); + } + + _classPrivateFieldGet(this, _bouncingMarkers).push(marker); + } + /** + * Stops the bouncing of exclusive marker. + */ + + }, { + key: "stopExclusiveMarkerBouncing", + value: function stopExclusiveMarkerBouncing() { + var exclusiveMarker = _classPrivateFieldGet(this, _bouncingMarkers).find(function (marker) { + return marker._bouncingMotion.bouncingOptions.exclusive; + }); + + if (exclusiveMarker) { + exclusiveMarker.stopBouncing(); + } + } + /** + * Removes the marker from the list of bouncing markers. + * @param marker {Marker} marker + */ + + }, { + key: "removeBouncingMarker", + value: function removeBouncingMarker(marker) { + var i = _classPrivateFieldGet(this, _bouncingMarkers).indexOf(marker); + + if (~i) { + _classPrivateFieldGet(this, _bouncingMarkers).splice(i, 1); + } + } + /** + * Stops the bouncing of all currently bouncing markers. Purge the array of bouncing markers. + */ + + }, { + key: "stopAllBouncingMarkers", + value: function stopAllBouncingMarkers() { + var marker; + + while (marker = _classPrivateFieldGet(this, _bouncingMarkers).shift()) { + marker.stopBouncing(); + } + } + }]); + + return Orchestration; +}(); + +exports["default"] = Orchestration; \ No newline at end of file diff --git a/sut/frontend/public/leaflet/smooth_bounce/SmoothMarkerBouncing.js b/sut/frontend/public/leaflet/smooth_bounce/SmoothMarkerBouncing.js new file mode 100644 index 0000000..5905b86 --- /dev/null +++ b/sut/frontend/public/leaflet/smooth_bounce/SmoothMarkerBouncing.js @@ -0,0 +1,96 @@ +"use strict"; + +function _typeof(obj) { + "@babel/helpers - typeof"; + return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { + return typeof obj; + } : function (obj) { + return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }, _typeof(obj); +} + +var _leaflet = _interopRequireWildcard(require("leaflet")); + +var _BouncingOptions = _interopRequireDefault(require("./BouncingOptions.js")); + +var _MarkerPrototypeExt = _interopRequireDefault(require("./MarkerPrototypeExt.js")); + +var _BouncingMotionCss = _interopRequireDefault(require("./BouncingMotionCss3.js")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : {"default": obj}; +} + +function _getRequireWildcardCache(nodeInterop) { + if (typeof WeakMap !== "function") return null; + var cacheBabelInterop = new WeakMap(); + var cacheNodeInterop = new WeakMap(); + return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { + return nodeInterop ? cacheNodeInterop : cacheBabelInterop; + })(nodeInterop); +} + +function _interopRequireWildcard(obj, nodeInterop) { + if (!nodeInterop && obj && obj.__esModule) { + return obj; + } + if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { + return {"default": obj}; + } + var cache = _getRequireWildcardCache(nodeInterop); + if (cache && cache.has(obj)) { + return cache.get(obj); + } + var newObj = {}; + var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var key in obj) { + if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { + var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; + if (desc && (desc.get || desc.set)) { + Object.defineProperty(newObj, key, desc); + } else { + newObj[key] = obj[key]; + } + } + } + newObj["default"] = obj; + if (cache) { + cache.set(obj, newObj); + } + return newObj; +} + +_leaflet["default"].Marker.include(_MarkerPrototypeExt["default"]); +/** + * Registers default options of bouncing animation. + * @param options {BouncingOptions|object} object with options + */ + + +_leaflet["default"].Marker.setBouncingOptions = function (options) { + _leaflet.Marker.prototype._bouncingOptions = options instanceof _BouncingOptions["default"] ? options : new _BouncingOptions["default"](options); +}; +/** + * Returns array of currently bouncing markers. + * @return {Marker[]} array of bouncing markers + */ + + +_leaflet["default"].Marker.getBouncingMarkers = function () { + _leaflet.Marker.prototype._orchestration.getBouncingMarkers(); +}; +/** + * Stops the bouncing of all currently bouncing markers. Purge the array of bouncing markers. + */ + + +_leaflet["default"].Marker.stopAllBouncingMarkers = function () { + _leaflet.Marker.prototype._orchestration.stopAllBouncingMarkers(); +}; + +_leaflet["default"].Marker.addInitHook(function () { + if (this.isRealMarker()) { + var bouncingOptions = new _BouncingOptions["default"](_leaflet.Marker.prototype._bouncingOptions); + this._bouncingMotion = new _BouncingMotionCss["default"](this, new _leaflet.Point(0, 0), bouncingOptions); + } +}); \ No newline at end of file diff --git a/sut/frontend/public/leaflet/smooth_bounce/Styles.js b/sut/frontend/public/leaflet/smooth_bounce/Styles.js new file mode 100644 index 0000000..3b9d710 --- /dev/null +++ b/sut/frontend/public/leaflet/smooth_bounce/Styles.js @@ -0,0 +1,106 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", {writable: false}); + return Constructor; +} + +/** Regex to parse style definitions. */ +var regStyle = /([\w-]+): ([^;]+);/g; + +var Styles = /*#__PURE__*/function () { + function Styles(styles) { + _classCallCheck(this, Styles); + + styles && Object.assign(this, styles); + } + + _createClass(Styles, [{ + key: "findOpacity", + value: function findOpacity(options) { + this.opacity = (options === null || options === void 0 ? void 0 : options.opacityWhenUnclustered // used by cluster plugin + ) || (options === null || options === void 0 ? void 0 : options.opacity) || 1; + } + /** + * Creates a copy of styles merged with provided 'styles'. + * @param {Object} styles object with styles to merge + * @return {Styles} copy of styles + */ + + }, { + key: "withStyles", + value: function withStyles(styles) { + var copy = new Styles(this); + copy && Object.assign(copy, styles); + return copy; + } + }, { + key: "toString", + value: function toString() { + return Object.entries(this).map(function (entry) { + return "".concat(entry[0], ": ").concat(entry[1], ";"); + }).join(' '); + } + /** + * Parses cssText attribute into Styles object. + * @param cssText {string} cssText string + * @return {Styles} Styles object + */ + + }], [{ + key: "parse", + value: function parse(cssText) { + var styles = {}; + var match = regStyle.exec(cssText); + + while (match) { + styles[match[1]] = match[2]; + match = regStyle.exec(cssText); + } + + delete styles['z-index']; + delete styles['opacity']; + styles['outline'] = 'none'; + return new Styles(styles); + } + /** + * @param marker {Marker} + */ + + }, { + key: "ofMarker", + value: function ofMarker(marker) { + var styles = Styles.parse(marker._icon.style.cssText); + styles.findOpacity(marker.options); + styles['z-index'] = marker._zIndex; + return styles; + } + }]); + + return Styles; +}(); + +exports["default"] = Styles; \ No newline at end of file diff --git a/sut/frontend/public/leaflet/smooth_bounce/bundle.min.js b/sut/frontend/public/leaflet/smooth_bounce/bundle.min.js new file mode 100644 index 0000000..1395c41 --- /dev/null +++ b/sut/frontend/public/leaflet/smooth_bounce/bundle.min.js @@ -0,0 +1 @@ +!function(M){"use strict";function n(n){return n&&"object"==typeof n&&"default"in n?n:{default:n}}var t=n(M);function o(n,t){if(!(n instanceof t))throw new TypeError("Cannot call a class as a function")}function e(n,t){for(var i=0;in.length)&&(t=n.length);for(var i=0,e=new Array(t);i dy ? dx : -dy) / 2, + e2, + p = [], + i = 0; + + while (true) { + p.push([x, y]); + i++; + if (i === length) break; + e2 = err; + + if (e2 > -dx) { + err -= dy; + x += sx; + } + + if (e2 < dy) { + err += dx; + y += sy; + } + } + + return p; +} \ No newline at end of file diff --git a/sut/frontend/public/logo.png b/sut/frontend/public/logo.png new file mode 100644 index 0000000..1e407d5 Binary files /dev/null and b/sut/frontend/public/logo.png differ diff --git a/sut/frontend/public/logo_background.png b/sut/frontend/public/logo_background.png new file mode 100644 index 0000000..6a99a33 Binary files /dev/null and b/sut/frontend/public/logo_background.png differ diff --git a/sut/frontend/public/logo_old.png b/sut/frontend/public/logo_old.png new file mode 100644 index 0000000..e3eaad4 Binary files /dev/null and b/sut/frontend/public/logo_old.png differ diff --git a/sut/frontend/public/middle-earth-map.svg b/sut/frontend/public/middle-earth-map.svg new file mode 100644 index 0000000..7f3d0d6 --- /dev/null +++ b/sut/frontend/public/middle-earth-map.svg @@ -0,0 +1,65 @@ + + + + + + + Middle-earth + + + + + + Eriador + + + + Misty Mountains + + + + Rhovanion + + + + Mordor + + + + + The Shire + + + + Rivendell + + + + Moria + + + + Lothlórien + + + + Rohan + + + + Mordor + + + + + + + N + + + + + + + 300 Miles + diff --git a/sut/frontend/public/middle-earth-map.webp b/sut/frontend/public/middle-earth-map.webp new file mode 100644 index 0000000..df8728a Binary files /dev/null and b/sut/frontend/public/middle-earth-map.webp differ diff --git a/sut/frontend/public/middle-earth-map/data/markers.json b/sut/frontend/public/middle-earth-map/data/markers.json new file mode 100644 index 0000000..349d68f --- /dev/null +++ b/sut/frontend/public/middle-earth-map/data/markers.json @@ -0,0 +1,707 @@ +[ + { + "title": "Minas Tirith", + "description": "Minas Tirith was originally a fortress, Minas Anor, built in S.A. 3320 by the Faithful Númenóreans. From T.A. 1640 onwards it was the capital of the South-kingdom and the seat of its Kings and ruling Stewards.", + "infoLink": "https://tolkiengateway.net/wiki/Minas_Tirith", + "tags": { + "places": [ + "human" + ], + "quests": [ + "ring" + ] + }, + "x": 3279, + "y": 2707 + }, + { + "title": "Esgaroth (Lake-Town)", + "description": "Lake-Town was the township of the Lake-men in Wilderland. The town was constructed entirely of wood and stood upon wooden pillars sunk into the bed of the Long Lake, as a protection against the dragon Smaug, who dwelt nearby in the Lonely Mountain.", + "infoLink": "https://tolkiengateway.net/wiki/Lake-town", + "tags": { + "places": [ + "human" + ], + "quests": [ + "erebor" + ] + }, + "x": 3418, + "y": 885 + }, + { + "title": "Bree", + "description": "Bree was the chief village of Bree-land, a small wooded region near the intersection of the main north-south and east-west routes through Eriador. Bree-land was the only part of Middle-earth where Men and hobbits dwelt side by side and Bree had a large population of Hobbits.", + "infoLink": "https://tolkiengateway.net/wiki/Bree", + "tags": { + "places": [ + "human", + "hobbit" + ], + "quests": [ + "ring", + "erebor" + ] + }, + "x": 1793, + "y": 1163 + }, + { + "title": "Erebor", + "description": "The Longbeards had control of Erebor since at least the early Second Age. With the awakening of Durin's Bane in the capital of Khazad-dûm, Thráin I led a group of Dwarves to Erebor. Once there, the dwarves dug caves and halls to form an underground city, thus establishing the Kingdom under the Mountain in T.A. 1999.", + "infoLink": "https://tolkiengateway.net/wiki/Erebor", + "tags": { + "places": [ + "dwarven" + ], + "quests": [ + "erebor" + ] + }, + "x": 3405, + "y": 825 + }, + { + "title": "Rivendell", + "sindarinTitle": "Imladris", + "description": "Rivendell was established by Elrond in S.A. 1697 as a refuge from Sauron after the Fall of Eregion. It remained Elrond's seat throughout the remainder of the Second Age and until the end of the Third Age, when he took the White Ship for Valinor.", + "infoLink": "https://tolkiengateway.net/wiki/Rivendell", + "tags": { + "places": [ + "elven" + ], + "quests": [ + "erebor", + "ring" + ] + }, + "x": 2516, + "y": 1123 + }, + { + "title": "Mount Doom", + "sindarinTitle": "Orodruin, Amon Amarth", + "description": "Melkor created Mount Doom in the First Age. When Sauron chose the land of Mordor as his dwelling-place in the Second Age, Orodruin was the reason for his choice. The mountain erupted in S.A. 3429, signalling Sauron's attack on Gondor and it took the name Amon Amarth, \"Mount Doom\". This is where the One Ring was forged by Sauron, and where it was destroyed by Gollum.", + "infoLink": "https://tolkiengateway.net/wiki/Mount_Doom", + "tags": { + "places": [ + "dark" + ], + "quests": [ + "ring" + ] + }, + "x": 3606, + "y": 2603 + }, + { + "title": "Osgiliath", + "description": "Founded by Isildur and Anárion near the end of the Second Age, Osgiliath was designated the capital of the southern Númenórean kingdom in exile, Gondor. It stays so until the King's House was moved to the more secure Minas Anor in T.A. 1640.", + "infoLink": "https://tolkiengateway.net/wiki/Osgiliath", + "tags": { + "places": [ + "human" + ], + "quests": [ + "ring" + ] + }, + "x": 3330, + "y": 2700 + }, + { + "title": "Hobbiton", + "description": "Hobbiton was a hobbit village in the central regions of the Shire, within the borders of the Westfarthing.", + "infoLink": "https://tolkiengateway.net/wiki/Hobbiton", + "tags": { + "places": [ + "hobbit" + ], + "quests": [ + "erebor", + "ring" + ] + }, + "x": 1482, + "y": 1158 + }, + { + "title": "Helm's Deep", + "description": "Helm's Deep was a large valley gorge in the north-western Ered Nimrais (White Mountains) below the Thrihyrne. It was actually the name of the whole defensive system including its major defensive structure, the Hornburg.", + "infoLink": "https://tolkiengateway.net/wiki/Helm's_Deep", + "tags": { + "places": [ + "human" + ], + "quests": [ + "ring" + ] + }, + "x": 2423, + "y": 2321 + }, + { + "title": "Black Gate", + "sindarinTitle": "Morannon", + "description": "The Black Gate was the main entrance into the land of Mordor. It was built by Sauron after he chose Mordor as a land to make into a stronghold in S.A. 1000.", + "infoLink": "https://tolkiengateway.net/wiki/Black_Gate", + "tags": { + "places": [ + "dark" + ], + "quests": [ + "ring" + ] + }, + "x": 3389, + "y": 2377 + }, + { + "title": "Weathertop", + "sindarinTitle": "Amun Sûl", + "description": "In T.A.3018, Amun Sûl was the scene of two fights involving the Nazgûl: one with Gandalf on October 3 and one with the Ring-bearer three days later.", + "infoLink": "https://tolkiengateway.net/wiki/Weathertop", + "tags": { + "places": [ + "human" + ], + "quests": [ + "ring" + ] + }, + "x": 2000, + "y": 1158 + }, + { + "title": "Isengard", + "sindarinTitle": "Angrenost", + "description": "Isengard was one of the three major fortresses of Gondor, and held within it one of the realm's palantíri. In the latter half of the Third Age, the stronghold came into the possession of Saruman, becoming his home and personal domain until his defeat in the War of the Ring.", + "infoLink": "https://tolkiengateway.net/wiki/Isengard", + "tags": { + "places": [ + "dark" + ], + "quests": [ + "ring" + ] + }, + "x": 2335, + "y": 2117 + }, + { + "title": "Barad-dûr", + "description": "Barad-dûr, also known as the Dark Tower, was the chief fortress of Sauron, on the Plateau of Gorgoroth in Mordor. Sauron began to build Barad-dûr in around S.A. 1000, and completed his fortress after 600 years of the construction with the power of the Ring. It was partially destroyed after Sauron's defeat against Isildur, and began to be rebuilt in T.A. 2951.", + "infoLink": "https://tolkiengateway.net/wiki/Barad-dûr", + "tags": { + "places": [ + "dark" + ], + "quests": [ + "ring" + ] + }, + "x": 3750, + "y": 2553 + }, + { + "title": "Edoras", + "description": "Edoras was the capital of Rohan that held the Golden Hall of Meduseld. Rohan's first capital was at Aldburg in the Folde, until King Eorl the Young or his son Brego built Edoras in T.A. 2569. ", + "infoLink": "https://tolkiengateway.net/wiki/Edoras", + "tags": { + "places": [ + "human" + ], + "quests": [ + "ring" + ] + }, + "x": 2589, + "y": 2383 + }, + { + "title": "Moria", + "sindarinTitle": "Khazad-dûm", + "description": "Khazad-dûm was the grandest and most famous of the mansions of the Dwarves. There, for many thousands of years, a thriving Dwarvish community created the greatest city ever known.", + "infoLink": "https://tolkiengateway.net/wiki/Moria", + "tags": { + "places": [ + "dwarven" + ], + "quests": [ + "ring" + ] + }, + "x": 2492, + "y": 1505 + }, + { + "title": "Grey Havens", + "sindarinTitle": "Mithlond", + "description": "Founded by the Elves of Lindon in S.A. 1, the Grey Havens were known for their good harbourage and many ships; these were used by any of the Eldar to leave Middle-earth for Eressëa or Valinor.", + "infoLink": "https://tolkiengateway.net/wiki/Grey_Havens", + "tags": { + "places": [ + "elven" + ], + "quests": [ + "ring" + ] + }, + "x": 1047, + "y": 1186 + }, + { + "title": "Lothlórien", + "description": "Lothlórien (or Lórien) was a kingdom of Silvan Elves on the eastern side of the Hithaeglir. It was considered one of the most beautiful and \"elvish\" places in Middle-earth during the Third Age, and had the only mallorn-trees east of the sea.", + "infoLink": "https://tolkiengateway.net/wiki/Lothlórien", + "tags": { + "places": [ + "elven" + ], + "quests": [ + "ring" + ] + }, + "x": 2666, + "y": 1679 + }, + { + "title": "Elvenking's Hall", + "description": "Elvenking's Hall were a cave system in northern Mirkwood, in which King Thranduil and many of the Elves of Mirkwood lived during most of the Third Age and into the Fourth Age.", + "infoLink": "https://tolkiengateway.net/wiki/Elvenking's_Halls", + "tags": { + "places": [ + "elven" + ], + "quests": [ + "erebor" + ] + }, + "x": 3311, + "y": 849 + }, + { + "title": "Dol Guldur", + "description": "Dol Guldur (\"Hill of Sorcery\" in Sindarin), also called \"the dungeons of the Necromancer\", was a stronghold of Sauron located in the south of Mirkwood.", + "infoLink": "https://tolkiengateway.net/wiki/Dol_Guldur", + "tags": { + "places": [ + "dark" + ], + "quests": [ + "erebor", + "ring" + ] + }, + "x": 3014, + "y": 1629 + }, + { + "title": "Minas Morgul", + "description": "Minas Morgul (originally called Minas Ithil) was the twin city of Minas Tirith before its fall to the forces of Sauron in the Third Age. It then became the stronghold of the Witch-king of Angmar until Sauron's defeat.", + "infoLink": "https://tolkiengateway.net/wiki/Minas_Morgul", + "tags": { + "places": [ + "dark" + ], + "quests": [ + "ring" + ] + }, + "x": 3424, + "y": 2695 + }, + { + "title": "Paths of the Dead", + "description": "The Paths of the Dead was a haunted underground passage through the White Mountains that led from Harrowdale in Rohan to Blackroot Vale in Gondor.", + "infoLink": "https://tolkiengateway.net/wiki/Paths_of_the_Dead", + "tags": { + "places": [ + "human" + ], + "quests": [ + "ring" + ] + }, + "x": 2605, + "y": 2535 + }, + { + "title": "Mount Gram", + "description": "Mount Gram was inhabited by Orcs led by their King Golfimbul. In T.A. 2747 they attacked much of northern Eriador, but were defeated in the Battle of Greenfields.", + "infoLink": "https://tolkiengateway.net/wiki/Mount_Gram", + "tags": { + "places": [ + "dark" + ], + "quests": [ + "erebor" + ] + }, + "x": 2353, + "y": 746 + }, + { + "title": "Carn Dûm", + "description": "Carn Dûm was the chief fortress of the realm of Angmar and the seat of its king until its defeat against the combined armies of Gondor, Lindon and Arnor in T.A. 1974.", + "infoLink": "https://tolkiengateway.net/wiki/Carn_Dûm", + "tags": { + "places": [ + "dark" + ] + }, + "x": 2115, + "y": 523 + }, + { + "title": "Beorn's Hall", + "description": "Beorn's Hall was the home of Beorn, a powerful Skin-changer. Beorn hosted and aided Thorin and Company during their Quest for Erebor.", + "infoLink": "https://tolkiengateway.net/wiki/Beorn's_Hall", + "tags": { + "places": [ + "human" + ], + "quests": [ + "erebor" + ] + }, + "x": 2871, + "y": 1016 + }, + { + "title": "Goblin-town", + "description": "Goblin-town was a Goblin dwelling under the Misty Mountains, which was ruled by the Great Goblin. Goblin-town was a series of tunnels and caverns, which went all the way through the mountains, with a \"back door\" (the Goblin-gate) near the Eagle's Eyrie in Wilderland, which served as a means of escape, and an access to the Wilderland. A cave with a lake was deep beneath Goblin-town yet was connected to the Goblins' tunnels, with one passage leading to the \"back door\".", + "infoLink": "https://tolkiengateway.net/wiki/Goblin-town", + "tags": { + "places": [ + "dark" + ], + "quests": [ + "erebor" + ] + }, + "x": 2647, + "y": 980 + }, + { + "title": "Dale", + "description": "Dale was a great city of the Northmen which was destroyed by Smaug and rebuilt as the capital of a great kingdom after his demise.", + "infoLink": "https://tolkiengateway.net/wiki/Dale", + "tags": { + "places": [ + "human" + ], + "quests": [ + "erebor" + ] + }, + "x": 3430, + "y": 855 + }, + { + "title": "Smaug", + "date": "November 1, T.A. 2941", + "description": "Bard fired a Black Arrow into the vulnerable spot on the dragon's belly. Roaring in fury and pain, Smaug fell from the sky and plummeted into the flaming ruins of Lake-town, his death marked the end of the great dragons in Middle-earth.", + "infoLink": "https://tolkiengateway.net/wiki/Smaug", + "tags": { + "events": [ + "death" + ], + "quests": [ + "erebor" + ] + }, + "x": 3418, + "y": 885 + }, + { + "title": "Battle of Dagorlad", + "date": "3434 of the Second Age", + "description": "The Battle of Dagorlad was fought between the army of the Last Alliance under Gil-galad and Elendil and an army of Orcs and other creatures loyal to Sauron.", + "infoLink": "https://tolkiengateway.net/wiki/Battle_of_Dagorlad", + "tags": { + "events": [ + "battle" + ], + "quests": [ + "other" + ] + }, + "x": 3319, + "y": 2356 + }, + { + "title": "Battle of Isengard", + "date": "3 March, T.A. 3019", + "description": "Spurred on by Meriadoc Brandybuck and Peregrin Took, the Ents, followed by Huorns, invaded the Ring of Isengard from Fangorn Forest. It led the the drowning of Isengard and the defeat of Saruman.", + "infoLink": "https://tolkiengateway.net/wiki/Battle_of_Isengard", + "tags": { + "events": [ + "battle" + ], + "quests": [ + "ring" + ] + }, + "x": 2335, + "y": 2117 + }, + { + "title": "Battle of Five Armies", + "date": "November 23, T.A. 2941", + "description": "The five warring parties were the Goblins and the Wargs against Men, Elves and Dwarves on and near the Lonely Mountain.", + "infoLink": "https://tolkiengateway.net/wiki/Battle_of_Five_Armies", + "tags": { + "events": [ + "battle" + ], + "quests": [ + "erebor" + ] + }, + "x": 3405, + "y": 825 + }, + { + "title": "Thorin, Fíli and Kíli", + "date": "November 23, T.A. 2941", + "description": "When Bilbo regained consciousness, the battle was already over. Thorin II Oakenshield had been mortally wounded on the field, and his nephews Fíli and Kíli died defending him as he lay on the ground.", + "infoLink": "https://tolkiengateway.net/wiki/Battle_of_Five_Armies", + "tags": { + "events": [ + "death" + ], + "quests": [ + "erebor" + ] + }, + "x": 3405, + "y": 825 + }, + { + "title": "Battle of Pelennor Fields", + "date": "15 March, T.A. 3019", + "description": "The Battle of the Pelennor Fields was the greatest battle of the War of the Ring. This battle saw the siege of Minas Tirith by Mordor's troops widely outnumbering the defenders, but resulted in the loss of Sauron's armies after the Witch King was killed in combat.", + "infoLink": "https://tolkiengateway.net/wiki/Battle_of_the_Pelennor_Fields", + "tags": { + "events": [ + "battle" + ], + "quests": [ + "ring" + ] + }, + "x": 3279, + "y": 2707 + }, + { + "title": "Battle of the Morannon", + "date": "25 March, T.A. 3019", + "description": "The Battle of the Morannon was the last major battle against Sauron in the War of the Ring, fought at the Black Gate of Mordor on 25 March T.A. 3019. The army of the West, 6,000 strong by now, led by Aragorn marched on the gate as a diversionary feint to distract Sauron's attention from Frodo and Sam, who were carrying the One Ring through Mordor. It was hoped that Sauron would think Aragorn had the Ring and was now trying to use it to overthrow Mordor.", + "infoLink": "https://tolkiengateway.net/wiki/Battle_of_the_Morannon", + "tags": { + "events": [ + "battle" + ], + "quests": [ + "ring" + ] + }, + "x": 3389, + "y": 2377 + }, + { + "title": "Battle of the Hornburg", + "date": "3-4 March, T.A. 3019", + "description": "The Battle of the Hornburg took place at the mountain fortress of the Hornburg in the valley of Helm's Deep in Rohan. Taking place over the night of the 3-4 March T.A. 3019, it saw the attacking Uruk-hai of Saruman defeated by the Rohirrim led by Théoden and Erkenbrand.", + "infoLink": "https://tolkiengateway.net/wiki/Battle_of_the_Hornburg", + "tags": { + "events": [ + "battle" + ], + "quests": [ + "ring" + ] + }, + "x": 2423, + "y": 2321 + }, + { + "title": "Boromir", + "date": "February 26, T.A. 3019", + "description": "Boromir died at Amon Hen, the westernmost of the three peaks at the southern end of Nen Hithoel. He perished trying to defend Merry and Pippin from Saruman's Orcs, slaying at least 20 of them before perishing after being hit by many arrows.", + "infoLink": "https://tolkiengateway.net/wiki/Boromir", + "tags": { + "events": [ + "death" + ], + "quests": [ + "ring" + ] + }, + "x": 3037, + "y": 2377 + }, + { + "title": "Gandalf the Grey", + "date": "January 25, T.A. 3019", + "description": "Gandalf pursued the Balrog from the deepests dungeons of Moria to Durin's Tower, climbing through the whole Endless Stair, where they fought for three days and two nights. In the end, the Balrog was cast down and it broke the mountain-side as it fell. Gandalf himself died following this ordeal, but was later sent back to Middle-earth with even greater powers as Gandalf the White.", + "infoLink": "https://tolkiengateway.net/wiki/Battle_of_the_Peak", + "tags": { + "events": [ + "death" + ], + "quests": [ + "ring" + ] + }, + "x": 2500, + "y": 1558 + }, + { + "title": "Bilbo stole the Ring from Gollum", + "date": "July 12, T.A. 2941", + "description": "Bilbo picked up a strange golden ring in the dark passages under Goblin-town. He then met Gollum whom defied him to a riddle contest for his life. Bilbo won, but then Gollum went to get his magic ring to kill him anyway. He then discovered that his ring was missing, and understood that Bilbo took it. He chased Bilbo, but Bilbo unwittingly used the ring and escaped his notice.", + "infoLink": "https://tolkiengateway.net/wiki/Bilbo_Baggins#Over_the_Misty_Mountains", + "tags": { + "events": [ + "encounter" + ], + "quests": [ + "erebor" + ] + }, + "x": 2685, + "y": 962 + }, + { + "title": "Merry and Pippin meet Treebeard", + "date": "February 29, T.A. 3019", + "description": "Treebeard discovered Merry and Pippin in Fangorn Forest after they escaped from Saruman's Orcs, and welcomed them to the WellingHall.", + "infoLink": "https://tolkiengateway.net/wiki/Treebeard", + "tags": { + "events": [ + "encounter" + ], + "quests": [ + "ring" + ] + }, + "x": 2460, + "y": 2052 + }, + { + "title": "Tom Bombadil", + "date": "September 26, T.A. 3018", + "description": "Tom Bombadil, a mysterious creature living in the Dark Forst with his wife Goldberry, saved Frodo, Sam, Merry and Pippin from the Old Man Willow, an evil willow who cast a spell on them and trapped Merry and Pippin. He then hosted the hobbits for two nights, during which he told them many tales and songs.", + "infoLink": "https://tolkiengateway.net/wiki/Tom_Bombadil", + "tags": { + "events": [ + "encounter" + ], + "quests": [ + "ring" + ] + }, + "x": 1659, + "y": 1184 + }, + { + "title": "Shelob", + "date": "March 12, T.A. 3019", + "description": "Shelob was born as the last child of the spider-like demon Ungoliant. On March 12 T.A. 3019, Gollum led Sam and Frodo into the tunnels of Shelob's Lair and abandoned them in the dark. He planned that Shelob would eat Sam and Frodo so that he could find the One Ring among the bones and clothes.", + "infoLink": "https://tolkiengateway.net/wiki/Shelob", + "tags": { + "events": [ + "encounter" + ], + "quests": [ + "ring" + ] + }, + "x": 3456, + "y": 2680 + }, + { + "title": "Stone Trolls", + "date": "May 28, T.A. 2941", + "description": "Three Stone Trolls (William, Tom and Bert) captured Bilbo and the Company of Thorin. Thanks to Gandalf who tricked them, they kept fighting over how to cook the dwarves until the sun set up, frozing them into stone statues.", + "infoLink": "https://tolkiengateway.net/wiki/Roast_Mutton", + "tags": { + "events": [ + "encounter" + ], + "quests": [ + "erebor" + ] + }, + "x": 2320, + "y": 1120 + }, + { + "title": "Giant Spiders", + "date": "August, T.A. 2941", + "description": "Giant spiders (Ungolianth's spawns) managed to capture and entangle in webs each of the thirteen Dwarves. Only Bilbo's magic Ring and his Elven blade Sting allowed them to escape from being eaten, before being captured by Thranduil's elves.", + "infoLink": "https://tolkiengateway.net/wiki/Flies_and_Spiders", + "tags": { + "events": [ + "encounter" + ], + "quests": [ + "erebor" + ] + }, + "x": 3250, + "y": 937 + }, + { + "title": "Barrow-wights", + "date": "Septeùber 28, T.A. 3018", + "description": "The Barrow-wights were a kind of undead-like creatures, dead bones animated by evil spirits. Frodo, Sam, Merry an Pippin were trapped in the Barrow-downs by the spells of the Barrow-wights, and were nearly slain by the creatures. They were saved in the last minute by Tom, who seemed to have had complete authority over them.", + "infoLink": "https://tolkiengateway.net/wiki/Barrow-wights", + "tags": { + "events": [ + "encounter" + ], + "quests": [ + "ring" + ] + }, + "x": 1725, + "y": 1200 + }, + { + "title": "Old Man Willow", + "date": "September 26, T.A. 3018", + "description": "Old Man Willow was a willow tree in the Old Forest, who might have been an Ent who had become tree-like, or possibly a Huorn. Old Man Willow cast a spell on the Hobbits, Frodo, Sam, Merry and Pippin, causing them to fall asleep and trying to kill them. They were saved by the timely arrival of Tom Bombadil who knew \"the tune for him\".", + "infoLink": "https://tolkiengateway.net/wiki/Old_Man_Willow", + "tags": { + "events": [ + "encounter" + ], + "quests": [ + "ring" + ] + }, + "x": 1615, + "y": 1225 + }, + { + "title": "Battle of Bywater", + "date": "November 3, T.A. 3019", + "description": "The Battle of Bywater was a battle for control of the Shire and the final battle of the War of the Ring. After he fleed from the Battle of Isengard, Saruman took control over the Shire with a band of ruffians. When Frodo and his companions returned from the Coronation of Elessar, they rallied the hobbits wanting to resist and defeated the ruffians, then confronted Saruman. Wormtongue killed Saruman and was shot dead by the hobbits.", + "infoLink": "https://tolkiengateway.net/wiki/Battle_of_Bywater", + "tags": { + "events": [ + "battle" + ], + "quests": [ + "ring" + ] + }, + "x": 1507, + "y": 1163 + } +] + + diff --git a/sut/frontend/public/middle-earth-map/data/paths.json b/sut/frontend/public/middle-earth-map/data/paths.json new file mode 100644 index 0000000..1b06bfc --- /dev/null +++ b/sut/frontend/public/middle-earth-map/data/paths.json @@ -0,0 +1,21270 @@ +[ + { + "name": "Thorin and Company", + "id": "thorin", + "color": "red", + "distance": "950 miles / 1530 km", + "startDate": "April 27", + "endDate": "November 23, T.A. 2941", + "path": [ + [ + 1486.00, + 1164.00 + ], + [ + 1497.33, + 1177.33 + ], + [ + 1497.33, + 1177.33 + ], + [ + 1497.33, + 1177.33 + ], + [ + 1508.67, + 1174.67 + ], + [ + 1508.67, + 1174.67 + ], + [ + 1508.67, + 1174.67 + ], + [ + 1517.33, + 1168.67 + ], + [ + 1517.33, + 1168.67 + ], + [ + 1517.33, + 1168.67 + ], + [ + 1529.33, + 1162.67 + ], + [ + 1529.33, + 1162.67 + ], + [ + 1529.33, + 1162.67 + ], + [ + 1540.67, + 1158.67 + ], + [ + 1540.67, + 1158.67 + ], + [ + 1540.67, + 1158.67 + ], + [ + 1551.33, + 1154.00 + ], + [ + 1551.33, + 1154.00 + ], + [ + 1551.33, + 1154.00 + ], + [ + 1561.33, + 1151.33 + ], + [ + 1561.33, + 1151.33 + ], + [ + 1561.33, + 1151.33 + ], + [ + 1573.33, + 1148.00 + ], + [ + 1573.33, + 1148.00 + ], + [ + 1573.33, + 1148.00 + ], + [ + 1584.00, + 1143.33 + ], + [ + 1584.00, + 1143.33 + ], + [ + 1584.00, + 1143.33 + ], + [ + 1594.67, + 1142.00 + ], + [ + 1594.67, + 1141.33 + ], + [ + 1594.67, + 1140.67 + ], + [ + 1606.00, + 1136.00 + ], + [ + 1606.00, + 1136.00 + ], + [ + 1606.00, + 1136.00 + ], + [ + 1618.67, + 1132.67 + ], + [ + 1618.67, + 1132.67 + ], + [ + 1618.67, + 1132.67 + ], + [ + 1629.33, + 1132.00 + ], + [ + 1629.33, + 1132.00 + ], + [ + 1629.33, + 1132.00 + ], + [ + 1640.67, + 1130.67 + ], + [ + 1640.67, + 1130.67 + ], + [ + 1640.67, + 1130.67 + ], + [ + 1650.00, + 1128.67 + ], + [ + 1650.00, + 1128.67 + ], + [ + 1650.00, + 1128.67 + ], + [ + 1666.00, + 1128.00 + ], + [ + 1666.00, + 1128.00 + ], + [ + 1666.00, + 1128.00 + ], + [ + 1676.00, + 1128.00 + ], + [ + 1676.00, + 1128.00 + ], + [ + 1676.00, + 1128.00 + ], + [ + 1688.67, + 1127.33 + ], + [ + 1688.67, + 1127.33 + ], + [ + 1688.67, + 1127.33 + ], + [ + 1702.67, + 1127.33 + ], + [ + 1702.67, + 1127.33 + ], + [ + 1702.67, + 1127.33 + ], + [ + 1715.33, + 1128.67 + ], + [ + 1715.33, + 1128.67 + ], + [ + 1715.33, + 1128.67 + ], + [ + 1729.33, + 1132.67 + ], + [ + 1729.33, + 1132.67 + ], + [ + 1729.33, + 1132.67 + ], + [ + 1746.00, + 1136.00 + ], + [ + 1746.00, + 1136.00 + ], + [ + 1746.00, + 1136.00 + ], + [ + 1754.67, + 1139.33 + ], + [ + 1754.67, + 1139.33 + ], + [ + 1754.67, + 1139.33 + ], + [ + 1757.33, + 1152.00 + ], + [ + 1757.33, + 1152.00 + ], + [ + 1757.33, + 1152.00 + ], + [ + 1758.67, + 1162.00 + ], + [ + 1758.67, + 1162.00 + ], + [ + 1758.67, + 1162.00 + ], + [ + 1766.00, + 1171.33 + ], + [ + 1766.00, + 1171.33 + ], + [ + 1766.00, + 1171.33 + ], + [ + 1781.33, + 1172.67 + ], + [ + 1781.33, + 1172.67 + ], + [ + 1781.33, + 1172.67 + ], + [ + 1793.33, + 1170.67 + ], + [ + 1793.33, + 1170.67 + ], + [ + 1793.33, + 1170.67 + ], + [ + 1810.67, + 1168.00 + ], + [ + 1810.67, + 1168.00 + ], + [ + 1810.67, + 1168.00 + ], + [ + 1824.67, + 1167.33 + ], + [ + 1824.67, + 1167.33 + ], + [ + 1824.67, + 1167.33 + ], + [ + 1835.33, + 1162.00 + ], + [ + 1835.33, + 1162.00 + ], + [ + 1835.33, + 1162.00 + ], + [ + 1844.67, + 1158.67 + ], + [ + 1844.67, + 1158.67 + ], + [ + 1844.67, + 1158.67 + ], + [ + 1868.67, + 1162.67 + ], + [ + 1868.67, + 1162.67 + ], + [ + 1868.67, + 1162.67 + ], + [ + 1883.33, + 1164.67 + ], + [ + 1883.33, + 1164.67 + ], + [ + 1883.33, + 1164.67 + ], + [ + 1898.00, + 1168.67 + ], + [ + 1898.00, + 1168.67 + ], + [ + 1898.00, + 1168.67 + ], + [ + 1921.33, + 1175.33 + ], + [ + 1921.33, + 1175.33 + ], + [ + 1921.33, + 1175.33 + ], + [ + 1942.00, + 1178.00 + ], + [ + 1942.00, + 1178.00 + ], + [ + 1942.00, + 1178.00 + ], + [ + 1967.33, + 1178.00 + ], + [ + 1967.33, + 1178.00 + ], + [ + 1967.33, + 1178.00 + ], + [ + 1990.67, + 1176.67 + ], + [ + 1990.67, + 1176.67 + ], + [ + 1990.67, + 1176.67 + ], + [ + 2012.67, + 1172.67 + ], + [ + 2012.67, + 1172.67 + ], + [ + 2012.67, + 1172.67 + ], + [ + 2035.33, + 1166.00 + ], + [ + 2035.33, + 1166.00 + ], + [ + 2035.33, + 1166.00 + ], + [ + 2060.00, + 1160.67 + ], + [ + 2060.00, + 1160.67 + ], + [ + 2060.00, + 1160.67 + ], + [ + 2081.33, + 1153.33 + ], + [ + 2081.33, + 1153.33 + ], + [ + 2081.33, + 1153.33 + ], + [ + 2105.33, + 1146.00 + ], + [ + 2105.33, + 1146.00 + ], + [ + 2105.33, + 1146.00 + ], + [ + 2124.00, + 1140.67 + ], + [ + 2124.00, + 1140.67 + ], + [ + 2124.00, + 1140.67 + ], + [ + 2136.00, + 1138.00 + ], + [ + 2136.00, + 1138.00 + ], + [ + 2136.00, + 1138.00 + ], + [ + 2161.33, + 1134.67 + ], + [ + 2161.33, + 1134.67 + ], + [ + 2161.33, + 1134.67 + ], + [ + 2180.67, + 1132.00 + ], + [ + 2180.67, + 1132.00 + ], + [ + 2180.67, + 1132.00 + ], + [ + 2204.00, + 1128.00 + ], + [ + 2204.00, + 1128.00 + ], + [ + 2204.00, + 1128.00 + ], + [ + 2225.33, + 1125.33 + ], + [ + 2225.33, + 1125.33 + ], + [ + 2225.33, + 1125.33 + ], + [ + 2248.00, + 1128.00 + ], + [ + 2248.00, + 1128.00 + ], + [ + 2248.00, + 1128.00 + ], + [ + 2262.00, + 1128.67 + ], + [ + 2262.00, + 1128.67 + ], + [ + 2262.00, + 1128.67 + ], + [ + 2283.33, + 1131.33 + ], + [ + 2283.33, + 1131.33 + ], + [ + 2283.33, + 1131.33 + ], + [ + 2295.33, + 1121.33 + ], + [ + 2295.33, + 1121.33 + ], + [ + 2295.33, + 1121.33 + ], + [ + 2314.00, + 1097.33 + ], + [ + 2314.00, + 1097.33 + ], + [ + 2314.00, + 1097.33 + ], + [ + 2329.33, + 1112.00 + ], + [ + 2329.33, + 1112.00 + ], + [ + 2329.33, + 1112.00 + ], + [ + 2340.00, + 1128.00 + ], + [ + 2340.00, + 1128.00 + ], + [ + 2340.00, + 1128.00 + ], + [ + 2343.33, + 1138.00 + ], + [ + 2343.33, + 1138.00 + ], + [ + 2343.33, + 1138.00 + ], + [ + 2365.33, + 1141.33 + ], + [ + 2365.33, + 1141.33 + ], + [ + 2365.33, + 1141.33 + ], + [ + 2387.33, + 1144.67 + ], + [ + 2387.33, + 1144.67 + ], + [ + 2387.33, + 1144.67 + ], + [ + 2412.00, + 1148.00 + ], + [ + 2412.00, + 1148.00 + ], + [ + 2412.00, + 1148.00 + ], + [ + 2436.67, + 1150.67 + ], + [ + 2436.67, + 1150.67 + ], + [ + 2436.67, + 1150.67 + ], + [ + 2457.33, + 1153.33 + ], + [ + 2457.33, + 1153.33 + ], + [ + 2457.33, + 1153.33 + ], + [ + 2481.33, + 1154.67 + ], + [ + 2481.33, + 1154.67 + ], + [ + 2481.33, + 1154.67 + ], + [ + 2493.33, + 1154.00 + ], + [ + 2493.33, + 1154.00 + ], + [ + 2493.33, + 1154.00 + ], + [ + 2501.33, + 1142.67 + ], + [ + 2501.33, + 1142.67 + ], + [ + 2501.33, + 1142.67 + ], + [ + 2515.33, + 1130.00 + ], + [ + 2515.33, + 1130.00 + ], + [ + 2515.33, + 1130.00 + ], + [ + 2517.33, + 1113.33 + ], + [ + 2518.00, + 1112.67 + ], + [ + 2518.67, + 1112.00 + ], + [ + 2532.00, + 1104.67 + ], + [ + 2532.67, + 1104.67 + ], + [ + 2533.33, + 1104.67 + ], + [ + 2555.33, + 1100.67 + ], + [ + 2557.33, + 1100.67 + ], + [ + 2559.33, + 1100.67 + ], + [ + 2580.00, + 1100.67 + ], + [ + 2582.00, + 1100.67 + ], + [ + 2584.00, + 1100.67 + ], + [ + 2603.33, + 1097.33 + ], + [ + 2603.33, + 1097.33 + ], + [ + 2603.33, + 1097.33 + ], + [ + 2619.33, + 1098.67 + ], + [ + 2620.67, + 1098.67 + ], + [ + 2622.00, + 1098.67 + ], + [ + 2625.33, + 1084.67 + ], + [ + 2625.33, + 1080.00 + ], + [ + 2625.33, + 1075.33 + ], + [ + 2626.00, + 1064.00 + ], + [ + 2626.00, + 1062.00 + ], + [ + 2626.00, + 1060.00 + ], + [ + 2630.67, + 1046.00 + ], + [ + 2630.67, + 1045.33 + ], + [ + 2630.67, + 1044.67 + ], + [ + 2631.33, + 1024.67 + ], + [ + 2631.33, + 1024.00 + ], + [ + 2631.33, + 1023.33 + ], + [ + 2638.67, + 1000.67 + ], + [ + 2638.67, + 1000.67 + ], + [ + 2638.67, + 1000.67 + ], + [ + 2643.33, + 981.33 + ], + [ + 2643.33, + 981.33 + ], + [ + 2643.33, + 981.33 + ], + [ + 2654.67, + 968.67 + ], + [ + 2654.67, + 968.67 + ], + [ + 2654.67, + 968.67 + ], + [ + 2686.00, + 974.00 + ], + [ + 2686.00, + 974.00 + ], + [ + 2686.00, + 974.00 + ], + [ + 2711.33, + 980.00 + ], + [ + 2711.33, + 980.00 + ], + [ + 2711.33, + 980.00 + ], + [ + 2719.33, + 987.33 + ], + [ + 2719.33, + 987.33 + ], + [ + 2719.33, + 987.33 + ], + [ + 2738.00, + 998.00 + ], + [ + 2738.00, + 998.00 + ], + [ + 2738.00, + 998.00 + ], + [ + 2760.67, + 1003.33 + ], + [ + 2761.33, + 1003.33 + ], + [ + 2762.00, + 1003.33 + ], + [ + 2790.00, + 1008.00 + ], + [ + 2790.00, + 1008.00 + ], + [ + 2790.00, + 1008.00 + ], + [ + 2810.00, + 1011.33 + ], + [ + 2810.00, + 1011.33 + ], + [ + 2810.00, + 1011.33 + ], + [ + 2833.33, + 1014.00 + ], + [ + 2833.33, + 1014.00 + ], + [ + 2833.33, + 1014.00 + ], + [ + 2846.67, + 1016.67 + ], + [ + 2847.33, + 1016.67 + ], + [ + 2848.00, + 1016.67 + ], + [ + 2865.33, + 1017.33 + ], + [ + 2865.33, + 1017.33 + ], + [ + 2865.33, + 1017.33 + ], + [ + 2880.00, + 1018.67 + ], + [ + 2880.00, + 1018.67 + ], + [ + 2880.00, + 1018.67 + ], + [ + 2899.33, + 1020.00 + ], + [ + 2899.33, + 1020.00 + ], + [ + 2899.33, + 1020.00 + ], + [ + 2917.33, + 1020.67 + ], + [ + 2920.00, + 1020.67 + ], + [ + 2922.67, + 1020.67 + ], + [ + 2932.00, + 1022.00 + ], + [ + 2934.00, + 1022.00 + ], + [ + 2936.00, + 1022.00 + ], + [ + 2961.33, + 1023.33 + ], + [ + 2961.33, + 1023.33 + ], + [ + 2961.33, + 1023.33 + ], + [ + 2979.33, + 1026.67 + ], + [ + 2979.33, + 1026.67 + ], + [ + 2979.33, + 1026.67 + ], + [ + 3002.67, + 1018.00 + ], + [ + 3002.67, + 1018.00 + ], + [ + 3002.67, + 1018.00 + ], + [ + 3023.33, + 1010.67 + ], + [ + 3023.33, + 1010.67 + ], + [ + 3023.33, + 1010.67 + ], + [ + 3037.33, + 1004.67 + ], + [ + 3037.33, + 1004.67 + ], + [ + 3037.33, + 1004.67 + ], + [ + 3058.67, + 1002.67 + ], + [ + 3059.33, + 1002.00 + ], + [ + 3060.00, + 1001.33 + ], + [ + 3076.67, + 994.67 + ], + [ + 3076.67, + 994.67 + ], + [ + 3076.67, + 994.67 + ], + [ + 3096.00, + 988.00 + ], + [ + 3096.00, + 988.00 + ], + [ + 3096.00, + 988.00 + ], + [ + 3118.67, + 982.00 + ], + [ + 3118.67, + 982.00 + ], + [ + 3118.67, + 982.00 + ], + [ + 3131.33, + 978.00 + ], + [ + 3131.33, + 978.00 + ], + [ + 3131.33, + 978.00 + ], + [ + 3149.33, + 972.00 + ], + [ + 3149.33, + 972.00 + ], + [ + 3149.33, + 972.00 + ], + [ + 3174.67, + 969.33 + ], + [ + 3174.67, + 968.67 + ], + [ + 3174.67, + 968.00 + ], + [ + 3215.33, + 959.33 + ], + [ + 3215.33, + 959.33 + ], + [ + 3215.33, + 959.33 + ], + [ + 3232.00, + 946.67 + ], + [ + 3232.00, + 946.67 + ], + [ + 3232.00, + 946.67 + ], + [ + 3252.00, + 930.00 + ], + [ + 3252.00, + 929.33 + ], + [ + 3252.00, + 928.67 + ], + [ + 3264.67, + 916.67 + ], + [ + 3264.67, + 916.67 + ], + [ + 3264.67, + 916.67 + ], + [ + 3273.33, + 904.00 + ], + [ + 3273.33, + 904.00 + ], + [ + 3273.33, + 904.00 + ], + [ + 3281.33, + 890.67 + ], + [ + 3281.33, + 890.67 + ], + [ + 3281.33, + 890.67 + ], + [ + 3290.67, + 877.33 + ], + [ + 3290.67, + 877.33 + ], + [ + 3290.67, + 877.33 + ], + [ + 3302.00, + 870.00 + ], + [ + 3302.00, + 870.00 + ], + [ + 3302.00, + 870.00 + ], + [ + 3311.33, + 874.67 + ], + [ + 3311.33, + 874.67 + ], + [ + 3311.33, + 874.67 + ], + [ + 3314.00, + 880.00 + ], + [ + 3314.00, + 880.00 + ], + [ + 3314.00, + 880.00 + ], + [ + 3320.67, + 882.67 + ], + [ + 3320.67, + 882.67 + ], + [ + 3320.67, + 882.67 + ], + [ + 3334.67, + 882.67 + ], + [ + 3335.33, + 882.67 + ], + [ + 3336.00, + 882.67 + ], + [ + 3344.00, + 882.67 + ], + [ + 3344.67, + 883.33 + ], + [ + 3345.33, + 884.00 + ], + [ + 3354.67, + 884.67 + ], + [ + 3355.33, + 884.67 + ], + [ + 3356.00, + 884.67 + ], + [ + 3373.33, + 886.00 + ], + [ + 3373.33, + 886.00 + ], + [ + 3373.33, + 886.00 + ], + [ + 3388.00, + 886.67 + ], + [ + 3388.00, + 886.67 + ], + [ + 3388.00, + 886.67 + ], + [ + 3398.00, + 887.33 + ], + [ + 3398.00, + 887.33 + ], + [ + 3398.00, + 887.33 + ], + [ + 3408.00, + 886.67 + ], + [ + 3408.00, + 886.67 + ], + [ + 3408.00, + 886.67 + ], + [ + 3419.33, + 886.67 + ], + [ + 3419.33, + 886.67 + ], + [ + 3419.33, + 886.67 + ], + [ + 3425.33, + 874.67 + ], + [ + 3425.33, + 874.00 + ], + [ + 3425.33, + 873.33 + ], + [ + 3430.67, + 857.33 + ], + [ + 3430.67, + 857.33 + ], + [ + 3430.67, + 857.33 + ], + [ + 3431.33, + 842.00 + ], + [ + 3431.33, + 842.00 + ], + [ + 3431.33, + 842.00 + ], + [ + 3432.00, + 834.00 + ], + [ + 3432.00, + 834.00 + ], + [ + 3432.00, + 834.00 + ], + [ + 3422.00, + 836.67 + ], + [ + 3421.33, + 836.67 + ], + [ + 3420.67, + 836.67 + ], + [ + 3411.33, + 827.33 + ], + [ + 3411.33, + 827.33 + ], + [ + 3411.33, + 827.33 + ], + [ + 3406.00, + 816.67 + ], + [ + 3406.00, + 816.67 + ] + ] + }, + { + "name": "Frodo & Sam", + "id": "frodo_sam", + "color": "orange", + "distance": "1600 miles / 2600 km", + "startDate": "September 23, T.A. 3018", + "endDate": "March 25, T.A. 3019", + "path": [ + [ + 1484.00, + 1162.00 + ], + [ + 1492.00, + 1176.00 + ], + [ + 1492.00, + 1176.00 + ], + [ + 1492.00, + 1176.00 + ], + [ + 1502.00, + 1184.00 + ], + [ + 1502.00, + 1184.00 + ], + [ + 1502.00, + 1184.00 + ], + [ + 1511.00, + 1195.00 + ], + [ + 1511.00, + 1195.00 + ], + [ + 1511.00, + 1195.00 + ], + [ + 1532.00, + 1207.00 + ], + [ + 1532.00, + 1207.00 + ], + [ + 1532.00, + 1207.00 + ], + [ + 1554.00, + 1217.00 + ], + [ + 1554.00, + 1217.00 + ], + [ + 1554.00, + 1217.00 + ], + [ + 1574.00, + 1220.00 + ], + [ + 1574.00, + 1220.00 + ], + [ + 1574.00, + 1220.00 + ], + [ + 1588.00, + 1221.00 + ], + [ + 1588.00, + 1221.00 + ], + [ + 1588.00, + 1221.00 + ], + [ + 1597.00, + 1213.00 + ], + [ + 1597.00, + 1213.00 + ], + [ + 1597.00, + 1213.00 + ], + [ + 1608.00, + 1208.00 + ], + [ + 1608.00, + 1208.00 + ], + [ + 1608.00, + 1208.00 + ], + [ + 1618.00, + 1208.00 + ], + [ + 1618.00, + 1208.00 + ], + [ + 1618.00, + 1208.00 + ], + [ + 1639.00, + 1208.00 + ], + [ + 1639.00, + 1208.00 + ], + [ + 1639.00, + 1208.00 + ], + [ + 1652.00, + 1207.00 + ], + [ + 1652.00, + 1207.00 + ], + [ + 1652.00, + 1207.00 + ], + [ + 1659.00, + 1204.00 + ], + [ + 1661.00, + 1204.00 + ], + [ + 1663.00, + 1204.00 + ], + [ + 1682.00, + 1201.00 + ], + [ + 1683.00, + 1201.00 + ], + [ + 1684.00, + 1201.00 + ], + [ + 1692.00, + 1199.00 + ], + [ + 1693.00, + 1199.00 + ], + [ + 1694.00, + 1199.00 + ], + [ + 1704.00, + 1201.00 + ], + [ + 1704.00, + 1201.00 + ], + [ + 1704.00, + 1201.00 + ], + [ + 1716.00, + 1200.00 + ], + [ + 1717.00, + 1200.00 + ], + [ + 1718.00, + 1200.00 + ], + [ + 1744.00, + 1201.00 + ], + [ + 1744.00, + 1201.00 + ], + [ + 1744.00, + 1201.00 + ], + [ + 1757.00, + 1202.00 + ], + [ + 1757.00, + 1202.00 + ], + [ + 1757.00, + 1202.00 + ], + [ + 1772.00, + 1209.00 + ], + [ + 1772.00, + 1209.00 + ], + [ + 1772.00, + 1209.00 + ], + [ + 1786.00, + 1215.00 + ], + [ + 1786.00, + 1215.00 + ], + [ + 1786.00, + 1215.00 + ], + [ + 1781.00, + 1200.00 + ], + [ + 1781.00, + 1200.00 + ], + [ + 1781.00, + 1200.00 + ], + [ + 1780.00, + 1187.00 + ], + [ + 1780.00, + 1187.00 + ], + [ + 1780.00, + 1187.00 + ], + [ + 1773.00, + 1176.00 + ], + [ + 1776.00, + 1174.00 + ], + [ + 1779.00, + 1172.00 + ], + [ + 1792.00, + 1160.00 + ], + [ + 1792.00, + 1160.00 + ], + [ + 1792.00, + 1160.00 + ], + [ + 1800.00, + 1150.00 + ], + [ + 1802.00, + 1149.00 + ], + [ + 1804.00, + 1148.00 + ], + [ + 1818.00, + 1134.00 + ], + [ + 1818.00, + 1134.00 + ], + [ + 1818.00, + 1134.00 + ], + [ + 1830.00, + 1129.00 + ], + [ + 1839.00, + 1129.00 + ], + [ + 1848.00, + 1129.00 + ], + [ + 1879.00, + 1132.00 + ], + [ + 1879.00, + 1132.00 + ], + [ + 1879.00, + 1132.00 + ], + [ + 1900.00, + 1132.00 + ], + [ + 1901.00, + 1132.00 + ], + [ + 1902.00, + 1132.00 + ], + [ + 1951.00, + 1133.00 + ], + [ + 1951.00, + 1133.00 + ], + [ + 1951.00, + 1133.00 + ], + [ + 1965.00, + 1137.00 + ], + [ + 1965.00, + 1137.00 + ], + [ + 1965.00, + 1137.00 + ], + [ + 1978.00, + 1145.00 + ], + [ + 1978.00, + 1145.00 + ], + [ + 1978.00, + 1145.00 + ], + [ + 1999.00, + 1151.00 + ], + [ + 1999.00, + 1151.00 + ], + [ + 1999.00, + 1151.00 + ], + [ + 1999.00, + 1169.00 + ], + [ + 1999.00, + 1169.00 + ], + [ + 1999.00, + 1169.00 + ], + [ + 1999.00, + 1178.00 + ], + [ + 2000.00, + 1180.00 + ], + [ + 2001.00, + 1182.00 + ], + [ + 2006.00, + 1189.00 + ], + [ + 2009.00, + 1193.00 + ], + [ + 2012.00, + 1197.00 + ], + [ + 2018.00, + 1197.00 + ], + [ + 2025.00, + 1200.00 + ], + [ + 2032.00, + 1203.00 + ], + [ + 2055.00, + 1204.00 + ], + [ + 2055.00, + 1204.00 + ], + [ + 2055.00, + 1204.00 + ], + [ + 2088.00, + 1204.00 + ], + [ + 2089.00, + 1204.00 + ], + [ + 2090.00, + 1204.00 + ], + [ + 2106.00, + 1200.00 + ], + [ + 2108.00, + 1200.00 + ], + [ + 2110.00, + 1200.00 + ], + [ + 2129.00, + 1199.00 + ], + [ + 2134.00, + 1197.00 + ], + [ + 2139.00, + 1195.00 + ], + [ + 2168.00, + 1193.00 + ], + [ + 2172.00, + 1191.00 + ], + [ + 2176.00, + 1189.00 + ], + [ + 2184.00, + 1178.00 + ], + [ + 2190.00, + 1175.00 + ], + [ + 2196.00, + 1172.00 + ], + [ + 2208.00, + 1166.00 + ], + [ + 2211.00, + 1165.00 + ], + [ + 2214.00, + 1164.00 + ], + [ + 2222.00, + 1157.00 + ], + [ + 2226.00, + 1155.00 + ], + [ + 2230.00, + 1153.00 + ], + [ + 2240.00, + 1147.00 + ], + [ + 2243.00, + 1145.00 + ], + [ + 2246.00, + 1143.00 + ], + [ + 2262.00, + 1136.00 + ], + [ + 2262.00, + 1136.00 + ], + [ + 2262.00, + 1136.00 + ], + [ + 2273.00, + 1133.00 + ], + [ + 2274.00, + 1133.00 + ], + [ + 2275.00, + 1133.00 + ], + [ + 2287.00, + 1117.00 + ], + [ + 2287.00, + 1117.00 + ], + [ + 2287.00, + 1117.00 + ], + [ + 2289.00, + 1115.00 + ], + [ + 2293.00, + 1109.00 + ], + [ + 2297.00, + 1103.00 + ], + [ + 2304.00, + 1097.00 + ], + [ + 2304.00, + 1096.00 + ], + [ + 2304.00, + 1095.00 + ], + [ + 2306.00, + 1094.00 + ], + [ + 2309.00, + 1086.00 + ], + [ + 2312.00, + 1078.00 + ], + [ + 2324.00, + 1055.00 + ], + [ + 2324.00, + 1055.00 + ], + [ + 2324.00, + 1055.00 + ], + [ + 2334.00, + 1045.00 + ], + [ + 2334.00, + 1045.00 + ], + [ + 2334.00, + 1045.00 + ], + [ + 2336.00, + 1059.00 + ], + [ + 2335.00, + 1060.00 + ], + [ + 2334.00, + 1061.00 + ], + [ + 2331.00, + 1072.00 + ], + [ + 2331.00, + 1073.00 + ], + [ + 2331.00, + 1074.00 + ], + [ + 2328.00, + 1079.00 + ], + [ + 2328.00, + 1084.00 + ], + [ + 2328.00, + 1089.00 + ], + [ + 2336.00, + 1109.00 + ], + [ + 2337.00, + 1109.00 + ], + [ + 2338.00, + 1109.00 + ], + [ + 2338.00, + 1110.00 + ], + [ + 2339.00, + 1115.00 + ], + [ + 2351.00, + 1129.00 + ], + [ + 2360.00, + 1132.00 + ], + [ + 2361.00, + 1133.00 + ], + [ + 2362.00, + 1134.00 + ], + [ + 2385.00, + 1144.00 + ], + [ + 2385.00, + 1144.00 + ], + [ + 2385.00, + 1144.00 + ], + [ + 2391.00, + 1145.00 + ], + [ + 2395.00, + 1145.00 + ], + [ + 2399.00, + 1145.00 + ], + [ + 2404.00, + 1145.00 + ], + [ + 2407.00, + 1146.00 + ], + [ + 2410.00, + 1147.00 + ], + [ + 2421.00, + 1145.00 + ], + [ + 2421.00, + 1145.00 + ], + [ + 2421.00, + 1145.00 + ], + [ + 2443.00, + 1148.00 + ], + [ + 2443.00, + 1148.00 + ], + [ + 2443.00, + 1148.00 + ], + [ + 2453.00, + 1149.00 + ], + [ + 2454.00, + 1150.00 + ], + [ + 2455.00, + 1151.00 + ], + [ + 2470.00, + 1151.00 + ], + [ + 2470.00, + 1151.00 + ], + [ + 2470.00, + 1151.00 + ], + [ + 2484.00, + 1156.00 + ], + [ + 2484.00, + 1156.00 + ], + [ + 2484.00, + 1156.00 + ], + [ + 2492.00, + 1152.00 + ], + [ + 2492.00, + 1152.00 + ], + [ + 2492.00, + 1152.00 + ], + [ + 2507.00, + 1148.00 + ], + [ + 2507.00, + 1148.00 + ], + [ + 2507.00, + 1148.00 + ], + [ + 2514.00, + 1133.00 + ], + [ + 2514.00, + 1133.00 + ], + [ + 2501.00, + 1163.00 + ], + [ + 2500.00, + 1164.00 + ], + [ + 2505.00, + 1179.00 + ], + [ + 2505.00, + 1179.00 + ], + [ + 2505.00, + 1179.00 + ], + [ + 2510.00, + 1190.00 + ], + [ + 2510.00, + 1190.00 + ], + [ + 2510.00, + 1190.00 + ], + [ + 2515.00, + 1203.00 + ], + [ + 2516.00, + 1207.00 + ], + [ + 2517.00, + 1211.00 + ], + [ + 2509.00, + 1232.00 + ], + [ + 2509.00, + 1232.00 + ], + [ + 2509.00, + 1232.00 + ], + [ + 2509.00, + 1234.00 + ], + [ + 2507.00, + 1238.00 + ], + [ + 2505.00, + 1242.00 + ], + [ + 2494.00, + 1272.00 + ], + [ + 2492.00, + 1274.00 + ], + [ + 2490.00, + 1276.00 + ], + [ + 2493.00, + 1282.00 + ], + [ + 2491.00, + 1288.00 + ], + [ + 2471.00, + 1332.00 + ], + [ + 2473.00, + 1333.00 + ], + [ + 2470.00, + 1341.00 + ], + [ + 2467.00, + 1349.00 + ], + [ + 2466.00, + 1349.00 + ], + [ + 2463.00, + 1356.00 + ], + [ + 2457.00, + 1368.00 + ], + [ + 2448.00, + 1377.00 + ], + [ + 2448.00, + 1377.00 + ], + [ + 2448.00, + 1377.00 + ], + [ + 2462.00, + 1388.00 + ], + [ + 2462.00, + 1388.00 + ], + [ + 2462.00, + 1388.00 + ], + [ + 2485.00, + 1394.00 + ], + [ + 2485.00, + 1394.00 + ], + [ + 2485.00, + 1394.00 + ], + [ + 2499.00, + 1399.00 + ], + [ + 2501.00, + 1399.00 + ], + [ + 2503.00, + 1399.00 + ], + [ + 2517.00, + 1403.00 + ], + [ + 2516.00, + 1404.00 + ], + [ + 2515.00, + 1405.00 + ], + [ + 2498.00, + 1405.00 + ], + [ + 2498.00, + 1405.00 + ], + [ + 2498.00, + 1405.00 + ], + [ + 2484.00, + 1405.00 + ], + [ + 2476.00, + 1403.00 + ], + [ + 2468.00, + 1401.00 + ], + [ + 2465.00, + 1401.00 + ], + [ + 2460.00, + 1402.00 + ], + [ + 2455.00, + 1403.00 + ], + [ + 2441.00, + 1405.00 + ], + [ + 2440.00, + 1407.00 + ], + [ + 2439.00, + 1409.00 + ], + [ + 2436.00, + 1416.00 + ], + [ + 2434.00, + 1420.00 + ], + [ + 2432.00, + 1424.00 + ], + [ + 2427.00, + 1438.00 + ], + [ + 2426.00, + 1439.00 + ], + [ + 2425.00, + 1440.00 + ], + [ + 2421.00, + 1450.00 + ], + [ + 2419.00, + 1454.00 + ], + [ + 2417.00, + 1458.00 + ], + [ + 2411.00, + 1469.00 + ], + [ + 2410.00, + 1472.00 + ], + [ + 2409.00, + 1475.00 + ], + [ + 2405.00, + 1481.00 + ], + [ + 2403.00, + 1489.00 + ], + [ + 2401.00, + 1497.00 + ], + [ + 2400.00, + 1506.00 + ], + [ + 2399.00, + 1508.00 + ], + [ + 2398.00, + 1510.00 + ], + [ + 2394.00, + 1524.00 + ], + [ + 2394.00, + 1527.00 + ], + [ + 2394.00, + 1530.00 + ], + [ + 2401.00, + 1534.00 + ], + [ + 2404.00, + 1536.00 + ], + [ + 2407.00, + 1538.00 + ], + [ + 2426.00, + 1541.00 + ], + [ + 2427.00, + 1541.00 + ], + [ + 2428.00, + 1541.00 + ], + [ + 2439.00, + 1539.00 + ], + [ + 2439.00, + 1539.00 + ], + [ + 2439.00, + 1539.00 + ], + [ + 2457.00, + 1538.00 + ], + [ + 2457.00, + 1538.00 + ], + [ + 2457.00, + 1538.00 + ], + [ + 2469.00, + 1534.00 + ], + [ + 2473.00, + 1534.00 + ], + [ + 2477.00, + 1534.00 + ], + [ + 2503.00, + 1536.00 + ], + [ + 2503.00, + 1536.00 + ], + [ + 2503.00, + 1536.00 + ], + [ + 2512.00, + 1535.00 + ], + [ + 2513.00, + 1535.00 + ], + [ + 2514.00, + 1535.00 + ], + [ + 2526.00, + 1538.00 + ], + [ + 2526.00, + 1538.00 + ], + [ + 2526.00, + 1538.00 + ], + [ + 2536.00, + 1544.00 + ], + [ + 2537.00, + 1545.00 + ], + [ + 2538.00, + 1546.00 + ], + [ + 2551.00, + 1557.00 + ], + [ + 2551.00, + 1557.00 + ], + [ + 2551.00, + 1557.00 + ], + [ + 2558.00, + 1574.00 + ], + [ + 2558.00, + 1574.00 + ], + [ + 2558.00, + 1574.00 + ], + [ + 2565.00, + 1594.00 + ], + [ + 2565.00, + 1594.00 + ], + [ + 2565.00, + 1594.00 + ], + [ + 2576.00, + 1604.00 + ], + [ + 2576.00, + 1604.00 + ], + [ + 2576.00, + 1604.00 + ], + [ + 2593.00, + 1611.00 + ], + [ + 2593.00, + 1611.00 + ], + [ + 2593.00, + 1611.00 + ], + [ + 2601.00, + 1628.00 + ], + [ + 2601.00, + 1628.00 + ], + [ + 2601.00, + 1628.00 + ], + [ + 2598.00, + 1646.00 + ], + [ + 2598.00, + 1647.00 + ], + [ + 2598.00, + 1648.00 + ], + [ + 2611.00, + 1652.00 + ], + [ + 2612.00, + 1653.00 + ], + [ + 2613.00, + 1654.00 + ], + [ + 2624.00, + 1666.00 + ], + [ + 2624.00, + 1667.00 + ], + [ + 2624.00, + 1668.00 + ], + [ + 2632.00, + 1676.00 + ], + [ + 2634.00, + 1678.00 + ], + [ + 2636.00, + 1680.00 + ], + [ + 2644.00, + 1684.00 + ], + [ + 2645.00, + 1685.00 + ], + [ + 2646.00, + 1686.00 + ], + [ + 2658.00, + 1694.00 + ], + [ + 2659.00, + 1694.00 + ], + [ + 2660.00, + 1694.00 + ], + [ + 2673.00, + 1700.00 + ], + [ + 2673.00, + 1700.00 + ], + [ + 2673.00, + 1700.00 + ], + [ + 2696.00, + 1713.00 + ], + [ + 2696.00, + 1713.00 + ], + [ + 2696.00, + 1713.00 + ], + [ + 2720.00, + 1723.00 + ], + [ + 2720.00, + 1723.00 + ], + [ + 2720.00, + 1723.00 + ], + [ + 2744.00, + 1727.00 + ], + [ + 2744.00, + 1728.00 + ], + [ + 2744.00, + 1729.00 + ], + [ + 2770.00, + 1732.00 + ], + [ + 2770.00, + 1732.00 + ], + [ + 2770.00, + 1732.00 + ], + [ + 2787.00, + 1745.00 + ], + [ + 2787.00, + 1746.00 + ], + [ + 2787.00, + 1747.00 + ], + [ + 2778.00, + 1761.00 + ], + [ + 2784.00, + 1767.00 + ], + [ + 2790.00, + 1773.00 + ], + [ + 2791.00, + 1784.00 + ], + [ + 2791.00, + 1786.00 + ], + [ + 2791.00, + 1788.00 + ], + [ + 2794.00, + 1803.00 + ], + [ + 2794.00, + 1803.00 + ], + [ + 2794.00, + 1803.00 + ], + [ + 2799.00, + 1810.00 + ], + [ + 2801.00, + 1811.00 + ], + [ + 2803.00, + 1812.00 + ], + [ + 2815.00, + 1819.00 + ], + [ + 2818.00, + 1820.00 + ], + [ + 2821.00, + 1821.00 + ], + [ + 2836.00, + 1827.00 + ], + [ + 2837.00, + 1828.00 + ], + [ + 2838.00, + 1829.00 + ], + [ + 2849.00, + 1837.00 + ], + [ + 2850.00, + 1837.00 + ], + [ + 2851.00, + 1837.00 + ], + [ + 2864.00, + 1845.00 + ], + [ + 2866.00, + 1847.00 + ], + [ + 2868.00, + 1849.00 + ], + [ + 2876.00, + 1854.00 + ], + [ + 2881.00, + 1858.00 + ], + [ + 2886.00, + 1862.00 + ], + [ + 2899.00, + 1873.00 + ], + [ + 2900.00, + 1874.00 + ], + [ + 2901.00, + 1875.00 + ], + [ + 2907.00, + 1879.00 + ], + [ + 2910.00, + 1880.00 + ], + [ + 2913.00, + 1881.00 + ], + [ + 2934.00, + 1888.00 + ], + [ + 2934.00, + 1888.00 + ], + [ + 2934.00, + 1888.00 + ], + [ + 2939.00, + 1886.00 + ], + [ + 2943.00, + 1890.00 + ], + [ + 2947.00, + 1894.00 + ], + [ + 2956.00, + 1900.00 + ], + [ + 2956.00, + 1901.00 + ], + [ + 2956.00, + 1902.00 + ], + [ + 2955.00, + 1909.00 + ], + [ + 2955.00, + 1910.00 + ], + [ + 2955.00, + 1911.00 + ], + [ + 2950.00, + 1920.00 + ], + [ + 2949.00, + 1922.00 + ], + [ + 2948.00, + 1924.00 + ], + [ + 2941.00, + 1932.00 + ], + [ + 2941.00, + 1934.00 + ], + [ + 2941.00, + 1936.00 + ], + [ + 2938.00, + 1957.00 + ], + [ + 2938.00, + 1957.00 + ], + [ + 2938.00, + 1957.00 + ], + [ + 2944.00, + 1967.00 + ], + [ + 2945.00, + 1969.00 + ], + [ + 2946.00, + 1971.00 + ], + [ + 2948.00, + 1976.00 + ], + [ + 2954.00, + 1980.00 + ], + [ + 2960.00, + 1984.00 + ], + [ + 2966.00, + 1985.00 + ], + [ + 2966.00, + 1985.00 + ], + [ + 2966.00, + 1985.00 + ], + [ + 2973.00, + 1985.00 + ], + [ + 2973.00, + 1985.00 + ], + [ + 2973.00, + 1985.00 + ], + [ + 2990.00, + 1983.00 + ], + [ + 2990.00, + 1983.00 + ], + [ + 2990.00, + 1983.00 + ], + [ + 3007.00, + 1976.00 + ], + [ + 3007.00, + 1976.00 + ], + [ + 3007.00, + 1976.00 + ], + [ + 3027.00, + 1984.00 + ], + [ + 3027.00, + 1985.00 + ], + [ + 3027.00, + 1986.00 + ], + [ + 3031.00, + 1999.00 + ], + [ + 3031.00, + 2001.00 + ], + [ + 3031.00, + 2003.00 + ], + [ + 3022.00, + 2020.00 + ], + [ + 3021.00, + 2021.00 + ], + [ + 3020.00, + 2022.00 + ], + [ + 3011.00, + 2038.00 + ], + [ + 3010.00, + 2039.00 + ], + [ + 3009.00, + 2040.00 + ], + [ + 3003.00, + 2048.00 + ], + [ + 3003.00, + 2052.00 + ], + [ + 3003.00, + 2056.00 + ], + [ + 3004.00, + 2070.00 + ], + [ + 3005.00, + 2071.00 + ], + [ + 3006.00, + 2072.00 + ], + [ + 3025.00, + 2081.00 + ], + [ + 3025.00, + 2081.00 + ], + [ + 3025.00, + 2081.00 + ], + [ + 3043.00, + 2090.00 + ], + [ + 3043.00, + 2090.00 + ], + [ + 3043.00, + 2090.00 + ], + [ + 3054.00, + 2100.00 + ], + [ + 3054.00, + 2100.00 + ], + [ + 3054.00, + 2100.00 + ], + [ + 3054.00, + 2113.00 + ], + [ + 3054.00, + 2114.00 + ], + [ + 3054.00, + 2115.00 + ], + [ + 3053.00, + 2130.00 + ], + [ + 3052.00, + 2131.00 + ], + [ + 3051.00, + 2132.00 + ], + [ + 3046.00, + 2149.00 + ], + [ + 3046.00, + 2150.00 + ], + [ + 3046.00, + 2151.00 + ], + [ + 3043.00, + 2164.00 + ], + [ + 3043.00, + 2164.00 + ], + [ + 3043.00, + 2164.00 + ], + [ + 3039.00, + 2176.00 + ], + [ + 3039.00, + 2177.00 + ], + [ + 3039.00, + 2178.00 + ], + [ + 3034.00, + 2188.00 + ], + [ + 3033.00, + 2191.00 + ], + [ + 3032.00, + 2194.00 + ], + [ + 3030.00, + 2208.00 + ], + [ + 3029.00, + 2212.00 + ], + [ + 3028.00, + 2216.00 + ], + [ + 3024.00, + 2226.00 + ], + [ + 3024.00, + 2229.00 + ], + [ + 3024.00, + 2232.00 + ], + [ + 3028.00, + 2247.00 + ], + [ + 3028.00, + 2250.00 + ], + [ + 3028.00, + 2253.00 + ], + [ + 3031.00, + 2267.00 + ], + [ + 3031.00, + 2269.00 + ], + [ + 3031.00, + 2271.00 + ], + [ + 3033.00, + 2283.00 + ], + [ + 3035.00, + 2286.00 + ], + [ + 3037.00, + 2289.00 + ], + [ + 3039.00, + 2303.00 + ], + [ + 3039.00, + 2303.00 + ], + [ + 3039.00, + 2303.00 + ], + [ + 3042.00, + 2321.00 + ], + [ + 3042.00, + 2321.00 + ], + [ + 3042.00, + 2321.00 + ], + [ + 3045.00, + 2343.00 + ], + [ + 3045.00, + 2346.00 + ], + [ + 3045.00, + 2349.00 + ], + [ + 3053.00, + 2366.00 + ], + [ + 3053.00, + 2367.00 + ], + [ + 3053.00, + 2368.00 + ], + [ + 3068.00, + 2372.00 + ], + [ + 3070.00, + 2371.00 + ], + [ + 3072.00, + 2370.00 + ], + [ + 3096.00, + 2355.00 + ], + [ + 3097.00, + 2353.00 + ], + [ + 3098.00, + 2351.00 + ], + [ + 3100.00, + 2351.00 + ], + [ + 3105.00, + 2342.00 + ], + [ + 3110.00, + 2333.00 + ], + [ + 3113.00, + 2320.00 + ], + [ + 3116.00, + 2317.00 + ], + [ + 3119.00, + 2314.00 + ], + [ + 3123.00, + 2310.00 + ], + [ + 3128.00, + 2303.00 + ], + [ + 3133.00, + 2296.00 + ], + [ + 3137.00, + 2288.00 + ], + [ + 3142.00, + 2284.00 + ], + [ + 3147.00, + 2280.00 + ], + [ + 3150.00, + 2274.00 + ], + [ + 3153.00, + 2273.00 + ], + [ + 3156.00, + 2272.00 + ], + [ + 3154.00, + 2270.00 + ], + [ + 3165.00, + 2269.00 + ], + [ + 3186.00, + 2268.00 + ], + [ + 3191.00, + 2268.00 + ], + [ + 3198.00, + 2273.00 + ], + [ + 3205.00, + 2278.00 + ], + [ + 3212.00, + 2278.00 + ], + [ + 3219.00, + 2284.00 + ], + [ + 3237.00, + 2300.00 + ], + [ + 3242.00, + 2303.00 + ], + [ + 3250.00, + 2308.00 + ], + [ + 3258.00, + 2313.00 + ], + [ + 3261.00, + 2317.00 + ], + [ + 3270.00, + 2322.00 + ], + [ + 3279.00, + 2327.00 + ], + [ + 3285.00, + 2329.00 + ], + [ + 3287.00, + 2330.00 + ], + [ + 3289.00, + 2331.00 + ], + [ + 3307.00, + 2338.00 + ], + [ + 3307.00, + 2338.00 + ], + [ + 3307.00, + 2338.00 + ], + [ + 3314.00, + 2348.00 + ], + [ + 3318.00, + 2349.00 + ], + [ + 3327.00, + 2352.00 + ], + [ + 3334.00, + 2356.00 + ], + [ + 3337.00, + 2357.00 + ], + [ + 3344.00, + 2360.00 + ], + [ + 3355.00, + 2368.00 + ], + [ + 3355.00, + 2368.00 + ], + [ + 3355.00, + 2368.00 + ], + [ + 3342.00, + 2383.00 + ], + [ + 3342.00, + 2383.00 + ], + [ + 3342.00, + 2383.00 + ], + [ + 3330.00, + 2397.00 + ], + [ + 3330.00, + 2398.00 + ], + [ + 3330.00, + 2399.00 + ], + [ + 3320.00, + 2420.00 + ], + [ + 3320.00, + 2422.00 + ], + [ + 3320.00, + 2424.00 + ], + [ + 3315.00, + 2446.00 + ], + [ + 3315.00, + 2447.00 + ], + [ + 3315.00, + 2448.00 + ], + [ + 3315.00, + 2461.00 + ], + [ + 3316.00, + 2464.00 + ], + [ + 3317.00, + 2467.00 + ], + [ + 3316.00, + 2490.00 + ], + [ + 3316.00, + 2490.00 + ], + [ + 3316.00, + 2490.00 + ], + [ + 3317.00, + 2516.00 + ], + [ + 3317.00, + 2516.00 + ], + [ + 3317.00, + 2516.00 + ], + [ + 3318.00, + 2525.00 + ], + [ + 3318.00, + 2529.00 + ], + [ + 3318.00, + 2533.00 + ], + [ + 3319.00, + 2547.00 + ], + [ + 3321.00, + 2551.00 + ], + [ + 3323.00, + 2555.00 + ], + [ + 3330.00, + 2566.00 + ], + [ + 3331.00, + 2573.00 + ], + [ + 3332.00, + 2580.00 + ], + [ + 3334.00, + 2593.00 + ], + [ + 3334.00, + 2599.00 + ], + [ + 3334.00, + 2605.00 + ], + [ + 3336.00, + 2608.00 + ], + [ + 3337.00, + 2613.00 + ], + [ + 3338.00, + 2618.00 + ], + [ + 3340.00, + 2622.00 + ], + [ + 3340.00, + 2628.00 + ], + [ + 3340.00, + 2634.00 + ], + [ + 3345.00, + 2652.00 + ], + [ + 3345.00, + 2653.00 + ], + [ + 3345.00, + 2662.00 + ], + [ + 3351.00, + 2668.00 + ], + [ + 3352.00, + 2668.00 + ], + [ + 3353.00, + 2668.00 + ], + [ + 3377.00, + 2672.00 + ], + [ + 3378.00, + 2672.00 + ], + [ + 3379.00, + 2672.00 + ], + [ + 3397.00, + 2671.00 + ], + [ + 3400.00, + 2670.00 + ], + [ + 3403.00, + 2669.00 + ], + [ + 3406.00, + 2668.00 + ], + [ + 3409.00, + 2668.00 + ], + [ + 3412.00, + 2668.00 + ], + [ + 3424.00, + 2670.00 + ], + [ + 3428.00, + 2671.00 + ], + [ + 3432.00, + 2672.00 + ], + [ + 3439.00, + 2673.00 + ], + [ + 3440.00, + 2673.00 + ], + [ + 3441.00, + 2673.00 + ], + [ + 3443.00, + 2675.00 + ], + [ + 3447.00, + 2674.00 + ], + [ + 3451.00, + 2673.00 + ], + [ + 3450.00, + 2653.00 + ], + [ + 3450.00, + 2653.00 + ], + [ + 3450.00, + 2653.00 + ], + [ + 3449.00, + 2646.00 + ], + [ + 3447.00, + 2643.00 + ], + [ + 3445.00, + 2640.00 + ], + [ + 3440.00, + 2634.00 + ], + [ + 3436.00, + 2629.00 + ], + [ + 3432.00, + 2624.00 + ], + [ + 3428.00, + 2616.00 + ], + [ + 3428.00, + 2615.00 + ], + [ + 3428.00, + 2614.00 + ], + [ + 3426.00, + 2605.00 + ], + [ + 3425.00, + 2596.00 + ], + [ + 3422.00, + 2578.00 + ], + [ + 3422.00, + 2575.00 + ], + [ + 3418.00, + 2565.00 + ], + [ + 3414.00, + 2555.00 + ], + [ + 3413.00, + 2549.00 + ], + [ + 3412.00, + 2545.00 + ], + [ + 3411.00, + 2541.00 + ], + [ + 3410.00, + 2534.00 + ], + [ + 3411.00, + 2530.00 + ], + [ + 3449.00, + 2518.00 + ], + [ + 3448.00, + 2517.00 + ], + [ + 3456.00, + 2517.00 + ], + [ + 3464.00, + 2517.00 + ], + [ + 3476.00, + 2517.00 + ], + [ + 3480.00, + 2518.00 + ], + [ + 3484.00, + 2519.00 + ], + [ + 3489.00, + 2520.00 + ], + [ + 3493.00, + 2519.00 + ], + [ + 3502.00, + 2512.00 + ], + [ + 3503.00, + 2512.00 + ], + [ + 3503.00, + 2505.00 + ], + [ + 3503.00, + 2489.00 + ], + [ + 3508.00, + 2484.00 + ], + [ + 3508.00, + 2484.00 + ], + [ + 3508.00, + 2484.00 + ], + [ + 3521.00, + 2482.00 + ], + [ + 3526.00, + 2481.00 + ], + [ + 3531.00, + 2480.00 + ], + [ + 3539.00, + 2481.00 + ], + [ + 3540.00, + 2480.00 + ], + [ + 3541.00, + 2479.00 + ], + [ + 3544.00, + 2478.00 + ], + [ + 3552.00, + 2479.00 + ], + [ + 3560.00, + 2480.00 + ], + [ + 3570.00, + 2481.00 + ], + [ + 3574.00, + 2482.00 + ], + [ + 3578.00, + 2483.00 + ], + [ + 3588.00, + 2484.00 + ], + [ + 3594.00, + 2485.00 + ], + [ + 3600.00, + 2486.00 + ], + [ + 3612.00, + 2486.00 + ], + [ + 3612.00, + 2486.00 + ], + [ + 3612.00, + 2486.00 + ], + [ + 3617.00, + 2488.00 + ], + [ + 3620.00, + 2492.00 + ], + [ + 3623.00, + 2496.00 + ], + [ + 3624.00, + 2496.00 + ], + [ + 3625.00, + 2503.00 + ], + [ + 3626.00, + 2510.00 + ], + [ + 3626.00, + 2510.00 + ], + [ + 3625.00, + 2516.00 + ], + [ + 3622.00, + 2534.00 + ], + [ + 3622.00, + 2536.00 + ], + [ + 3621.00, + 2541.00 + ] + ] + }, + { + "name": "Merry & Pippin", + "id": "merry_pippin", + "color": "brown", + "distance": "2100 miles / 3400 km", + "startDate": "September 23, T.A. 3018", + "endDate": "March 25, T.A. 3019", + "path": [ + [ + 1484.00, + 1161.00 + ], + [ + 1492.00, + 1175.00 + ], + [ + 1492.00, + 1175.00 + ], + [ + 1492.00, + 1175.00 + ], + [ + 1502.00, + 1183.00 + ], + [ + 1502.00, + 1183.00 + ], + [ + 1502.00, + 1183.00 + ], + [ + 1511.00, + 1194.00 + ], + [ + 1511.00, + 1194.00 + ], + [ + 1511.00, + 1194.00 + ], + [ + 1532.00, + 1206.00 + ], + [ + 1532.00, + 1206.00 + ], + [ + 1532.00, + 1206.00 + ], + [ + 1554.00, + 1216.00 + ], + [ + 1554.00, + 1216.00 + ], + [ + 1554.00, + 1216.00 + ], + [ + 1574.00, + 1219.00 + ], + [ + 1574.00, + 1219.00 + ], + [ + 1574.00, + 1219.00 + ], + [ + 1588.00, + 1220.00 + ], + [ + 1588.00, + 1220.00 + ], + [ + 1588.00, + 1220.00 + ], + [ + 1597.00, + 1212.00 + ], + [ + 1597.00, + 1212.00 + ], + [ + 1597.00, + 1212.00 + ], + [ + 1608.00, + 1207.00 + ], + [ + 1608.00, + 1207.00 + ], + [ + 1608.00, + 1207.00 + ], + [ + 1618.00, + 1207.00 + ], + [ + 1618.00, + 1207.00 + ], + [ + 1618.00, + 1207.00 + ], + [ + 1639.00, + 1207.00 + ], + [ + 1639.00, + 1207.00 + ], + [ + 1639.00, + 1207.00 + ], + [ + 1652.00, + 1206.00 + ], + [ + 1652.00, + 1206.00 + ], + [ + 1652.00, + 1206.00 + ], + [ + 1659.00, + 1203.00 + ], + [ + 1661.00, + 1203.00 + ], + [ + 1663.00, + 1203.00 + ], + [ + 1682.00, + 1200.00 + ], + [ + 1683.00, + 1200.00 + ], + [ + 1684.00, + 1200.00 + ], + [ + 1692.00, + 1198.00 + ], + [ + 1693.00, + 1198.00 + ], + [ + 1694.00, + 1198.00 + ], + [ + 1704.00, + 1200.00 + ], + [ + 1704.00, + 1200.00 + ], + [ + 1704.00, + 1200.00 + ], + [ + 1716.00, + 1199.00 + ], + [ + 1717.00, + 1199.00 + ], + [ + 1718.00, + 1199.00 + ], + [ + 1744.00, + 1200.00 + ], + [ + 1744.00, + 1200.00 + ], + [ + 1744.00, + 1200.00 + ], + [ + 1757.00, + 1201.00 + ], + [ + 1757.00, + 1201.00 + ], + [ + 1757.00, + 1201.00 + ], + [ + 1772.00, + 1208.00 + ], + [ + 1772.00, + 1208.00 + ], + [ + 1772.00, + 1208.00 + ], + [ + 1786.00, + 1214.00 + ], + [ + 1786.00, + 1214.00 + ], + [ + 1786.00, + 1214.00 + ], + [ + 1781.00, + 1199.00 + ], + [ + 1781.00, + 1199.00 + ], + [ + 1781.00, + 1199.00 + ], + [ + 1780.00, + 1186.00 + ], + [ + 1780.00, + 1186.00 + ], + [ + 1780.00, + 1186.00 + ], + [ + 1773.00, + 1175.00 + ], + [ + 1776.00, + 1173.00 + ], + [ + 1779.00, + 1171.00 + ], + [ + 1792.00, + 1159.00 + ], + [ + 1792.00, + 1159.00 + ], + [ + 1792.00, + 1159.00 + ], + [ + 1800.00, + 1149.00 + ], + [ + 1802.00, + 1148.00 + ], + [ + 1804.00, + 1147.00 + ], + [ + 1818.00, + 1133.00 + ], + [ + 1818.00, + 1133.00 + ], + [ + 1818.00, + 1133.00 + ], + [ + 1830.00, + 1128.00 + ], + [ + 1839.00, + 1128.00 + ], + [ + 1848.00, + 1128.00 + ], + [ + 1879.00, + 1131.00 + ], + [ + 1879.00, + 1131.00 + ], + [ + 1879.00, + 1131.00 + ], + [ + 1900.00, + 1131.00 + ], + [ + 1901.00, + 1131.00 + ], + [ + 1902.00, + 1131.00 + ], + [ + 1951.00, + 1132.00 + ], + [ + 1951.00, + 1132.00 + ], + [ + 1951.00, + 1132.00 + ], + [ + 1965.00, + 1136.00 + ], + [ + 1965.00, + 1136.00 + ], + [ + 1965.00, + 1136.00 + ], + [ + 1978.00, + 1144.00 + ], + [ + 1978.00, + 1144.00 + ], + [ + 1978.00, + 1144.00 + ], + [ + 1999.00, + 1150.00 + ], + [ + 1999.00, + 1150.00 + ], + [ + 1999.00, + 1150.00 + ], + [ + 1999.00, + 1168.00 + ], + [ + 1999.00, + 1168.00 + ], + [ + 1999.00, + 1168.00 + ], + [ + 1999.00, + 1177.00 + ], + [ + 2000.00, + 1179.00 + ], + [ + 2001.00, + 1181.00 + ], + [ + 2006.00, + 1188.00 + ], + [ + 2009.00, + 1192.00 + ], + [ + 2012.00, + 1196.00 + ], + [ + 2018.00, + 1196.00 + ], + [ + 2025.00, + 1199.00 + ], + [ + 2032.00, + 1202.00 + ], + [ + 2055.00, + 1203.00 + ], + [ + 2055.00, + 1203.00 + ], + [ + 2055.00, + 1203.00 + ], + [ + 2088.00, + 1203.00 + ], + [ + 2089.00, + 1203.00 + ], + [ + 2090.00, + 1203.00 + ], + [ + 2106.00, + 1199.00 + ], + [ + 2108.00, + 1199.00 + ], + [ + 2110.00, + 1199.00 + ], + [ + 2129.00, + 1198.00 + ], + [ + 2134.00, + 1196.00 + ], + [ + 2139.00, + 1194.00 + ], + [ + 2168.00, + 1192.00 + ], + [ + 2172.00, + 1190.00 + ], + [ + 2176.00, + 1188.00 + ], + [ + 2184.00, + 1177.00 + ], + [ + 2190.00, + 1174.00 + ], + [ + 2196.00, + 1171.00 + ], + [ + 2208.00, + 1165.00 + ], + [ + 2211.00, + 1164.00 + ], + [ + 2214.00, + 1163.00 + ], + [ + 2222.00, + 1156.00 + ], + [ + 2226.00, + 1154.00 + ], + [ + 2230.00, + 1152.00 + ], + [ + 2240.00, + 1146.00 + ], + [ + 2243.00, + 1144.00 + ], + [ + 2246.00, + 1142.00 + ], + [ + 2262.00, + 1135.00 + ], + [ + 2262.00, + 1135.00 + ], + [ + 2262.00, + 1135.00 + ], + [ + 2273.00, + 1132.00 + ], + [ + 2274.00, + 1132.00 + ], + [ + 2275.00, + 1132.00 + ], + [ + 2287.00, + 1116.00 + ], + [ + 2287.00, + 1116.00 + ], + [ + 2287.00, + 1116.00 + ], + [ + 2289.00, + 1114.00 + ], + [ + 2293.00, + 1108.00 + ], + [ + 2297.00, + 1102.00 + ], + [ + 2304.00, + 1096.00 + ], + [ + 2304.00, + 1095.00 + ], + [ + 2304.00, + 1094.00 + ], + [ + 2306.00, + 1093.00 + ], + [ + 2309.00, + 1085.00 + ], + [ + 2312.00, + 1077.00 + ], + [ + 2324.00, + 1054.00 + ], + [ + 2324.00, + 1054.00 + ], + [ + 2324.00, + 1054.00 + ], + [ + 2334.00, + 1044.00 + ], + [ + 2334.00, + 1044.00 + ], + [ + 2334.00, + 1044.00 + ], + [ + 2336.00, + 1058.00 + ], + [ + 2335.00, + 1059.00 + ], + [ + 2334.00, + 1060.00 + ], + [ + 2331.00, + 1071.00 + ], + [ + 2331.00, + 1072.00 + ], + [ + 2331.00, + 1073.00 + ], + [ + 2328.00, + 1078.00 + ], + [ + 2328.00, + 1083.00 + ], + [ + 2328.00, + 1088.00 + ], + [ + 2336.00, + 1108.00 + ], + [ + 2337.00, + 1108.00 + ], + [ + 2338.00, + 1108.00 + ], + [ + 2338.00, + 1109.00 + ], + [ + 2339.00, + 1114.00 + ], + [ + 2351.00, + 1128.00 + ], + [ + 2360.00, + 1131.00 + ], + [ + 2361.00, + 1132.00 + ], + [ + 2362.00, + 1133.00 + ], + [ + 2385.00, + 1143.00 + ], + [ + 2385.00, + 1143.00 + ], + [ + 2385.00, + 1143.00 + ], + [ + 2391.00, + 1144.00 + ], + [ + 2395.00, + 1144.00 + ], + [ + 2399.00, + 1144.00 + ], + [ + 2404.00, + 1144.00 + ], + [ + 2407.00, + 1145.00 + ], + [ + 2410.00, + 1146.00 + ], + [ + 2421.00, + 1144.00 + ], + [ + 2421.00, + 1144.00 + ], + [ + 2421.00, + 1144.00 + ], + [ + 2443.00, + 1147.00 + ], + [ + 2443.00, + 1147.00 + ], + [ + 2443.00, + 1147.00 + ], + [ + 2453.00, + 1148.00 + ], + [ + 2454.00, + 1149.00 + ], + [ + 2455.00, + 1150.00 + ], + [ + 2470.00, + 1150.00 + ], + [ + 2470.00, + 1150.00 + ], + [ + 2470.00, + 1150.00 + ], + [ + 2484.00, + 1155.00 + ], + [ + 2484.00, + 1155.00 + ], + [ + 2484.00, + 1155.00 + ], + [ + 2492.00, + 1151.00 + ], + [ + 2492.00, + 1151.00 + ], + [ + 2492.00, + 1151.00 + ], + [ + 2507.00, + 1147.00 + ], + [ + 2507.00, + 1147.00 + ], + [ + 2507.00, + 1147.00 + ], + [ + 2514.00, + 1132.00 + ], + [ + 2514.00, + 1132.00 + ], + [ + 2501.00, + 1162.00 + ], + [ + 2500.00, + 1163.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2515.00, + 1202.00 + ], + [ + 2516.00, + 1206.00 + ], + [ + 2517.00, + 1210.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2509.00, + 1233.00 + ], + [ + 2507.00, + 1237.00 + ], + [ + 2505.00, + 1241.00 + ], + [ + 2494.00, + 1271.00 + ], + [ + 2492.00, + 1273.00 + ], + [ + 2490.00, + 1275.00 + ], + [ + 2493.00, + 1281.00 + ], + [ + 2491.00, + 1287.00 + ], + [ + 2471.00, + 1331.00 + ], + [ + 2473.00, + 1332.00 + ], + [ + 2470.00, + 1340.00 + ], + [ + 2467.00, + 1348.00 + ], + [ + 2466.00, + 1348.00 + ], + [ + 2463.00, + 1355.00 + ], + [ + 2457.00, + 1367.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2499.00, + 1398.00 + ], + [ + 2501.00, + 1398.00 + ], + [ + 2503.00, + 1398.00 + ], + [ + 2517.00, + 1402.00 + ], + [ + 2516.00, + 1403.00 + ], + [ + 2515.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2484.00, + 1404.00 + ], + [ + 2476.00, + 1402.00 + ], + [ + 2468.00, + 1400.00 + ], + [ + 2465.00, + 1400.00 + ], + [ + 2460.00, + 1401.00 + ], + [ + 2455.00, + 1402.00 + ], + [ + 2441.00, + 1404.00 + ], + [ + 2440.00, + 1406.00 + ], + [ + 2439.00, + 1408.00 + ], + [ + 2436.00, + 1415.00 + ], + [ + 2434.00, + 1419.00 + ], + [ + 2432.00, + 1423.00 + ], + [ + 2427.00, + 1437.00 + ], + [ + 2426.00, + 1438.00 + ], + [ + 2425.00, + 1439.00 + ], + [ + 2421.00, + 1449.00 + ], + [ + 2419.00, + 1453.00 + ], + [ + 2417.00, + 1457.00 + ], + [ + 2411.00, + 1468.00 + ], + [ + 2410.00, + 1471.00 + ], + [ + 2409.00, + 1474.00 + ], + [ + 2405.00, + 1480.00 + ], + [ + 2403.00, + 1488.00 + ], + [ + 2401.00, + 1496.00 + ], + [ + 2400.00, + 1505.00 + ], + [ + 2399.00, + 1507.00 + ], + [ + 2398.00, + 1509.00 + ], + [ + 2394.00, + 1523.00 + ], + [ + 2394.00, + 1526.00 + ], + [ + 2394.00, + 1529.00 + ], + [ + 2401.00, + 1533.00 + ], + [ + 2404.00, + 1535.00 + ], + [ + 2407.00, + 1537.00 + ], + [ + 2426.00, + 1540.00 + ], + [ + 2427.00, + 1540.00 + ], + [ + 2428.00, + 1540.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2469.00, + 1533.00 + ], + [ + 2473.00, + 1533.00 + ], + [ + 2477.00, + 1533.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2512.00, + 1534.00 + ], + [ + 2513.00, + 1534.00 + ], + [ + 2514.00, + 1534.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2536.00, + 1543.00 + ], + [ + 2537.00, + 1544.00 + ], + [ + 2538.00, + 1545.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2598.00, + 1645.00 + ], + [ + 2598.00, + 1646.00 + ], + [ + 2598.00, + 1647.00 + ], + [ + 2611.00, + 1651.00 + ], + [ + 2612.00, + 1652.00 + ], + [ + 2613.00, + 1653.00 + ], + [ + 2624.00, + 1665.00 + ], + [ + 2624.00, + 1666.00 + ], + [ + 2624.00, + 1667.00 + ], + [ + 2632.00, + 1675.00 + ], + [ + 2634.00, + 1677.00 + ], + [ + 2636.00, + 1679.00 + ], + [ + 2644.00, + 1683.00 + ], + [ + 2645.00, + 1684.00 + ], + [ + 2646.00, + 1685.00 + ], + [ + 2658.00, + 1693.00 + ], + [ + 2659.00, + 1693.00 + ], + [ + 2660.00, + 1693.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2744.00, + 1726.00 + ], + [ + 2744.00, + 1727.00 + ], + [ + 2744.00, + 1728.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2787.00, + 1744.00 + ], + [ + 2787.00, + 1745.00 + ], + [ + 2787.00, + 1746.00 + ], + [ + 2778.00, + 1760.00 + ], + [ + 2784.00, + 1766.00 + ], + [ + 2790.00, + 1772.00 + ], + [ + 2791.00, + 1783.00 + ], + [ + 2791.00, + 1785.00 + ], + [ + 2791.00, + 1787.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2799.00, + 1809.00 + ], + [ + 2801.00, + 1810.00 + ], + [ + 2803.00, + 1811.00 + ], + [ + 2815.00, + 1818.00 + ], + [ + 2818.00, + 1819.00 + ], + [ + 2821.00, + 1820.00 + ], + [ + 2836.00, + 1826.00 + ], + [ + 2837.00, + 1827.00 + ], + [ + 2838.00, + 1828.00 + ], + [ + 2849.00, + 1836.00 + ], + [ + 2850.00, + 1836.00 + ], + [ + 2851.00, + 1836.00 + ], + [ + 2864.00, + 1844.00 + ], + [ + 2866.00, + 1846.00 + ], + [ + 2868.00, + 1848.00 + ], + [ + 2876.00, + 1853.00 + ], + [ + 2881.00, + 1857.00 + ], + [ + 2886.00, + 1861.00 + ], + [ + 2899.00, + 1872.00 + ], + [ + 2900.00, + 1873.00 + ], + [ + 2901.00, + 1874.00 + ], + [ + 2907.00, + 1878.00 + ], + [ + 2910.00, + 1879.00 + ], + [ + 2913.00, + 1880.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2939.00, + 1885.00 + ], + [ + 2943.00, + 1889.00 + ], + [ + 2947.00, + 1893.00 + ], + [ + 2956.00, + 1899.00 + ], + [ + 2956.00, + 1900.00 + ], + [ + 2956.00, + 1901.00 + ], + [ + 2955.00, + 1908.00 + ], + [ + 2955.00, + 1909.00 + ], + [ + 2955.00, + 1910.00 + ], + [ + 2950.00, + 1919.00 + ], + [ + 2949.00, + 1921.00 + ], + [ + 2948.00, + 1923.00 + ], + [ + 2941.00, + 1931.00 + ], + [ + 2941.00, + 1933.00 + ], + [ + 2941.00, + 1935.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2944.00, + 1966.00 + ], + [ + 2945.00, + 1968.00 + ], + [ + 2946.00, + 1970.00 + ], + [ + 2948.00, + 1975.00 + ], + [ + 2954.00, + 1979.00 + ], + [ + 2960.00, + 1983.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 3027.00, + 1983.00 + ], + [ + 3027.00, + 1984.00 + ], + [ + 3027.00, + 1985.00 + ], + [ + 3031.00, + 1998.00 + ], + [ + 3031.00, + 2000.00 + ], + [ + 3031.00, + 2002.00 + ], + [ + 3022.00, + 2019.00 + ], + [ + 3021.00, + 2020.00 + ], + [ + 3020.00, + 2021.00 + ], + [ + 3011.00, + 2037.00 + ], + [ + 3010.00, + 2038.00 + ], + [ + 3009.00, + 2039.00 + ], + [ + 3003.00, + 2047.00 + ], + [ + 3003.00, + 2051.00 + ], + [ + 3003.00, + 2055.00 + ], + [ + 3004.00, + 2069.00 + ], + [ + 3005.00, + 2070.00 + ], + [ + 3006.00, + 2071.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3054.00, + 2112.00 + ], + [ + 3054.00, + 2113.00 + ], + [ + 3054.00, + 2114.00 + ], + [ + 3053.00, + 2129.00 + ], + [ + 3052.00, + 2130.00 + ], + [ + 3051.00, + 2131.00 + ], + [ + 3046.00, + 2148.00 + ], + [ + 3046.00, + 2149.00 + ], + [ + 3046.00, + 2150.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3039.00, + 2175.00 + ], + [ + 3039.00, + 2176.00 + ], + [ + 3039.00, + 2177.00 + ], + [ + 3034.00, + 2187.00 + ], + [ + 3033.00, + 2190.00 + ], + [ + 3032.00, + 2193.00 + ], + [ + 3030.00, + 2207.00 + ], + [ + 3029.00, + 2211.00 + ], + [ + 3028.00, + 2215.00 + ], + [ + 3024.00, + 2225.00 + ], + [ + 3024.00, + 2228.00 + ], + [ + 3024.00, + 2231.00 + ], + [ + 3028.00, + 2246.00 + ], + [ + 3028.00, + 2249.00 + ], + [ + 3028.00, + 2252.00 + ], + [ + 3031.00, + 2266.00 + ], + [ + 3031.00, + 2268.00 + ], + [ + 3031.00, + 2270.00 + ], + [ + 3033.00, + 2282.00 + ], + [ + 3035.00, + 2285.00 + ], + [ + 3037.00, + 2288.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3045.00, + 2342.00 + ], + [ + 3045.00, + 2345.00 + ], + [ + 3045.00, + 2348.00 + ], + [ + 3053.00, + 2365.00 + ], + [ + 3053.00, + 2366.00 + ], + [ + 3053.00, + 2367.00 + ], + [ + 3049.00, + 2383.00 + ], + [ + 3049.00, + 2383.00 + ], + [ + 3049.00, + 2383.00 + ], + [ + 3031.00, + 2368.00 + ], + [ + 3031.00, + 2368.00 + ], + [ + 3031.00, + 2368.00 + ], + [ + 3016.00, + 2355.00 + ], + [ + 3016.00, + 2355.00 + ], + [ + 3016.00, + 2355.00 + ], + [ + 3009.00, + 2340.00 + ], + [ + 3009.00, + 2340.00 + ], + [ + 3009.00, + 2340.00 + ], + [ + 2992.00, + 2331.00 + ], + [ + 2989.00, + 2328.00 + ], + [ + 2986.00, + 2325.00 + ], + [ + 2970.00, + 2308.00 + ], + [ + 2970.00, + 2308.00 + ], + [ + 2970.00, + 2308.00 + ], + [ + 2955.00, + 2302.00 + ], + [ + 2952.00, + 2301.00 + ], + [ + 2949.00, + 2300.00 + ], + [ + 2927.00, + 2293.00 + ], + [ + 2924.00, + 2293.00 + ], + [ + 2921.00, + 2293.00 + ], + [ + 2904.00, + 2291.00 + ], + [ + 2904.00, + 2291.00 + ], + [ + 2904.00, + 2291.00 + ], + [ + 2892.00, + 2288.00 + ], + [ + 2891.00, + 2287.00 + ], + [ + 2890.00, + 2286.00 + ], + [ + 2878.00, + 2269.00 + ], + [ + 2878.00, + 2269.00 + ], + [ + 2878.00, + 2269.00 + ], + [ + 2865.00, + 2250.00 + ], + [ + 2865.00, + 2250.00 + ], + [ + 2865.00, + 2250.00 + ], + [ + 2850.00, + 2233.00 + ], + [ + 2850.00, + 2233.00 + ], + [ + 2850.00, + 2233.00 + ], + [ + 2823.00, + 2214.00 + ], + [ + 2823.00, + 2214.00 + ], + [ + 2823.00, + 2214.00 + ], + [ + 2808.00, + 2194.00 + ], + [ + 2808.00, + 2194.00 + ], + [ + 2808.00, + 2194.00 + ], + [ + 2791.00, + 2168.00 + ], + [ + 2791.00, + 2168.00 + ], + [ + 2791.00, + 2168.00 + ], + [ + 2761.00, + 2150.00 + ], + [ + 2761.00, + 2150.00 + ], + [ + 2761.00, + 2150.00 + ], + [ + 2736.00, + 2131.00 + ], + [ + 2736.00, + 2131.00 + ], + [ + 2736.00, + 2131.00 + ], + [ + 2703.00, + 2119.00 + ], + [ + 2703.00, + 2119.00 + ], + [ + 2703.00, + 2119.00 + ], + [ + 2671.00, + 2103.00 + ], + [ + 2671.00, + 2103.00 + ], + [ + 2671.00, + 2103.00 + ], + [ + 2644.00, + 2089.00 + ], + [ + 2644.00, + 2089.00 + ], + [ + 2644.00, + 2089.00 + ], + [ + 2623.00, + 2084.00 + ], + [ + 2623.00, + 2084.00 + ], + [ + 2623.00, + 2084.00 + ], + [ + 2607.00, + 2088.00 + ], + [ + 2606.00, + 2088.00 + ], + [ + 2605.00, + 2088.00 + ], + [ + 2596.00, + 2089.00 + ], + [ + 2596.00, + 2089.00 + ], + [ + 2596.00, + 2089.00 + ], + [ + 2572.00, + 2083.00 + ], + [ + 2571.00, + 2082.00 + ], + [ + 2570.00, + 2081.00 + ], + [ + 2564.00, + 2077.00 + ], + [ + 2560.00, + 2076.00 + ], + [ + 2556.00, + 2075.00 + ], + [ + 2541.00, + 2071.00 + ], + [ + 2539.00, + 2071.00 + ], + [ + 2537.00, + 2071.00 + ], + [ + 2527.00, + 2068.00 + ], + [ + 2527.00, + 2068.00 + ], + [ + 2527.00, + 2068.00 + ], + [ + 2501.00, + 2063.00 + ], + [ + 2501.00, + 2063.00 + ], + [ + 2501.00, + 2063.00 + ], + [ + 2474.00, + 2059.00 + ], + [ + 2474.00, + 2059.00 + ], + [ + 2474.00, + 2059.00 + ], + [ + 2457.00, + 2053.00 + ], + [ + 2457.00, + 2053.00 + ], + [ + 2457.00, + 2053.00 + ], + [ + 2446.00, + 2048.00 + ], + [ + 2446.00, + 2048.00 + ], + [ + 2446.00, + 2048.00 + ], + [ + 2434.00, + 2039.00 + ], + [ + 2434.00, + 2039.00 + ], + [ + 2434.00, + 2039.00 + ], + [ + 2438.00, + 2050.00 + ], + [ + 2438.00, + 2051.00 + ], + [ + 2438.00, + 2052.00 + ], + [ + 2440.00, + 2062.00 + ], + [ + 2440.00, + 2063.00 + ], + [ + 2440.00, + 2064.00 + ], + [ + 2440.00, + 2074.00 + ], + [ + 2440.00, + 2076.00 + ], + [ + 2440.00, + 2078.00 + ], + [ + 2436.00, + 2080.00 + ], + [ + 2433.00, + 2081.00 + ], + [ + 2430.00, + 2082.00 + ], + [ + 2419.00, + 2083.00 + ], + [ + 2415.00, + 2084.00 + ], + [ + 2411.00, + 2085.00 + ], + [ + 2401.00, + 2085.00 + ], + [ + 2401.00, + 2085.00 + ], + [ + 2401.00, + 2085.00 + ], + [ + 2384.00, + 2088.00 + ], + [ + 2384.00, + 2088.00 + ], + [ + 2384.00, + 2088.00 + ], + [ + 2366.00, + 2091.00 + ], + [ + 2364.00, + 2093.00 + ], + [ + 2362.00, + 2095.00 + ], + [ + 2350.00, + 2102.00 + ], + [ + 2349.00, + 2103.00 + ], + [ + 2348.00, + 2104.00 + ], + [ + 2338.00, + 2116.00 + ], + [ + 2338.00, + 2116.00 + ], + [ + 2338.00, + 2116.00 + ], + [ + 2336.00, + 2138.00 + ], + [ + 2336.00, + 2138.00 + ], + [ + 2336.00, + 2138.00 + ], + [ + 2329.00, + 2148.00 + ], + [ + 2329.00, + 2151.00 + ], + [ + 2329.00, + 2154.00 + ], + [ + 2322.00, + 2173.00 + ], + [ + 2322.00, + 2173.00 + ], + [ + 2322.00, + 2173.00 + ], + [ + 2324.00, + 2188.00 + ], + [ + 2324.00, + 2188.00 + ], + [ + 2324.00, + 2188.00 + ], + [ + 2328.00, + 2202.00 + ], + [ + 2328.00, + 2202.00 + ], + [ + 2328.00, + 2202.00 + ], + [ + 2338.00, + 2218.00 + ], + [ + 2338.00, + 2218.00 + ], + [ + 2338.00, + 2218.00 + ], + [ + 2341.00, + 2226.00 + ], + [ + 2342.00, + 2227.00 + ], + [ + 2343.00, + 2228.00 + ], + [ + 2345.00, + 2233.00 + ], + [ + 2346.00, + 2236.00 + ], + [ + 2347.00, + 2239.00 + ], + [ + 2345.00, + 2244.00 + ], + [ + 2345.00, + 2245.00 + ], + [ + 2345.00, + 2246.00 + ], + [ + 2349.00, + 2257.00 + ], + [ + 2349.00, + 2258.00 + ], + [ + 2349.00, + 2259.00 + ], + [ + 2355.00, + 2257.00 + ], + [ + 2356.00, + 2257.00 + ], + [ + 2357.00, + 2257.00 + ], + [ + 2372.00, + 2259.00 + ], + [ + 2372.00, + 2259.00 + ], + [ + 2372.00, + 2259.00 + ], + [ + 2380.00, + 2261.00 + ], + [ + 2382.00, + 2262.00 + ], + [ + 2384.00, + 2263.00 + ], + [ + 2397.00, + 2266.00 + ], + [ + 2397.00, + 2266.00 + ], + [ + 2397.00, + 2266.00 + ], + [ + 2411.00, + 2270.00 + ], + [ + 2411.00, + 2270.00 + ], + [ + 2411.00, + 2270.00 + ], + [ + 2422.00, + 2284.00 + ], + [ + 2422.00, + 2285.00 + ], + [ + 2422.00, + 2286.00 + ], + [ + 2418.00, + 2301.00 + ], + [ + 2418.00, + 2301.00 + ], + [ + 2418.00, + 2301.00 + ], + [ + 2420.00, + 2319.00 + ], + [ + 2420.00, + 2319.00 + ], + [ + 2420.00, + 2319.00 + ], + [ + 2424.00, + 2329.00 + ], + [ + 2424.00, + 2331.00 + ], + [ + 2424.00, + 2333.00 + ], + [ + 2428.00, + 2342.00 + ], + [ + 2429.00, + 2344.00 + ], + [ + 2430.00, + 2346.00 + ], + [ + 2430.00, + 2349.00 + ], + [ + 2431.00, + 2352.00 + ], + [ + 2432.00, + 2355.00 + ], + [ + 2435.00, + 2365.00 + ], + [ + 2436.00, + 2366.00 + ], + [ + 2437.00, + 2367.00 + ], + [ + 2450.00, + 2373.00 + ], + [ + 2450.00, + 2373.00 + ], + [ + 2450.00, + 2373.00 + ], + [ + 2465.00, + 2377.00 + ], + [ + 2466.00, + 2377.00 + ], + [ + 2467.00, + 2377.00 + ], + [ + 2484.00, + 2384.00 + ], + [ + 2485.00, + 2384.00 + ], + [ + 2486.00, + 2384.00 + ], + [ + 2499.00, + 2387.00 + ], + [ + 2499.00, + 2387.00 + ], + [ + 2499.00, + 2387.00 + ], + [ + 2506.00, + 2390.00 + ], + [ + 2508.00, + 2390.00 + ], + [ + 2510.00, + 2390.00 + ], + [ + 2524.00, + 2384.00 + ], + [ + 2526.00, + 2384.00 + ], + [ + 2528.00, + 2384.00 + ], + [ + 2535.00, + 2381.00 + ], + [ + 2540.00, + 2381.00 + ], + [ + 2545.00, + 2381.00 + ], + [ + 2557.00, + 2380.00 + ], + [ + 2563.00, + 2380.00 + ], + [ + 2578.00, + 2382.00 + ], + [ + 2588.00, + 2385.00 + ], + [ + 2588.00, + 2385.00 + ], + [ + 2588.00, + 2385.00 + ], + [ + 2611.00, + 2396.00 + ], + [ + 2611.00, + 2396.00 + ], + [ + 2611.00, + 2396.00 + ], + [ + 2615.00, + 2411.00 + ], + [ + 2616.00, + 2412.00 + ], + [ + 2617.00, + 2413.00 + ], + [ + 2629.00, + 2430.00 + ], + [ + 2630.00, + 2432.00 + ], + [ + 2631.00, + 2434.00 + ], + [ + 2637.00, + 2439.00 + ], + [ + 2639.00, + 2443.00 + ], + [ + 2641.00, + 2447.00 + ], + [ + 2650.00, + 2456.00 + ], + [ + 2650.00, + 2456.00 + ], + [ + 2650.00, + 2456.00 + ], + [ + 2667.00, + 2464.00 + ], + [ + 2667.00, + 2464.00 + ], + [ + 2667.00, + 2464.00 + ], + [ + 2673.00, + 2475.00 + ], + [ + 2673.00, + 2475.00 + ], + [ + 2673.00, + 2475.00 + ], + [ + 2689.00, + 2485.00 + ], + [ + 2689.00, + 2485.00 + ], + [ + 2689.00, + 2485.00 + ], + [ + 2708.00, + 2496.00 + ], + [ + 2708.00, + 2496.00 + ], + [ + 2708.00, + 2496.00 + ], + [ + 2723.00, + 2502.00 + ], + [ + 2725.00, + 2503.00 + ], + [ + 2727.00, + 2504.00 + ], + [ + 2741.00, + 2510.00 + ], + [ + 2743.00, + 2511.00 + ], + [ + 2745.00, + 2512.00 + ], + [ + 2760.00, + 2521.00 + ], + [ + 2761.00, + 2521.00 + ], + [ + 2762.00, + 2521.00 + ], + [ + 2773.00, + 2525.00 + ], + [ + 2774.00, + 2526.00 + ], + [ + 2775.00, + 2527.00 + ], + [ + 2791.00, + 2532.00 + ], + [ + 2791.00, + 2532.00 + ], + [ + 2791.00, + 2532.00 + ], + [ + 2805.00, + 2538.00 + ], + [ + 2805.00, + 2538.00 + ], + [ + 2805.00, + 2538.00 + ], + [ + 2819.00, + 2543.00 + ], + [ + 2819.00, + 2543.00 + ], + [ + 2819.00, + 2543.00 + ], + [ + 2839.00, + 2549.00 + ], + [ + 2839.00, + 2550.00 + ], + [ + 2839.00, + 2551.00 + ], + [ + 2868.00, + 2560.00 + ], + [ + 2868.00, + 2560.00 + ], + [ + 2868.00, + 2560.00 + ], + [ + 2882.00, + 2563.00 + ], + [ + 2883.00, + 2564.00 + ], + [ + 2884.00, + 2565.00 + ], + [ + 2901.00, + 2570.00 + ], + [ + 2901.00, + 2570.00 + ], + [ + 2901.00, + 2570.00 + ], + [ + 2920.00, + 2574.00 + ], + [ + 2920.00, + 2574.00 + ], + [ + 2920.00, + 2574.00 + ], + [ + 2943.00, + 2582.00 + ], + [ + 2943.00, + 2582.00 + ], + [ + 2943.00, + 2582.00 + ], + [ + 2961.00, + 2586.00 + ], + [ + 2961.00, + 2586.00 + ], + [ + 2961.00, + 2586.00 + ], + [ + 2992.00, + 2593.00 + ], + [ + 2993.00, + 2593.00 + ], + [ + 2994.00, + 2593.00 + ], + [ + 3013.00, + 2596.00 + ], + [ + 3013.00, + 2596.00 + ], + [ + 3013.00, + 2596.00 + ], + [ + 3029.00, + 2601.00 + ], + [ + 3029.00, + 2601.00 + ], + [ + 3029.00, + 2601.00 + ], + [ + 3043.00, + 2605.00 + ], + [ + 3043.00, + 2605.00 + ], + [ + 3043.00, + 2605.00 + ], + [ + 3065.00, + 2611.00 + ], + [ + 3065.00, + 2611.00 + ], + [ + 3065.00, + 2611.00 + ], + [ + 3087.00, + 2613.00 + ], + [ + 3088.00, + 2613.00 + ], + [ + 3089.00, + 2613.00 + ], + [ + 3103.00, + 2612.00 + ], + [ + 3105.00, + 2613.00 + ], + [ + 3107.00, + 2614.00 + ], + [ + 3127.00, + 2616.00 + ], + [ + 3127.00, + 2616.00 + ], + [ + 3127.00, + 2616.00 + ], + [ + 3151.00, + 2621.00 + ], + [ + 3151.00, + 2621.00 + ], + [ + 3151.00, + 2621.00 + ], + [ + 3174.00, + 2628.00 + ], + [ + 3174.00, + 2628.00 + ], + [ + 3174.00, + 2628.00 + ], + [ + 3199.00, + 2634.00 + ], + [ + 3200.00, + 2634.00 + ], + [ + 3201.00, + 2634.00 + ], + [ + 3219.00, + 2636.00 + ], + [ + 3220.00, + 2637.00 + ], + [ + 3221.00, + 2638.00 + ], + [ + 3231.00, + 2642.00 + ], + [ + 3232.00, + 2642.00 + ], + [ + 3233.00, + 2642.00 + ], + [ + 3244.00, + 2650.00 + ], + [ + 3245.00, + 2652.00 + ], + [ + 3246.00, + 2654.00 + ], + [ + 3253.00, + 2659.00 + ], + [ + 3254.00, + 2663.00 + ], + [ + 3255.00, + 2667.00 + ], + [ + 3256.00, + 2677.00 + ], + [ + 3258.00, + 2679.00 + ], + [ + 3260.00, + 2681.00 + ], + [ + 3263.00, + 2687.00 + ], + [ + 3265.00, + 2690.00 + ], + [ + 3267.00, + 2693.00 + ], + [ + 3277.00, + 2702.00 + ], + [ + 3277.00, + 2702.00 + ], + [ + 3277.00, + 2702.00 + ], + [ + 3283.00, + 2706.00 + ], + [ + 3283.00, + 2706.00 + ], + [ + 3283.00, + 2706.00 + ], + [ + 3302.00, + 2705.00 + ], + [ + 3302.00, + 2705.00 + ], + [ + 3302.00, + 2705.00 + ], + [ + 3321.00, + 2701.00 + ], + [ + 3321.00, + 2701.00 + ], + [ + 3321.00, + 2701.00 + ], + [ + 3345.00, + 2700.00 + ], + [ + 3346.00, + 2699.00 + ], + [ + 3347.00, + 2698.00 + ], + [ + 3368.00, + 2697.00 + ], + [ + 3369.00, + 2697.00 + ], + [ + 3370.00, + 2697.00 + ], + [ + 3375.00, + 2676.00 + ], + [ + 3376.00, + 2676.00 + ], + [ + 3377.00, + 2676.00 + ], + [ + 3368.00, + 2651.00 + ], + [ + 3368.00, + 2651.00 + ], + [ + 3368.00, + 2651.00 + ], + [ + 3364.00, + 2632.00 + ], + [ + 3364.00, + 2631.00 + ], + [ + 3364.00, + 2630.00 + ], + [ + 3357.00, + 2608.00 + ], + [ + 3357.00, + 2608.00 + ], + [ + 3357.00, + 2608.00 + ], + [ + 3356.00, + 2589.00 + ], + [ + 3356.00, + 2589.00 + ], + [ + 3356.00, + 2589.00 + ], + [ + 3352.00, + 2567.00 + ], + [ + 3352.00, + 2567.00 + ], + [ + 3352.00, + 2567.00 + ], + [ + 3345.00, + 2541.00 + ], + [ + 3345.00, + 2541.00 + ], + [ + 3345.00, + 2541.00 + ], + [ + 3341.00, + 2524.00 + ], + [ + 3341.00, + 2524.00 + ], + [ + 3341.00, + 2524.00 + ], + [ + 3336.00, + 2515.00 + ], + [ + 3336.00, + 2515.00 + ], + [ + 3336.00, + 2515.00 + ], + [ + 3333.00, + 2501.00 + ], + [ + 3333.00, + 2500.00 + ], + [ + 3333.00, + 2499.00 + ], + [ + 3330.00, + 2480.00 + ], + [ + 3330.00, + 2480.00 + ], + [ + 3330.00, + 2480.00 + ], + [ + 3329.00, + 2465.00 + ], + [ + 3329.00, + 2465.00 + ], + [ + 3329.00, + 2465.00 + ], + [ + 3327.00, + 2446.00 + ], + [ + 3327.00, + 2446.00 + ], + [ + 3327.00, + 2446.00 + ], + [ + 3331.00, + 2424.00 + ], + [ + 3331.00, + 2424.00 + ], + [ + 3331.00, + 2424.00 + ], + [ + 3337.00, + 2408.00 + ], + [ + 3337.00, + 2408.00 + ], + [ + 3337.00, + 2408.00 + ], + [ + 3351.00, + 2393.00 + ], + [ + 3351.00, + 2393.00 + ], + [ + 3351.00, + 2393.00 + ], + [ + 3370.00, + 2382.00 + ], + [ + 3370.00, + 2382.00 + ] + ] + }, + { + "name": "Gimli & Legolas", + "id": "legolas_gimli", + "color": "purple", + "distance": "1800 miles / 2900 km", + "startDate": "December 25, T.A. 3018", + "endDate": "March 25, T.A. 3019", + "path": [ + [ + 3374.00, + 2375.00 + ], + [ + 3374.00, + 2375.00 + ], + [ + 3361.00, + 2384.00 + ], + [ + 3361.00, + 2384.00 + ], + [ + 3361.00, + 2384.00 + ], + [ + 3343.00, + 2405.00 + ], + [ + 3343.00, + 2405.00 + ], + [ + 3343.00, + 2405.00 + ], + [ + 3332.00, + 2424.00 + ], + [ + 3332.00, + 2424.00 + ], + [ + 3332.00, + 2424.00 + ], + [ + 3328.00, + 2449.00 + ], + [ + 3328.00, + 2449.00 + ], + [ + 3328.00, + 2449.00 + ], + [ + 3330.00, + 2471.00 + ], + [ + 3330.00, + 2471.00 + ], + [ + 3330.00, + 2471.00 + ], + [ + 3330.00, + 2500.00 + ], + [ + 3330.00, + 2500.00 + ], + [ + 3330.00, + 2500.00 + ], + [ + 3341.00, + 2523.00 + ], + [ + 3341.00, + 2523.00 + ], + [ + 3341.00, + 2523.00 + ], + [ + 3348.00, + 2547.00 + ], + [ + 3348.00, + 2547.00 + ], + [ + 3348.00, + 2547.00 + ], + [ + 3354.00, + 2567.00 + ], + [ + 3354.00, + 2567.00 + ], + [ + 3354.00, + 2567.00 + ], + [ + 3360.00, + 2592.00 + ], + [ + 3360.00, + 2592.00 + ], + [ + 3360.00, + 2592.00 + ], + [ + 3361.00, + 2610.00 + ], + [ + 3361.00, + 2614.00 + ], + [ + 3361.00, + 2618.00 + ], + [ + 3361.00, + 2634.00 + ], + [ + 3361.00, + 2636.00 + ], + [ + 3361.00, + 2638.00 + ], + [ + 3367.00, + 2658.00 + ], + [ + 3367.00, + 2658.00 + ], + [ + 3367.00, + 2658.00 + ], + [ + 3375.00, + 2687.00 + ], + [ + 3375.00, + 2688.00 + ], + [ + 3375.00, + 2689.00 + ], + [ + 3365.00, + 2699.00 + ], + [ + 3365.00, + 2699.00 + ], + [ + 3365.00, + 2699.00 + ], + [ + 3342.00, + 2700.00 + ], + [ + 3342.00, + 2700.00 + ], + [ + 3342.00, + 2700.00 + ], + [ + 3316.00, + 2703.00 + ], + [ + 3316.00, + 2703.00 + ], + [ + 3316.00, + 2703.00 + ], + [ + 3297.00, + 2705.00 + ], + [ + 3297.00, + 2705.00 + ], + [ + 3297.00, + 2705.00 + ], + [ + 3284.00, + 2712.00 + ], + [ + 3284.00, + 2712.00 + ], + [ + 3284.00, + 2712.00 + ], + [ + 3290.00, + 2716.00 + ], + [ + 3297.00, + 2720.00 + ], + [ + 3304.00, + 2724.00 + ], + [ + 3304.00, + 2725.00 + ], + [ + 3308.00, + 2728.00 + ], + [ + 3312.00, + 2731.00 + ], + [ + 3307.00, + 2737.00 + ], + [ + 3306.00, + 2740.00 + ], + [ + 3305.00, + 2743.00 + ], + [ + 3293.00, + 2749.00 + ], + [ + 3289.00, + 2752.00 + ], + [ + 3285.00, + 2755.00 + ], + [ + 3277.00, + 2763.00 + ], + [ + 3274.00, + 2767.00 + ], + [ + 3271.00, + 2771.00 + ], + [ + 3272.00, + 2785.00 + ], + [ + 3272.00, + 2786.00 + ], + [ + 3272.00, + 2787.00 + ], + [ + 3275.00, + 2802.00 + ], + [ + 3278.00, + 2812.00 + ], + [ + 3281.00, + 2822.00 + ], + [ + 3285.00, + 2827.00 + ], + [ + 3286.00, + 2831.00 + ], + [ + 3287.00, + 2835.00 + ], + [ + 3291.00, + 2855.00 + ], + [ + 3291.00, + 2864.00 + ], + [ + 3291.00, + 2873.00 + ], + [ + 3289.00, + 2881.00 + ], + [ + 3288.00, + 2887.00 + ], + [ + 3287.00, + 2893.00 + ], + [ + 3284.00, + 2907.00 + ], + [ + 3282.00, + 2917.00 + ], + [ + 3280.00, + 2927.00 + ], + [ + 3273.00, + 2936.00 + ], + [ + 3271.00, + 2941.00 + ], + [ + 3269.00, + 2946.00 + ], + [ + 3261.00, + 2964.00 + ], + [ + 3259.00, + 2968.00 + ], + [ + 3257.00, + 2972.00 + ], + [ + 3247.00, + 2986.00 + ], + [ + 3239.00, + 2995.00 + ], + [ + 3231.00, + 3004.00 + ], + [ + 3227.00, + 3008.00 + ], + [ + 3224.00, + 3011.00 + ], + [ + 3221.00, + 3014.00 + ], + [ + 3206.00, + 3029.00 + ], + [ + 3206.00, + 3029.00 + ], + [ + 3206.00, + 3029.00 + ], + [ + 3179.00, + 3035.00 + ], + [ + 3179.00, + 3035.00 + ], + [ + 3179.00, + 3035.00 + ], + [ + 3156.00, + 3032.00 + ], + [ + 3154.00, + 3032.00 + ], + [ + 3152.00, + 3032.00 + ], + [ + 3148.00, + 3032.00 + ], + [ + 3148.00, + 3032.00 + ], + [ + 3148.00, + 3032.00 + ], + [ + 3134.00, + 3031.00 + ], + [ + 3130.00, + 3031.00 + ], + [ + 3126.00, + 3031.00 + ], + [ + 3119.00, + 3035.00 + ], + [ + 3116.00, + 3036.00 + ], + [ + 3113.00, + 3037.00 + ], + [ + 3099.00, + 3039.00 + ], + [ + 3093.00, + 3040.00 + ], + [ + 3087.00, + 3041.00 + ], + [ + 3084.00, + 3041.00 + ], + [ + 3082.00, + 3041.00 + ], + [ + 3080.00, + 3041.00 + ], + [ + 3072.00, + 3045.00 + ], + [ + 3066.00, + 3047.00 + ], + [ + 3060.00, + 3049.00 + ], + [ + 3051.00, + 3051.00 + ], + [ + 3050.00, + 3051.00 + ], + [ + 3049.00, + 3051.00 + ], + [ + 3020.00, + 3064.00 + ], + [ + 3019.00, + 3064.00 + ], + [ + 3018.00, + 3064.00 + ], + [ + 2989.00, + 3066.00 + ], + [ + 2985.00, + 3066.00 + ], + [ + 2981.00, + 3066.00 + ], + [ + 2957.00, + 3064.00 + ], + [ + 2957.00, + 3064.00 + ], + [ + 2957.00, + 3064.00 + ], + [ + 2937.00, + 3058.00 + ], + [ + 2934.00, + 3057.00 + ], + [ + 2931.00, + 3056.00 + ], + [ + 2911.00, + 3043.00 + ], + [ + 2911.00, + 3043.00 + ], + [ + 2911.00, + 3043.00 + ], + [ + 2896.00, + 3027.00 + ], + [ + 2896.00, + 3026.00 + ], + [ + 2896.00, + 3025.00 + ], + [ + 2887.00, + 3012.00 + ], + [ + 2887.00, + 3012.00 + ], + [ + 2887.00, + 3012.00 + ], + [ + 2884.00, + 2992.00 + ], + [ + 2884.00, + 2992.00 + ], + [ + 2884.00, + 2992.00 + ], + [ + 2880.00, + 2979.00 + ], + [ + 2880.00, + 2979.00 + ], + [ + 2880.00, + 2979.00 + ], + [ + 2879.00, + 2964.00 + ], + [ + 2879.00, + 2964.00 + ], + [ + 2879.00, + 2964.00 + ], + [ + 2879.00, + 2950.00 + ], + [ + 2879.00, + 2947.00 + ], + [ + 2879.00, + 2944.00 + ], + [ + 2875.00, + 2934.00 + ], + [ + 2875.00, + 2934.00 + ], + [ + 2875.00, + 2934.00 + ], + [ + 2873.00, + 2917.00 + ], + [ + 2873.00, + 2912.00 + ], + [ + 2873.00, + 2907.00 + ], + [ + 2872.00, + 2904.00 + ], + [ + 2872.00, + 2903.00 + ], + [ + 2872.00, + 2902.00 + ], + [ + 2871.00, + 2887.00 + ], + [ + 2871.00, + 2887.00 + ], + [ + 2871.00, + 2887.00 + ], + [ + 2867.00, + 2862.00 + ], + [ + 2867.00, + 2860.00 + ], + [ + 2867.00, + 2858.00 + ], + [ + 2864.00, + 2840.00 + ], + [ + 2862.00, + 2835.00 + ], + [ + 2860.00, + 2830.00 + ], + [ + 2858.00, + 2828.00 + ], + [ + 2857.00, + 2828.00 + ], + [ + 2856.00, + 2828.00 + ], + [ + 2839.00, + 2809.00 + ], + [ + 2838.00, + 2809.00 + ], + [ + 2837.00, + 2809.00 + ], + [ + 2822.00, + 2802.00 + ], + [ + 2818.00, + 2798.00 + ], + [ + 2814.00, + 2794.00 + ], + [ + 2810.00, + 2790.00 + ], + [ + 2810.00, + 2790.00 + ], + [ + 2810.00, + 2790.00 + ], + [ + 2795.00, + 2784.00 + ], + [ + 2792.00, + 2783.00 + ], + [ + 2789.00, + 2782.00 + ], + [ + 2784.00, + 2776.00 + ], + [ + 2784.00, + 2776.00 + ], + [ + 2784.00, + 2776.00 + ], + [ + 2773.00, + 2771.00 + ], + [ + 2765.00, + 2767.00 + ], + [ + 2757.00, + 2763.00 + ], + [ + 2759.00, + 2764.00 + ], + [ + 2758.00, + 2763.00 + ], + [ + 2757.00, + 2762.00 + ], + [ + 2739.00, + 2757.00 + ], + [ + 2738.00, + 2757.00 + ], + [ + 2737.00, + 2757.00 + ], + [ + 2726.00, + 2755.00 + ], + [ + 2724.00, + 2754.00 + ], + [ + 2722.00, + 2753.00 + ], + [ + 2704.00, + 2751.00 + ], + [ + 2702.00, + 2751.00 + ], + [ + 2700.00, + 2751.00 + ], + [ + 2693.00, + 2744.00 + ], + [ + 2690.00, + 2742.00 + ], + [ + 2687.00, + 2740.00 + ], + [ + 2688.00, + 2731.00 + ], + [ + 2687.00, + 2729.00 + ], + [ + 2686.00, + 2727.00 + ], + [ + 2687.00, + 2713.00 + ], + [ + 2687.00, + 2713.00 + ], + [ + 2687.00, + 2713.00 + ], + [ + 2685.00, + 2693.00 + ], + [ + 2685.00, + 2694.00 + ], + [ + 2685.00, + 2695.00 + ], + [ + 2679.00, + 2680.00 + ], + [ + 2678.00, + 2676.00 + ], + [ + 2677.00, + 2672.00 + ], + [ + 2673.00, + 2663.00 + ], + [ + 2673.00, + 2662.00 + ], + [ + 2673.00, + 2661.00 + ], + [ + 2671.00, + 2648.00 + ], + [ + 2671.00, + 2646.00 + ], + [ + 2671.00, + 2644.00 + ], + [ + 2663.00, + 2630.00 + ], + [ + 2663.00, + 2630.00 + ], + [ + 2663.00, + 2630.00 + ], + [ + 2646.00, + 2616.00 + ], + [ + 2634.00, + 2606.00 + ], + [ + 2629.00, + 2600.00 + ], + [ + 2617.00, + 2600.00 + ], + [ + 2617.00, + 2600.00 + ], + [ + 2617.00, + 2600.00 + ], + [ + 2578.00, + 2590.00 + ], + [ + 2577.00, + 2590.00 + ], + [ + 2576.00, + 2590.00 + ], + [ + 2569.00, + 2580.00 + ], + [ + 2569.00, + 2579.00 + ], + [ + 2569.00, + 2578.00 + ], + [ + 2556.00, + 2570.00 + ], + [ + 2553.00, + 2566.00 + ], + [ + 2550.00, + 2562.00 + ], + [ + 2548.00, + 2559.00 + ], + [ + 2547.00, + 2557.00 + ], + [ + 2546.00, + 2555.00 + ], + [ + 2537.00, + 2542.00 + ], + [ + 2536.00, + 2539.00 + ], + [ + 2535.00, + 2536.00 + ], + [ + 2527.00, + 2519.00 + ], + [ + 2526.00, + 2515.00 + ], + [ + 2525.00, + 2511.00 + ], + [ + 2520.00, + 2506.00 + ], + [ + 2520.00, + 2505.00 + ], + [ + 2520.00, + 2504.00 + ], + [ + 2512.00, + 2492.00 + ], + [ + 2512.00, + 2492.00 + ], + [ + 2512.00, + 2492.00 + ], + [ + 2504.00, + 2477.00 + ], + [ + 2504.00, + 2477.00 + ], + [ + 2504.00, + 2477.00 + ], + [ + 2498.00, + 2464.00 + ], + [ + 2498.00, + 2459.00 + ], + [ + 2498.00, + 2454.00 + ], + [ + 2496.00, + 2440.00 + ], + [ + 2496.00, + 2439.00 + ], + [ + 2496.00, + 2438.00 + ], + [ + 2493.00, + 2418.00 + ], + [ + 2493.00, + 2418.00 + ], + [ + 2493.00, + 2418.00 + ], + [ + 2494.00, + 2397.00 + ], + [ + 2492.00, + 2396.00 + ], + [ + 2490.00, + 2395.00 + ], + [ + 2481.00, + 2393.00 + ], + [ + 2477.00, + 2391.00 + ], + [ + 2473.00, + 2389.00 + ], + [ + 2465.00, + 2386.00 + ], + [ + 2464.00, + 2384.00 + ], + [ + 2463.00, + 2382.00 + ], + [ + 2453.00, + 2376.00 + ], + [ + 2450.00, + 2374.00 + ], + [ + 2447.00, + 2372.00 + ], + [ + 2437.00, + 2361.00 + ], + [ + 2435.00, + 2359.00 + ], + [ + 2433.00, + 2357.00 + ], + [ + 2423.00, + 2343.00 + ], + [ + 2417.00, + 2335.00 + ], + [ + 2415.00, + 2332.00 + ], + [ + 2415.00, + 2328.00 + ], + [ + 2414.00, + 2323.00 + ], + [ + 2413.00, + 2318.00 + ], + [ + 2411.00, + 2314.00 + ], + [ + 2410.00, + 2309.00 + ], + [ + 2409.00, + 2304.00 + ], + [ + 2407.00, + 2293.00 + ], + [ + 2407.00, + 2291.00 + ], + [ + 2407.00, + 2289.00 + ], + [ + 2400.00, + 2281.00 + ], + [ + 2399.00, + 2280.00 + ], + [ + 2398.00, + 2279.00 + ], + [ + 2390.00, + 2277.00 + ], + [ + 2390.00, + 2276.00 + ], + [ + 2390.00, + 2275.00 + ], + [ + 2379.00, + 2274.00 + ], + [ + 2377.00, + 2273.00 + ], + [ + 2375.00, + 2272.00 + ], + [ + 2361.00, + 2265.00 + ], + [ + 2360.00, + 2265.00 + ], + [ + 2359.00, + 2265.00 + ], + [ + 2347.00, + 2261.00 + ], + [ + 2347.00, + 2261.00 + ], + [ + 2347.00, + 2261.00 + ], + [ + 2329.00, + 2250.00 + ], + [ + 2329.00, + 2250.00 + ], + [ + 2329.00, + 2250.00 + ], + [ + 2321.00, + 2242.00 + ], + [ + 2320.00, + 2240.00 + ], + [ + 2319.00, + 2238.00 + ], + [ + 2314.00, + 2224.00 + ], + [ + 2314.00, + 2224.00 + ], + [ + 2314.00, + 2224.00 + ], + [ + 2312.00, + 2201.00 + ], + [ + 2312.00, + 2196.00 + ], + [ + 2312.00, + 2191.00 + ], + [ + 2316.00, + 2184.00 + ], + [ + 2316.00, + 2184.00 + ], + [ + 2316.00, + 2184.00 + ], + [ + 2321.00, + 2180.00 + ], + [ + 2323.00, + 2173.00 + ], + [ + 2323.00, + 2172.00 + ], + [ + 2327.00, + 2164.00 + ], + [ + 2327.00, + 2164.00 + ], + [ + 2327.00, + 2164.00 + ], + [ + 2332.00, + 2150.00 + ], + [ + 2332.00, + 2148.00 + ], + [ + 2332.00, + 2146.00 + ], + [ + 2332.00, + 2137.00 + ], + [ + 2332.00, + 2137.00 + ], + [ + 2332.00, + 2137.00 + ], + [ + 2336.00, + 2123.00 + ], + [ + 2336.00, + 2123.00 + ], + [ + 2336.00, + 2123.00 + ], + [ + 2341.00, + 2135.00 + ], + [ + 2341.00, + 2135.00 + ], + [ + 2341.00, + 2135.00 + ], + [ + 2342.00, + 2142.00 + ], + [ + 2342.00, + 2142.00 + ], + [ + 2342.00, + 2142.00 + ], + [ + 2343.00, + 2151.00 + ], + [ + 2344.00, + 2152.00 + ], + [ + 2345.00, + 2153.00 + ], + [ + 2346.00, + 2161.00 + ], + [ + 2346.00, + 2161.00 + ], + [ + 2346.00, + 2161.00 + ], + [ + 2346.00, + 2179.00 + ], + [ + 2346.00, + 2180.00 + ], + [ + 2346.00, + 2181.00 + ], + [ + 2346.00, + 2189.00 + ], + [ + 2346.00, + 2193.00 + ], + [ + 2346.00, + 2197.00 + ], + [ + 2345.00, + 2201.00 + ], + [ + 2345.00, + 2202.00 + ], + [ + 2345.00, + 2203.00 + ], + [ + 2340.00, + 2213.00 + ], + [ + 2340.00, + 2215.00 + ], + [ + 2340.00, + 2217.00 + ], + [ + 2342.00, + 2225.00 + ], + [ + 2342.00, + 2227.00 + ], + [ + 2342.00, + 2229.00 + ], + [ + 2344.00, + 2240.00 + ], + [ + 2345.00, + 2243.00 + ], + [ + 2346.00, + 2246.00 + ], + [ + 2346.00, + 2249.00 + ], + [ + 2346.00, + 2249.00 + ], + [ + 2346.00, + 2249.00 + ], + [ + 2359.00, + 2254.00 + ], + [ + 2360.00, + 2254.00 + ], + [ + 2361.00, + 2254.00 + ], + [ + 2377.00, + 2255.00 + ], + [ + 2378.00, + 2255.00 + ], + [ + 2379.00, + 2255.00 + ], + [ + 2393.00, + 2260.00 + ], + [ + 2393.00, + 2260.00 + ], + [ + 2393.00, + 2260.00 + ], + [ + 2404.00, + 2264.00 + ], + [ + 2404.00, + 2264.00 + ], + [ + 2404.00, + 2264.00 + ], + [ + 2415.00, + 2270.00 + ], + [ + 2415.00, + 2270.00 + ], + [ + 2415.00, + 2270.00 + ], + [ + 2414.00, + 2280.00 + ], + [ + 2414.00, + 2281.00 + ], + [ + 2414.00, + 2282.00 + ], + [ + 2414.00, + 2291.00 + ], + [ + 2414.00, + 2291.00 + ], + [ + 2414.00, + 2291.00 + ], + [ + 2428.00, + 2328.00 + ], + [ + 2427.00, + 2328.00 + ], + [ + 2426.00, + 2328.00 + ], + [ + 2425.00, + 2321.00 + ], + [ + 2425.00, + 2320.00 + ], + [ + 2420.99, + 2317.60 + ], + [ + 2417.59, + 2305.71 + ], + [ + 2427.00, + 2308.00 + ], + [ + 2427.00, + 2307.73 + ], + [ + 2427.15, + 2306.86 + ], + [ + 2427.36, + 2305.73 + ], + [ + 2427.94, + 2302.69 + ], + [ + 2429.00, + 2297.73 + ], + [ + 2429.00, + 2297.00 + ], + [ + 2429.00, + 2296.00 + ], + [ + 2435.00, + 2285.00 + ], + [ + 2436.00, + 2284.00 + ], + [ + 2437.00, + 2283.00 + ], + [ + 2451.00, + 2280.00 + ], + [ + 2451.00, + 2280.00 + ], + [ + 2451.00, + 2280.00 + ], + [ + 2464.00, + 2287.00 + ], + [ + 2465.00, + 2287.00 + ], + [ + 2466.00, + 2287.00 + ], + [ + 2479.00, + 2294.00 + ], + [ + 2480.00, + 2294.00 + ], + [ + 2481.00, + 2294.00 + ], + [ + 2500.00, + 2305.00 + ], + [ + 2500.00, + 2305.00 + ], + [ + 2500.00, + 2305.00 + ], + [ + 2518.00, + 2317.00 + ], + [ + 2518.00, + 2317.00 + ], + [ + 2518.00, + 2317.00 + ], + [ + 2533.00, + 2327.00 + ], + [ + 2533.00, + 2327.00 + ], + [ + 2533.00, + 2327.00 + ], + [ + 2545.00, + 2330.00 + ], + [ + 2545.00, + 2330.00 + ], + [ + 2545.00, + 2330.00 + ], + [ + 2555.00, + 2342.00 + ], + [ + 2555.00, + 2342.00 + ], + [ + 2555.00, + 2342.00 + ], + [ + 2565.00, + 2351.00 + ], + [ + 2565.00, + 2352.00 + ], + [ + 2565.00, + 2353.00 + ], + [ + 2576.00, + 2361.00 + ], + [ + 2576.00, + 2361.00 + ], + [ + 2576.00, + 2361.00 + ], + [ + 2590.00, + 2390.00 + ], + [ + 2590.00, + 2390.00 + ], + [ + 2590.00, + 2390.00 + ], + [ + 2596.00, + 2369.00 + ], + [ + 2597.00, + 2357.00 + ], + [ + 2598.00, + 2345.00 + ], + [ + 2599.00, + 2344.00 + ], + [ + 2600.00, + 2334.00 + ], + [ + 2601.00, + 2324.00 + ], + [ + 2600.00, + 2321.00 + ], + [ + 2600.00, + 2311.00 + ], + [ + 2600.00, + 2301.00 + ], + [ + 2600.00, + 2304.00 + ], + [ + 2600.00, + 2298.00 + ], + [ + 2600.00, + 2292.00 + ], + [ + 2600.00, + 2283.00 + ], + [ + 2600.00, + 2272.00 + ], + [ + 2600.00, + 2261.00 + ], + [ + 2600.00, + 2266.00 + ], + [ + 2600.00, + 2256.00 + ], + [ + 2600.00, + 2246.00 + ], + [ + 2600.00, + 2249.00 + ], + [ + 2601.00, + 2234.00 + ], + [ + 2602.00, + 2219.00 + ], + [ + 2602.00, + 2226.00 + ], + [ + 2602.00, + 2197.00 + ], + [ + 2602.00, + 2182.00 + ], + [ + 2601.00, + 2190.00 + ], + [ + 2599.00, + 2178.00 + ], + [ + 2597.00, + 2166.00 + ], + [ + 2599.00, + 2170.00 + ], + [ + 2602.00, + 2162.00 + ], + [ + 2605.00, + 2154.00 + ], + [ + 2606.00, + 2154.00 + ], + [ + 2608.00, + 2147.00 + ], + [ + 2610.00, + 2140.00 + ], + [ + 2611.00, + 2137.00 + ], + [ + 2614.00, + 2132.00 + ], + [ + 2617.00, + 2127.00 + ], + [ + 2617.00, + 2126.00 + ], + [ + 2617.00, + 2123.00 + ], + [ + 2617.00, + 2120.00 + ], + [ + 2618.00, + 2115.00 + ], + [ + 2619.00, + 2111.00 + ], + [ + 2620.00, + 2107.00 + ], + [ + 2622.00, + 2105.00 + ], + [ + 2623.00, + 2103.00 + ], + [ + 2624.00, + 2101.00 + ], + [ + 2625.00, + 2091.00 + ], + [ + 2625.00, + 2089.00 + ], + [ + 2625.00, + 2087.00 + ], + [ + 2642.00, + 2087.00 + ], + [ + 2650.00, + 2088.00 + ], + [ + 2652.00, + 2088.00 + ], + [ + 2657.00, + 2090.00 + ], + [ + 2658.00, + 2091.00 + ], + [ + 2659.00, + 2092.00 + ], + [ + 2666.00, + 2092.00 + ], + [ + 2667.00, + 2093.00 + ], + [ + 2668.00, + 2094.00 + ], + [ + 2684.00, + 2097.00 + ], + [ + 2686.00, + 2098.00 + ], + [ + 2688.00, + 2099.00 + ], + [ + 2695.00, + 2103.00 + ], + [ + 2696.00, + 2104.00 + ], + [ + 2697.00, + 2105.00 + ], + [ + 2708.00, + 2112.00 + ], + [ + 2708.00, + 2112.00 + ], + [ + 2708.00, + 2112.00 + ], + [ + 2730.00, + 2128.00 + ], + [ + 2730.00, + 2128.00 + ], + [ + 2730.00, + 2128.00 + ], + [ + 2745.00, + 2140.00 + ], + [ + 2745.00, + 2140.00 + ], + [ + 2745.00, + 2140.00 + ], + [ + 2761.00, + 2150.00 + ], + [ + 2761.00, + 2150.00 + ], + [ + 2761.00, + 2150.00 + ], + [ + 2791.00, + 2168.00 + ], + [ + 2791.00, + 2168.00 + ], + [ + 2791.00, + 2168.00 + ], + [ + 2808.00, + 2194.00 + ], + [ + 2808.00, + 2194.00 + ], + [ + 2808.00, + 2194.00 + ], + [ + 2823.00, + 2214.00 + ], + [ + 2823.00, + 2214.00 + ], + [ + 2823.00, + 2214.00 + ], + [ + 2850.00, + 2233.00 + ], + [ + 2850.00, + 2233.00 + ], + [ + 2850.00, + 2233.00 + ], + [ + 2865.00, + 2250.00 + ], + [ + 2865.00, + 2250.00 + ], + [ + 2865.00, + 2250.00 + ], + [ + 2878.00, + 2269.00 + ], + [ + 2878.00, + 2269.00 + ], + [ + 2878.00, + 2269.00 + ], + [ + 2890.00, + 2286.00 + ], + [ + 2891.00, + 2287.00 + ], + [ + 2892.00, + 2288.00 + ], + [ + 2904.00, + 2291.00 + ], + [ + 2904.00, + 2291.00 + ], + [ + 2904.00, + 2291.00 + ], + [ + 2921.00, + 2293.00 + ], + [ + 2924.00, + 2293.00 + ], + [ + 2927.00, + 2293.00 + ], + [ + 2949.00, + 2300.00 + ], + [ + 2952.00, + 2301.00 + ], + [ + 2955.00, + 2302.00 + ], + [ + 2970.00, + 2308.00 + ], + [ + 2970.00, + 2308.00 + ], + [ + 2970.00, + 2308.00 + ], + [ + 2986.00, + 2325.00 + ], + [ + 2989.00, + 2328.00 + ], + [ + 2992.00, + 2331.00 + ], + [ + 3009.00, + 2340.00 + ], + [ + 3009.00, + 2340.00 + ], + [ + 3009.00, + 2340.00 + ], + [ + 3016.00, + 2355.00 + ], + [ + 3016.00, + 2355.00 + ], + [ + 3016.00, + 2355.00 + ], + [ + 3031.00, + 2368.00 + ], + [ + 3031.00, + 2368.00 + ], + [ + 3031.00, + 2368.00 + ], + [ + 3049.00, + 2383.00 + ], + [ + 3049.00, + 2383.00 + ], + [ + 3049.00, + 2383.00 + ], + [ + 3053.00, + 2367.00 + ], + [ + 3053.00, + 2366.00 + ], + [ + 3053.00, + 2365.00 + ], + [ + 3045.00, + 2348.00 + ], + [ + 3045.00, + 2345.00 + ], + [ + 3045.00, + 2342.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3037.00, + 2288.00 + ], + [ + 3035.00, + 2285.00 + ], + [ + 3033.00, + 2282.00 + ], + [ + 3031.00, + 2270.00 + ], + [ + 3031.00, + 2268.00 + ], + [ + 3031.00, + 2266.00 + ], + [ + 3028.00, + 2252.00 + ], + [ + 3028.00, + 2249.00 + ], + [ + 3028.00, + 2246.00 + ], + [ + 3024.00, + 2231.00 + ], + [ + 3024.00, + 2228.00 + ], + [ + 3024.00, + 2225.00 + ], + [ + 3028.00, + 2215.00 + ], + [ + 3029.00, + 2211.00 + ], + [ + 3030.00, + 2207.00 + ], + [ + 3032.00, + 2193.00 + ], + [ + 3033.00, + 2190.00 + ], + [ + 3034.00, + 2187.00 + ], + [ + 3039.00, + 2177.00 + ], + [ + 3039.00, + 2176.00 + ], + [ + 3039.00, + 2175.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3046.00, + 2150.00 + ], + [ + 3046.00, + 2149.00 + ], + [ + 3046.00, + 2148.00 + ], + [ + 3051.00, + 2131.00 + ], + [ + 3052.00, + 2130.00 + ], + [ + 3053.00, + 2129.00 + ], + [ + 3054.00, + 2114.00 + ], + [ + 3054.00, + 2113.00 + ], + [ + 3054.00, + 2112.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3006.00, + 2071.00 + ], + [ + 3005.00, + 2070.00 + ], + [ + 3004.00, + 2069.00 + ], + [ + 3003.00, + 2055.00 + ], + [ + 3003.00, + 2051.00 + ], + [ + 3003.00, + 2047.00 + ], + [ + 3009.00, + 2039.00 + ], + [ + 3010.00, + 2038.00 + ], + [ + 3011.00, + 2037.00 + ], + [ + 3020.00, + 2021.00 + ], + [ + 3021.00, + 2020.00 + ], + [ + 3022.00, + 2019.00 + ], + [ + 3031.00, + 2002.00 + ], + [ + 3031.00, + 2000.00 + ], + [ + 3031.00, + 1998.00 + ], + [ + 3027.00, + 1985.00 + ], + [ + 3027.00, + 1984.00 + ], + [ + 3027.00, + 1983.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2960.00, + 1983.00 + ], + [ + 2954.00, + 1979.00 + ], + [ + 2948.00, + 1975.00 + ], + [ + 2946.00, + 1970.00 + ], + [ + 2945.00, + 1968.00 + ], + [ + 2944.00, + 1966.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2941.00, + 1935.00 + ], + [ + 2941.00, + 1933.00 + ], + [ + 2941.00, + 1931.00 + ], + [ + 2948.00, + 1923.00 + ], + [ + 2949.00, + 1921.00 + ], + [ + 2950.00, + 1919.00 + ], + [ + 2955.00, + 1910.00 + ], + [ + 2955.00, + 1909.00 + ], + [ + 2955.00, + 1908.00 + ], + [ + 2956.00, + 1901.00 + ], + [ + 2956.00, + 1900.00 + ], + [ + 2956.00, + 1899.00 + ], + [ + 2947.00, + 1893.00 + ], + [ + 2943.00, + 1889.00 + ], + [ + 2939.00, + 1885.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2913.00, + 1880.00 + ], + [ + 2910.00, + 1879.00 + ], + [ + 2907.00, + 1878.00 + ], + [ + 2901.00, + 1874.00 + ], + [ + 2900.00, + 1873.00 + ], + [ + 2899.00, + 1872.00 + ], + [ + 2886.00, + 1861.00 + ], + [ + 2881.00, + 1857.00 + ], + [ + 2876.00, + 1853.00 + ], + [ + 2868.00, + 1848.00 + ], + [ + 2866.00, + 1846.00 + ], + [ + 2864.00, + 1844.00 + ], + [ + 2851.00, + 1836.00 + ], + [ + 2850.00, + 1836.00 + ], + [ + 2849.00, + 1836.00 + ], + [ + 2838.00, + 1828.00 + ], + [ + 2837.00, + 1827.00 + ], + [ + 2836.00, + 1826.00 + ], + [ + 2821.00, + 1820.00 + ], + [ + 2818.00, + 1819.00 + ], + [ + 2815.00, + 1818.00 + ], + [ + 2803.00, + 1811.00 + ], + [ + 2801.00, + 1810.00 + ], + [ + 2799.00, + 1809.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2791.00, + 1787.00 + ], + [ + 2791.00, + 1785.00 + ], + [ + 2791.00, + 1783.00 + ], + [ + 2790.00, + 1772.00 + ], + [ + 2784.00, + 1766.00 + ], + [ + 2778.00, + 1760.00 + ], + [ + 2787.00, + 1746.00 + ], + [ + 2787.00, + 1745.00 + ], + [ + 2787.00, + 1744.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2744.00, + 1728.00 + ], + [ + 2744.00, + 1727.00 + ], + [ + 2744.00, + 1726.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2660.00, + 1693.00 + ], + [ + 2659.00, + 1693.00 + ], + [ + 2658.00, + 1693.00 + ], + [ + 2646.00, + 1685.00 + ], + [ + 2645.00, + 1684.00 + ], + [ + 2644.00, + 1683.00 + ], + [ + 2636.00, + 1679.00 + ], + [ + 2634.00, + 1677.00 + ], + [ + 2632.00, + 1675.00 + ], + [ + 2624.00, + 1667.00 + ], + [ + 2624.00, + 1666.00 + ], + [ + 2624.00, + 1665.00 + ], + [ + 2613.00, + 1653.00 + ], + [ + 2612.00, + 1652.00 + ], + [ + 2611.00, + 1651.00 + ], + [ + 2598.00, + 1647.00 + ], + [ + 2598.00, + 1646.00 + ], + [ + 2598.00, + 1645.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2538.00, + 1545.00 + ], + [ + 2537.00, + 1544.00 + ], + [ + 2536.00, + 1543.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2514.00, + 1534.00 + ], + [ + 2513.00, + 1534.00 + ], + [ + 2512.00, + 1534.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2477.00, + 1533.00 + ], + [ + 2473.00, + 1533.00 + ], + [ + 2469.00, + 1533.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2428.00, + 1540.00 + ], + [ + 2427.00, + 1540.00 + ], + [ + 2426.00, + 1540.00 + ], + [ + 2407.00, + 1537.00 + ], + [ + 2404.00, + 1535.00 + ], + [ + 2401.00, + 1533.00 + ], + [ + 2394.00, + 1529.00 + ], + [ + 2394.00, + 1526.00 + ], + [ + 2394.00, + 1523.00 + ], + [ + 2398.00, + 1509.00 + ], + [ + 2399.00, + 1507.00 + ], + [ + 2400.00, + 1505.00 + ], + [ + 2401.00, + 1496.00 + ], + [ + 2403.00, + 1488.00 + ], + [ + 2405.00, + 1480.00 + ], + [ + 2409.00, + 1474.00 + ], + [ + 2410.00, + 1471.00 + ], + [ + 2411.00, + 1468.00 + ], + [ + 2417.00, + 1457.00 + ], + [ + 2419.00, + 1453.00 + ], + [ + 2421.00, + 1449.00 + ], + [ + 2425.00, + 1439.00 + ], + [ + 2426.00, + 1438.00 + ], + [ + 2427.00, + 1437.00 + ], + [ + 2432.00, + 1423.00 + ], + [ + 2434.00, + 1419.00 + ], + [ + 2436.00, + 1415.00 + ], + [ + 2439.00, + 1408.00 + ], + [ + 2440.00, + 1406.00 + ], + [ + 2441.00, + 1404.00 + ], + [ + 2455.00, + 1402.00 + ], + [ + 2460.00, + 1401.00 + ], + [ + 2465.00, + 1400.00 + ], + [ + 2468.00, + 1400.00 + ], + [ + 2476.00, + 1402.00 + ], + [ + 2484.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2515.00, + 1404.00 + ], + [ + 2516.00, + 1403.00 + ], + [ + 2517.00, + 1402.00 + ], + [ + 2503.00, + 1398.00 + ], + [ + 2501.00, + 1398.00 + ], + [ + 2499.00, + 1398.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2457.00, + 1367.00 + ], + [ + 2463.00, + 1355.00 + ], + [ + 2466.00, + 1348.00 + ], + [ + 2467.00, + 1348.00 + ], + [ + 2470.00, + 1340.00 + ], + [ + 2473.00, + 1332.00 + ], + [ + 2471.00, + 1331.00 + ], + [ + 2491.00, + 1287.00 + ], + [ + 2493.00, + 1281.00 + ], + [ + 2490.00, + 1275.00 + ], + [ + 2492.00, + 1273.00 + ], + [ + 2494.00, + 1271.00 + ], + [ + 2505.00, + 1241.00 + ], + [ + 2507.00, + 1237.00 + ], + [ + 2509.00, + 1233.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2517.00, + 1210.00 + ], + [ + 2516.00, + 1206.00 + ], + [ + 2515.00, + 1202.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2500.00, + 1163.00 + ], + [ + 2501.00, + 1162.00 + ], + [ + 2506, + 1147 + ], + [ + 2514, + 1132 + ] + ] + }, + { + "name": "Boromir", + "id": "boromir", + "color": "green", + "distance": "650 miles / 1050 km", + "startDate": "December 25, T.A. 3018", + "endDate": "February 25, T.A. 3019", + "path": [ + [ + 3045.00, + 2345.00 + ], + [ + 3045.00, + 2348.00 + ], + [ + 3045.00, + 2345.00 + ], + [ + 3045.00, + 2342.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3037.00, + 2288.00 + ], + [ + 3035.00, + 2285.00 + ], + [ + 3033.00, + 2282.00 + ], + [ + 3031.00, + 2270.00 + ], + [ + 3031.00, + 2268.00 + ], + [ + 3031.00, + 2266.00 + ], + [ + 3028.00, + 2252.00 + ], + [ + 3028.00, + 2249.00 + ], + [ + 3028.00, + 2246.00 + ], + [ + 3024.00, + 2231.00 + ], + [ + 3024.00, + 2228.00 + ], + [ + 3024.00, + 2225.00 + ], + [ + 3028.00, + 2215.00 + ], + [ + 3029.00, + 2211.00 + ], + [ + 3030.00, + 2207.00 + ], + [ + 3032.00, + 2193.00 + ], + [ + 3033.00, + 2190.00 + ], + [ + 3034.00, + 2187.00 + ], + [ + 3039.00, + 2177.00 + ], + [ + 3039.00, + 2176.00 + ], + [ + 3039.00, + 2175.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3046.00, + 2150.00 + ], + [ + 3046.00, + 2149.00 + ], + [ + 3046.00, + 2148.00 + ], + [ + 3051.00, + 2131.00 + ], + [ + 3052.00, + 2130.00 + ], + [ + 3053.00, + 2129.00 + ], + [ + 3054.00, + 2114.00 + ], + [ + 3054.00, + 2113.00 + ], + [ + 3054.00, + 2112.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3006.00, + 2071.00 + ], + [ + 3005.00, + 2070.00 + ], + [ + 3004.00, + 2069.00 + ], + [ + 3003.00, + 2055.00 + ], + [ + 3003.00, + 2051.00 + ], + [ + 3003.00, + 2047.00 + ], + [ + 3009.00, + 2039.00 + ], + [ + 3010.00, + 2038.00 + ], + [ + 3011.00, + 2037.00 + ], + [ + 3020.00, + 2021.00 + ], + [ + 3021.00, + 2020.00 + ], + [ + 3022.00, + 2019.00 + ], + [ + 3031.00, + 2002.00 + ], + [ + 3031.00, + 2000.00 + ], + [ + 3031.00, + 1998.00 + ], + [ + 3027.00, + 1985.00 + ], + [ + 3027.00, + 1984.00 + ], + [ + 3027.00, + 1983.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2960.00, + 1983.00 + ], + [ + 2954.00, + 1979.00 + ], + [ + 2948.00, + 1975.00 + ], + [ + 2946.00, + 1970.00 + ], + [ + 2945.00, + 1968.00 + ], + [ + 2944.00, + 1966.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2941.00, + 1935.00 + ], + [ + 2941.00, + 1933.00 + ], + [ + 2941.00, + 1931.00 + ], + [ + 2948.00, + 1923.00 + ], + [ + 2949.00, + 1921.00 + ], + [ + 2950.00, + 1919.00 + ], + [ + 2955.00, + 1910.00 + ], + [ + 2955.00, + 1909.00 + ], + [ + 2955.00, + 1908.00 + ], + [ + 2956.00, + 1901.00 + ], + [ + 2956.00, + 1900.00 + ], + [ + 2956.00, + 1899.00 + ], + [ + 2947.00, + 1893.00 + ], + [ + 2943.00, + 1889.00 + ], + [ + 2939.00, + 1885.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2913.00, + 1880.00 + ], + [ + 2910.00, + 1879.00 + ], + [ + 2907.00, + 1878.00 + ], + [ + 2901.00, + 1874.00 + ], + [ + 2900.00, + 1873.00 + ], + [ + 2899.00, + 1872.00 + ], + [ + 2886.00, + 1861.00 + ], + [ + 2881.00, + 1857.00 + ], + [ + 2876.00, + 1853.00 + ], + [ + 2868.00, + 1848.00 + ], + [ + 2866.00, + 1846.00 + ], + [ + 2864.00, + 1844.00 + ], + [ + 2851.00, + 1836.00 + ], + [ + 2850.00, + 1836.00 + ], + [ + 2849.00, + 1836.00 + ], + [ + 2838.00, + 1828.00 + ], + [ + 2837.00, + 1827.00 + ], + [ + 2836.00, + 1826.00 + ], + [ + 2821.00, + 1820.00 + ], + [ + 2818.00, + 1819.00 + ], + [ + 2815.00, + 1818.00 + ], + [ + 2803.00, + 1811.00 + ], + [ + 2801.00, + 1810.00 + ], + [ + 2799.00, + 1809.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2791.00, + 1787.00 + ], + [ + 2791.00, + 1785.00 + ], + [ + 2791.00, + 1783.00 + ], + [ + 2790.00, + 1772.00 + ], + [ + 2784.00, + 1766.00 + ], + [ + 2778.00, + 1760.00 + ], + [ + 2787.00, + 1746.00 + ], + [ + 2787.00, + 1745.00 + ], + [ + 2787.00, + 1744.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2744.00, + 1728.00 + ], + [ + 2744.00, + 1727.00 + ], + [ + 2744.00, + 1726.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2660.00, + 1693.00 + ], + [ + 2659.00, + 1693.00 + ], + [ + 2658.00, + 1693.00 + ], + [ + 2646.00, + 1685.00 + ], + [ + 2645.00, + 1684.00 + ], + [ + 2644.00, + 1683.00 + ], + [ + 2636.00, + 1679.00 + ], + [ + 2634.00, + 1677.00 + ], + [ + 2632.00, + 1675.00 + ], + [ + 2624.00, + 1667.00 + ], + [ + 2624.00, + 1666.00 + ], + [ + 2624.00, + 1665.00 + ], + [ + 2613.00, + 1653.00 + ], + [ + 2612.00, + 1652.00 + ], + [ + 2611.00, + 1651.00 + ], + [ + 2598.00, + 1647.00 + ], + [ + 2598.00, + 1646.00 + ], + [ + 2598.00, + 1645.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2538.00, + 1545.00 + ], + [ + 2537.00, + 1544.00 + ], + [ + 2536.00, + 1543.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2514.00, + 1534.00 + ], + [ + 2513.00, + 1534.00 + ], + [ + 2512.00, + 1534.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2477.00, + 1533.00 + ], + [ + 2473.00, + 1533.00 + ], + [ + 2469.00, + 1533.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2428.00, + 1540.00 + ], + [ + 2427.00, + 1540.00 + ], + [ + 2426.00, + 1540.00 + ], + [ + 2407.00, + 1537.00 + ], + [ + 2404.00, + 1535.00 + ], + [ + 2401.00, + 1533.00 + ], + [ + 2394.00, + 1529.00 + ], + [ + 2394.00, + 1526.00 + ], + [ + 2394.00, + 1523.00 + ], + [ + 2398.00, + 1509.00 + ], + [ + 2399.00, + 1507.00 + ], + [ + 2400.00, + 1505.00 + ], + [ + 2401.00, + 1496.00 + ], + [ + 2403.00, + 1488.00 + ], + [ + 2405.00, + 1480.00 + ], + [ + 2409.00, + 1474.00 + ], + [ + 2410.00, + 1471.00 + ], + [ + 2411.00, + 1468.00 + ], + [ + 2417.00, + 1457.00 + ], + [ + 2419.00, + 1453.00 + ], + [ + 2421.00, + 1449.00 + ], + [ + 2425.00, + 1439.00 + ], + [ + 2426.00, + 1438.00 + ], + [ + 2427.00, + 1437.00 + ], + [ + 2432.00, + 1423.00 + ], + [ + 2434.00, + 1419.00 + ], + [ + 2436.00, + 1415.00 + ], + [ + 2439.00, + 1408.00 + ], + [ + 2440.00, + 1406.00 + ], + [ + 2441.00, + 1404.00 + ], + [ + 2455.00, + 1402.00 + ], + [ + 2460.00, + 1401.00 + ], + [ + 2465.00, + 1400.00 + ], + [ + 2468.00, + 1400.00 + ], + [ + 2476.00, + 1402.00 + ], + [ + 2484.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2515.00, + 1404.00 + ], + [ + 2516.00, + 1403.00 + ], + [ + 2517.00, + 1402.00 + ], + [ + 2503.00, + 1398.00 + ], + [ + 2501.00, + 1398.00 + ], + [ + 2499.00, + 1398.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2457.00, + 1367.00 + ], + [ + 2463.00, + 1355.00 + ], + [ + 2466.00, + 1348.00 + ], + [ + 2467.00, + 1348.00 + ], + [ + 2470.00, + 1340.00 + ], + [ + 2473.00, + 1332.00 + ], + [ + 2471.00, + 1331.00 + ], + [ + 2491.00, + 1287.00 + ], + [ + 2493.00, + 1281.00 + ], + [ + 2490.00, + 1275.00 + ], + [ + 2492.00, + 1273.00 + ], + [ + 2494.00, + 1271.00 + ], + [ + 2505.00, + 1241.00 + ], + [ + 2507.00, + 1237.00 + ], + [ + 2509.00, + 1233.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2517.00, + 1210.00 + ], + [ + 2516.00, + 1206.00 + ], + [ + 2515.00, + 1202.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2500.00, + 1163.00 + ], + [ + 2501.00, + 1162.00 + ], + [ + 2506, + 1147 + ], + [ + 2514, + 1132 + ] + ] + }, + { + "name": "Gandalf the Grey", + "id": "gandalf_grey", + "color": "olive", + "distance": "280 miles / 450 km (from Rivendell)", + "startDate": "December 25, T.A. 3018", + "endDate": "January 15, T.A. 3019", + "path": [ + [ + 2337.00, + 2112.00 + ], + [ + 2344.50, + 2133.00 + ], + [ + 2344.50, + 2133.00 + ], + [ + 2344.50, + 2133.00 + ], + [ + 2344.50, + 2151.00 + ], + [ + 2344.50, + 2151.00 + ], + [ + 2344.50, + 2151.00 + ], + [ + 2344.50, + 2175.00 + ], + [ + 2344.50, + 2175.00 + ], + [ + 2344.50, + 2175.00 + ], + [ + 2341.50, + 2193.00 + ], + [ + 2344.50, + 2196.00 + ], + [ + 2347.50, + 2199.00 + ], + [ + 2356.50, + 2218.50 + ], + [ + 2356.50, + 2218.50 + ], + [ + 2356.50, + 2218.50 + ], + [ + 2365.50, + 2242.50 + ], + [ + 2365.50, + 2242.50 + ], + [ + 2365.50, + 2242.50 + ], + [ + 2389.50, + 2251.50 + ], + [ + 2389.50, + 2251.50 + ], + [ + 2389.50, + 2251.50 + ], + [ + 2416.50, + 2256.00 + ], + [ + 2416.50, + 2256.00 + ], + [ + 2416.50, + 2256.00 + ], + [ + 2445.00, + 2262.00 + ], + [ + 2445.00, + 2262.00 + ], + [ + 2445.00, + 2262.00 + ], + [ + 2475.00, + 2272.50 + ], + [ + 2475.00, + 2272.50 + ], + [ + 2475.00, + 2272.50 + ], + [ + 2494.50, + 2286.00 + ], + [ + 2494.50, + 2286.00 + ], + [ + 2494.50, + 2286.00 + ], + [ + 2520.00, + 2298.00 + ], + [ + 2520.00, + 2298.00 + ], + [ + 2520.00, + 2298.00 + ], + [ + 2547.00, + 2313.00 + ], + [ + 2547.00, + 2313.00 + ], + [ + 2547.00, + 2313.00 + ], + [ + 2569.50, + 2329.50 + ], + [ + 2569.50, + 2329.50 + ], + [ + 2569.50, + 2329.50 + ], + [ + 2581.50, + 2347.50 + ], + [ + 2581.50, + 2349.00 + ], + [ + 2581.50, + 2350.50 + ], + [ + 2589.00, + 2385.00 + ], + [ + 2589.00, + 2385.00 + ], + [ + 2589.00, + 2385.00 + ], + [ + 2572.50, + 2374.50 + ], + [ + 2572.50, + 2374.50 + ], + [ + 2572.50, + 2374.50 + ], + [ + 2554.50, + 2358.00 + ], + [ + 2554.50, + 2356.50 + ], + [ + 2554.50, + 2355.00 + ], + [ + 2526.00, + 2340.00 + ], + [ + 2526.00, + 2340.00 + ], + [ + 2526.00, + 2340.00 + ], + [ + 2476.50, + 2320.50 + ], + [ + 2476.50, + 2320.50 + ], + [ + 2476.50, + 2320.50 + ], + [ + 2449.50, + 2302.50 + ], + [ + 2449.50, + 2302.50 + ], + [ + 2449.50, + 2302.50 + ], + [ + 2422.50, + 2290.50 + ], + [ + 2422.50, + 2290.50 + ], + [ + 2422.50, + 2290.50 + ], + [ + 2394.00, + 2280.00 + ], + [ + 2394.00, + 2280.00 + ], + [ + 2394.00, + 2280.00 + ], + [ + 2355.00, + 2269.50 + ], + [ + 2353.50, + 2269.50 + ], + [ + 2352.00, + 2269.50 + ], + [ + 2323.50, + 2256.00 + ], + [ + 2323.50, + 2256.00 + ], + [ + 2323.50, + 2256.00 + ], + [ + 2298.00, + 2245.50 + ], + [ + 2298.00, + 2244.00 + ], + [ + 2298.00, + 2242.50 + ], + [ + 2271.00, + 2232.00 + ], + [ + 2271.00, + 2232.00 + ], + [ + 2271.00, + 2232.00 + ], + [ + 2236.50, + 2218.50 + ], + [ + 2236.50, + 2218.50 + ], + [ + 2236.50, + 2218.50 + ], + [ + 2208.00, + 2199.00 + ], + [ + 2208.00, + 2199.00 + ], + [ + 2208.00, + 2199.00 + ], + [ + 2179.50, + 2172.00 + ], + [ + 2179.50, + 2172.00 + ], + [ + 2179.50, + 2172.00 + ], + [ + 2158.50, + 2142.00 + ], + [ + 2158.50, + 2142.00 + ], + [ + 2158.50, + 2142.00 + ], + [ + 2142.00, + 2112.00 + ], + [ + 2142.00, + 2112.00 + ], + [ + 2142.00, + 2112.00 + ], + [ + 2131.50, + 2082.00 + ], + [ + 2131.50, + 2082.00 + ], + [ + 2131.50, + 2082.00 + ], + [ + 2116.50, + 2041.50 + ], + [ + 2116.50, + 2041.50 + ], + [ + 2116.50, + 2041.50 + ], + [ + 2106.00, + 2015.00 + ], + [ + 2106.00, + 2015.00 + ], + [ + 2106.00, + 2015.00 + ], + [ + 2096.00, + 1991.00 + ], + [ + 2096.00, + 1991.00 + ], + [ + 2096.00, + 1991.00 + ], + [ + 2088.00, + 1965.00 + ], + [ + 2088.00, + 1965.00 + ], + [ + 2088.00, + 1965.00 + ], + [ + 2082.00, + 1946.00 + ], + [ + 2082.00, + 1946.00 + ], + [ + 2082.00, + 1946.00 + ], + [ + 2075.00, + 1926.00 + ], + [ + 2075.00, + 1926.00 + ], + [ + 2075.00, + 1926.00 + ], + [ + 2071.00, + 1908.00 + ], + [ + 2071.00, + 1908.00 + ], + [ + 2071.00, + 1908.00 + ], + [ + 2066.00, + 1885.00 + ], + [ + 2066.00, + 1885.00 + ], + [ + 2066.00, + 1885.00 + ], + [ + 2060.00, + 1864.00 + ], + [ + 2060.00, + 1864.00 + ], + [ + 2060.00, + 1864.00 + ], + [ + 2054.00, + 1842.00 + ], + [ + 2054.00, + 1842.00 + ], + [ + 2054.00, + 1842.00 + ], + [ + 2053.00, + 1822.00 + ], + [ + 2053.00, + 1822.00 + ], + [ + 2053.00, + 1822.00 + ], + [ + 2055.00, + 1803.00 + ], + [ + 2055.00, + 1803.00 + ], + [ + 2055.00, + 1803.00 + ], + [ + 2055.00, + 1782.00 + ], + [ + 2055.00, + 1782.00 + ], + [ + 2055.00, + 1782.00 + ], + [ + 2049.00, + 1753.00 + ], + [ + 2049.00, + 1753.00 + ], + [ + 2049.00, + 1753.00 + ], + [ + 2044.00, + 1734.00 + ], + [ + 2044.00, + 1734.00 + ], + [ + 2044.00, + 1734.00 + ], + [ + 2034.00, + 1712.00 + ], + [ + 2034.00, + 1712.00 + ], + [ + 2034.00, + 1712.00 + ], + [ + 2025.00, + 1693.00 + ], + [ + 2025.00, + 1693.00 + ], + [ + 2025.00, + 1693.00 + ], + [ + 2013.00, + 1677.00 + ], + [ + 2013.00, + 1676.00 + ], + [ + 2013.00, + 1675.00 + ], + [ + 2002.00, + 1655.00 + ], + [ + 2002.00, + 1655.00 + ], + [ + 2002.00, + 1655.00 + ], + [ + 1987.00, + 1636.00 + ], + [ + 1987.00, + 1636.00 + ], + [ + 1987.00, + 1636.00 + ], + [ + 1971.00, + 1621.00 + ], + [ + 1971.00, + 1621.00 + ], + [ + 1971.00, + 1621.00 + ], + [ + 1963.00, + 1594.00 + ], + [ + 1963.00, + 1594.00 + ], + [ + 1963.00, + 1594.00 + ], + [ + 1957.00, + 1572.00 + ], + [ + 1957.00, + 1572.00 + ], + [ + 1957.00, + 1572.00 + ], + [ + 1945.00, + 1555.00 + ], + [ + 1945.00, + 1555.00 + ], + [ + 1945.00, + 1555.00 + ], + [ + 1937.00, + 1538.00 + ], + [ + 1937.00, + 1538.00 + ], + [ + 1937.00, + 1538.00 + ], + [ + 1924.00, + 1518.00 + ], + [ + 1924.00, + 1518.00 + ], + [ + 1924.00, + 1518.00 + ], + [ + 1910.00, + 1502.00 + ], + [ + 1910.00, + 1501.00 + ], + [ + 1910.00, + 1500.00 + ], + [ + 1896.00, + 1488.00 + ], + [ + 1896.00, + 1488.00 + ], + [ + 1896.00, + 1488.00 + ], + [ + 1878.00, + 1474.00 + ], + [ + 1878.00, + 1474.00 + ], + [ + 1878.00, + 1474.00 + ], + [ + 1854.00, + 1458.00 + ], + [ + 1854.00, + 1458.00 + ], + [ + 1854.00, + 1458.00 + ], + [ + 1834.00, + 1443.00 + ], + [ + 1834.00, + 1443.00 + ], + [ + 1834.00, + 1443.00 + ], + [ + 1818.00, + 1431.00 + ], + [ + 1818.00, + 1430.00 + ], + [ + 1818.00, + 1429.00 + ], + [ + 1795.00, + 1418.00 + ], + [ + 1795.00, + 1418.00 + ], + [ + 1795.00, + 1418.00 + ], + [ + 1776.00, + 1410.00 + ], + [ + 1776.00, + 1410.00 + ], + [ + 1776.00, + 1410.00 + ], + [ + 1750.00, + 1393.00 + ], + [ + 1750.00, + 1393.00 + ], + [ + 1750.00, + 1393.00 + ], + [ + 1727.00, + 1385.00 + ], + [ + 1727.00, + 1385.00 + ], + [ + 1727.00, + 1385.00 + ], + [ + 1703.00, + 1383.00 + ], + [ + 1702.00, + 1383.00 + ], + [ + 1701.00, + 1383.00 + ], + [ + 1682.00, + 1382.00 + ], + [ + 1681.00, + 1382.00 + ], + [ + 1680.00, + 1382.00 + ], + [ + 1659.00, + 1379.00 + ], + [ + 1659.00, + 1379.00 + ], + [ + 1659.00, + 1379.00 + ], + [ + 1629.00, + 1378.00 + ], + [ + 1629.00, + 1378.00 + ], + [ + 1629.00, + 1378.00 + ], + [ + 1605.00, + 1379.00 + ], + [ + 1605.00, + 1378.00 + ], + [ + 1605.00, + 1377.00 + ], + [ + 1584.00, + 1369.00 + ], + [ + 1584.00, + 1369.00 + ], + [ + 1584.00, + 1369.00 + ], + [ + 1561.00, + 1356.00 + ], + [ + 1561.00, + 1356.00 + ], + [ + 1561.00, + 1356.00 + ], + [ + 1546.00, + 1331.00 + ], + [ + 1545.00, + 1331.00 + ], + [ + 1544.00, + 1331.00 + ], + [ + 1526.00, + 1314.00 + ], + [ + 1526.00, + 1314.00 + ], + [ + 1526.00, + 1314.00 + ], + [ + 1515.00, + 1295.00 + ], + [ + 1515.00, + 1295.00 + ], + [ + 1515.00, + 1295.00 + ], + [ + 1501.00, + 1268.00 + ], + [ + 1501.00, + 1268.00 + ], + [ + 1501.00, + 1268.00 + ], + [ + 1488.00, + 1253.00 + ], + [ + 1488.00, + 1253.00 + ], + [ + 1488.00, + 1253.00 + ], + [ + 1466.00, + 1244.00 + ], + [ + 1466.00, + 1244.00 + ], + [ + 1466.00, + 1244.00 + ], + [ + 1449.00, + 1230.00 + ], + [ + 1449.00, + 1230.00 + ], + [ + 1449.00, + 1230.00 + ], + [ + 1437.00, + 1219.00 + ], + [ + 1437.00, + 1219.00 + ], + [ + 1437.00, + 1219.00 + ], + [ + 1426.00, + 1197.00 + ], + [ + 1426.00, + 1197.00 + ], + [ + 1426.00, + 1197.00 + ], + [ + 1419.00, + 1184.00 + ], + [ + 1419.00, + 1184.00 + ], + [ + 1419.00, + 1184.00 + ], + [ + 1436.00, + 1176.00 + ], + [ + 1436.00, + 1176.00 + ], + [ + 1436.00, + 1176.00 + ], + [ + 1452.00, + 1178.00 + ], + [ + 1452.00, + 1178.00 + ], + [ + 1452.00, + 1178.00 + ], + [ + 1469.00, + 1178.00 + ], + [ + 1469.00, + 1178.00 + ], + [ + 1469.00, + 1178.00 + ], + [ + 1482.00, + 1166.00 + ], + [ + 1482.00, + 1166.00 + ], + [ + 1482.00, + 1166.00 + ], + [ + 1494.00, + 1176.00 + ], + [ + 1494.00, + 1176.00 + ], + [ + 1494.00, + 1176.00 + ], + [ + 1516.00, + 1171.00 + ], + [ + 1516.00, + 1171.00 + ], + [ + 1516.00, + 1171.00 + ], + [ + 1535.00, + 1161.00 + ], + [ + 1535.00, + 1161.00 + ], + [ + 1535.00, + 1161.00 + ], + [ + 1564.00, + 1155.00 + ], + [ + 1564.00, + 1154.00 + ], + [ + 1564.00, + 1153.00 + ], + [ + 1589.00, + 1144.00 + ], + [ + 1589.00, + 1144.00 + ], + [ + 1589.00, + 1144.00 + ], + [ + 1608.00, + 1136.00 + ], + [ + 1608.00, + 1136.00 + ], + [ + 1608.00, + 1136.00 + ], + [ + 1629.00, + 1132.00 + ], + [ + 1629.00, + 1131.00 + ], + [ + 1629.00, + 1130.00 + ], + [ + 1653.00, + 1125.00 + ], + [ + 1653.00, + 1125.00 + ], + [ + 1653.00, + 1125.00 + ], + [ + 1682.00, + 1129.00 + ], + [ + 1682.00, + 1129.00 + ], + [ + 1682.00, + 1129.00 + ], + [ + 1705.00, + 1128.00 + ], + [ + 1706.00, + 1128.00 + ], + [ + 1707.00, + 1128.00 + ], + [ + 1727.00, + 1131.00 + ], + [ + 1727.00, + 1131.00 + ], + [ + 1727.00, + 1131.00 + ], + [ + 1751.00, + 1138.00 + ], + [ + 1751.00, + 1138.00 + ], + [ + 1751.00, + 1138.00 + ], + [ + 1758.00, + 1151.00 + ], + [ + 1758.00, + 1151.00 + ], + [ + 1758.00, + 1151.00 + ], + [ + 1761.00, + 1164.00 + ], + [ + 1761.00, + 1164.00 + ], + [ + 1761.00, + 1164.00 + ], + [ + 1772.00, + 1175.00 + ], + [ + 1772.00, + 1175.00 + ], + [ + 1772.00, + 1175.00 + ], + [ + 1784.00, + 1171.00 + ], + [ + 1784.00, + 1171.00 + ], + [ + 1784.00, + 1171.00 + ], + [ + 1793.00, + 1162.00 + ], + [ + 1793.00, + 1162.00 + ], + [ + 1793.00, + 1162.00 + ], + [ + 1811.00, + 1169.00 + ], + [ + 1811.00, + 1169.00 + ], + [ + 1811.00, + 1169.00 + ], + [ + 1833.00, + 1160.00 + ], + [ + 1833.00, + 1160.00 + ], + [ + 1833.00, + 1160.00 + ], + [ + 1851.00, + 1159.00 + ], + [ + 1851.00, + 1159.00 + ], + [ + 1851.00, + 1159.00 + ], + [ + 1868.00, + 1161.00 + ], + [ + 1869.00, + 1161.00 + ], + [ + 1870.00, + 1161.00 + ], + [ + 1893.00, + 1168.00 + ], + [ + 1893.00, + 1168.00 + ], + [ + 1893.00, + 1168.00 + ], + [ + 1913.00, + 1173.00 + ], + [ + 1913.00, + 1173.00 + ], + [ + 1913.00, + 1173.00 + ], + [ + 1930.00, + 1174.00 + ], + [ + 1930.00, + 1174.00 + ], + [ + 1930.00, + 1174.00 + ], + [ + 1945.00, + 1174.00 + ], + [ + 1946.00, + 1174.00 + ], + [ + 1947.00, + 1174.00 + ], + [ + 1958.00, + 1175.00 + ], + [ + 1959.00, + 1175.00 + ], + [ + 1960.00, + 1175.00 + ], + [ + 1978.00, + 1175.00 + ], + [ + 1978.00, + 1175.00 + ], + [ + 1978.00, + 1175.00 + ], + [ + 1994.00, + 1174.00 + ], + [ + 1994.00, + 1174.00 + ], + [ + 1994.00, + 1174.00 + ], + [ + 2014.00, + 1171.00 + ], + [ + 2014.00, + 1171.00 + ], + [ + 2014.00, + 1171.00 + ], + [ + 2038.00, + 1165.00 + ], + [ + 2038.00, + 1165.00 + ], + [ + 2038.00, + 1165.00 + ], + [ + 2059.00, + 1162.00 + ], + [ + 2059.00, + 1162.00 + ], + [ + 2059.00, + 1162.00 + ], + [ + 2071.00, + 1157.00 + ], + [ + 2071.00, + 1157.00 + ], + [ + 2071.00, + 1157.00 + ], + [ + 2096.00, + 1147.00 + ], + [ + 2096.00, + 1147.00 + ], + [ + 2096.00, + 1147.00 + ], + [ + 2115.00, + 1140.00 + ], + [ + 2115.00, + 1140.00 + ], + [ + 2115.00, + 1140.00 + ], + [ + 2134.00, + 1135.00 + ], + [ + 2135.00, + 1135.00 + ], + [ + 2136.00, + 1135.00 + ], + [ + 2156.00, + 1131.00 + ], + [ + 2156.00, + 1131.00 + ], + [ + 2156.00, + 1131.00 + ], + [ + 2174.00, + 1132.00 + ], + [ + 2174.00, + 1132.00 + ], + [ + 2174.00, + 1132.00 + ], + [ + 2193.00, + 1127.00 + ], + [ + 2193.00, + 1127.00 + ], + [ + 2193.00, + 1127.00 + ], + [ + 2213.00, + 1123.00 + ], + [ + 2213.00, + 1123.00 + ], + [ + 2213.00, + 1123.00 + ], + [ + 2230.00, + 1122.00 + ], + [ + 2230.00, + 1122.00 + ], + [ + 2230.00, + 1122.00 + ], + [ + 2252.00, + 1125.00 + ], + [ + 2252.00, + 1125.00 + ], + [ + 2252.00, + 1125.00 + ], + [ + 2276.00, + 1128.00 + ], + [ + 2276.00, + 1128.00 + ], + [ + 2276.00, + 1128.00 + ], + [ + 2302.00, + 1132.00 + ], + [ + 2302.00, + 1132.00 + ], + [ + 2302.00, + 1132.00 + ], + [ + 2330.00, + 1134.00 + ], + [ + 2330.00, + 1134.00 + ], + [ + 2330.00, + 1134.00 + ], + [ + 2352.00, + 1135.00 + ], + [ + 2352.00, + 1135.00 + ], + [ + 2352.00, + 1135.00 + ], + [ + 2368.00, + 1142.00 + ], + [ + 2368.00, + 1142.00 + ], + [ + 2368.00, + 1142.00 + ], + [ + 2388.00, + 1144.00 + ], + [ + 2388.00, + 1144.00 + ], + [ + 2388.00, + 1144.00 + ], + [ + 2413.00, + 1146.00 + ], + [ + 2413.00, + 1146.00 + ], + [ + 2413.00, + 1146.00 + ], + [ + 2431.00, + 1148.00 + ], + [ + 2431.00, + 1148.00 + ], + [ + 2431.00, + 1148.00 + ], + [ + 2450.00, + 1151.00 + ], + [ + 2450.00, + 1151.00 + ], + [ + 2450.00, + 1151.00 + ], + [ + 2469.00, + 1152.00 + ], + [ + 2469.00, + 1151.00 + ], + [ + 2469.00, + 1150.00 + ], + [ + 2484.00, + 1150.00 + ], + [ + 2484.00, + 1150.00 + ], + [ + 2484.00, + 1150.00 + ], + [ + 2499.00, + 1143.00 + ], + [ + 2499.00, + 1143.00 + ], + [ + 2499.00, + 1143.00 + ], + [ + 2514.00, + 1131.00 + ], + [ + 2514.00, + 1131.00 + ], + [ + 2514.00, + 1133.00 + ], + [ + 2501.00, + 1163.00 + ], + [ + 2500.00, + 1164.00 + ], + [ + 2505.00, + 1179.00 + ], + [ + 2505.00, + 1179.00 + ], + [ + 2505.00, + 1179.00 + ], + [ + 2510.00, + 1190.00 + ], + [ + 2510.00, + 1190.00 + ], + [ + 2510.00, + 1190.00 + ], + [ + 2515.00, + 1203.00 + ], + [ + 2516.00, + 1207.00 + ], + [ + 2517.00, + 1211.00 + ], + [ + 2509.00, + 1232.00 + ], + [ + 2509.00, + 1232.00 + ], + [ + 2509.00, + 1232.00 + ], + [ + 2509.00, + 1234.00 + ], + [ + 2507.00, + 1238.00 + ], + [ + 2505.00, + 1242.00 + ], + [ + 2494.00, + 1272.00 + ], + [ + 2492.00, + 1274.00 + ], + [ + 2490.00, + 1276.00 + ], + [ + 2493.00, + 1282.00 + ], + [ + 2491.00, + 1288.00 + ], + [ + 2471.00, + 1332.00 + ], + [ + 2473.00, + 1333.00 + ], + [ + 2470.00, + 1341.00 + ], + [ + 2467.00, + 1349.00 + ], + [ + 2466.00, + 1349.00 + ], + [ + 2463.00, + 1356.00 + ], + [ + 2457.00, + 1368.00 + ], + [ + 2448.00, + 1377.00 + ], + [ + 2448.00, + 1377.00 + ], + [ + 2448.00, + 1377.00 + ], + [ + 2462.00, + 1388.00 + ], + [ + 2462.00, + 1388.00 + ], + [ + 2462.00, + 1388.00 + ], + [ + 2485.00, + 1394.00 + ], + [ + 2485.00, + 1394.00 + ], + [ + 2485.00, + 1394.00 + ], + [ + 2499.00, + 1399.00 + ], + [ + 2501.00, + 1399.00 + ], + [ + 2503.00, + 1399.00 + ], + [ + 2517.00, + 1403.00 + ], + [ + 2516.00, + 1404.00 + ], + [ + 2515.00, + 1405.00 + ], + [ + 2498.00, + 1405.00 + ], + [ + 2498.00, + 1405.00 + ], + [ + 2498.00, + 1405.00 + ], + [ + 2484.00, + 1405.00 + ], + [ + 2476.00, + 1403.00 + ], + [ + 2468.00, + 1401.00 + ], + [ + 2465.00, + 1401.00 + ], + [ + 2460.00, + 1402.00 + ], + [ + 2455.00, + 1403.00 + ], + [ + 2441.00, + 1405.00 + ], + [ + 2440.00, + 1407.00 + ], + [ + 2439.00, + 1409.00 + ], + [ + 2436.00, + 1416.00 + ], + [ + 2434.00, + 1420.00 + ], + [ + 2432.00, + 1424.00 + ], + [ + 2427.00, + 1438.00 + ], + [ + 2426.00, + 1439.00 + ], + [ + 2425.00, + 1440.00 + ], + [ + 2421.00, + 1450.00 + ], + [ + 2419.00, + 1454.00 + ], + [ + 2417.00, + 1458.00 + ], + [ + 2411.00, + 1469.00 + ], + [ + 2410.00, + 1472.00 + ], + [ + 2409.00, + 1475.00 + ], + [ + 2405.00, + 1481.00 + ], + [ + 2403.00, + 1489.00 + ], + [ + 2401.00, + 1497.00 + ], + [ + 2400.00, + 1506.00 + ], + [ + 2399.00, + 1508.00 + ], + [ + 2398.00, + 1510.00 + ], + [ + 2394.00, + 1524.00 + ], + [ + 2394.00, + 1527.00 + ], + [ + 2394.00, + 1530.00 + ], + [ + 2401.00, + 1534.00 + ], + [ + 2404.00, + 1536.00 + ], + [ + 2407.00, + 1538.00 + ], + [ + 2426.00, + 1541.00 + ], + [ + 2427.00, + 1541.00 + ], + [ + 2428.00, + 1541.00 + ], + [ + 2439.00, + 1539.00 + ], + [ + 2439.00, + 1539.00 + ], + [ + 2439.00, + 1539.00 + ], + [ + 2457.00, + 1538.00 + ], + [ + 2457.00, + 1538.00 + ], + [ + 2457.00, + 1538.00 + ], + [ + 2469.00, + 1534.00 + ], + [ + 2473.00, + 1534.00 + ], + [ + 2477.00, + 1534.00 + ], + [ + 2503.00, + 1536.00 + ], + [ + 2503.00, + 1536.00 + ], + [ + 2503.00, + 1536.00 + ], + [ + 2512.00, + 1535.00 + ], + [ + 2513.00, + 1535.00 + ], + [ + 2514.00, + 1535.00 + ], + [ + 2526.00, + 1538.00 + ], + [ + 2526.00, + 1538.00 + ], + [ + 2526.00, + 1538.00 + ] + ] + }, + { + "name": "Gandalf the White", + "id": "gandalf_white", + "color": "gold", + "distance": "950 miles / 1530 km", + "startDate": "March 1", + "endDate": "March 25, T.A. 3019", + "path": [ + [ + 2532.00, + 1548.00 + ], + [ + 2551.00, + 1558.00 + ], + [ + 2551.00, + 1558.00 + ], + [ + 2551.00, + 1558.00 + ], + [ + 2568.00, + 1573.00 + ], + [ + 2568.00, + 1573.00 + ], + [ + 2568.00, + 1573.00 + ], + [ + 2585.00, + 1588.00 + ], + [ + 2585.00, + 1588.00 + ], + [ + 2585.00, + 1588.00 + ], + [ + 2604.00, + 1602.00 + ], + [ + 2604.00, + 1602.00 + ], + [ + 2604.00, + 1602.00 + ], + [ + 2630.00, + 1617.00 + ], + [ + 2630.00, + 1617.00 + ], + [ + 2630.00, + 1617.00 + ], + [ + 2662.00, + 1637.00 + ], + [ + 2662.00, + 1637.00 + ], + [ + 2662.00, + 1637.00 + ], + [ + 2679.00, + 1650.00 + ], + [ + 2679.00, + 1650.00 + ], + [ + 2679.00, + 1650.00 + ], + [ + 2701.00, + 1662.00 + ], + [ + 2701.00, + 1662.00 + ], + [ + 2701.00, + 1662.00 + ], + [ + 2721.00, + 1679.00 + ], + [ + 2721.00, + 1679.00 + ], + [ + 2721.00, + 1679.00 + ], + [ + 2737.00, + 1694.00 + ], + [ + 2737.00, + 1694.00 + ], + [ + 2737.00, + 1694.00 + ], + [ + 2755.00, + 1706.00 + ], + [ + 2755.00, + 1706.00 + ], + [ + 2755.00, + 1706.00 + ], + [ + 2741.00, + 1720.00 + ], + [ + 2741.00, + 1720.00 + ], + [ + 2741.00, + 1720.00 + ], + [ + 2727.00, + 1729.00 + ], + [ + 2727.00, + 1729.00 + ], + [ + 2727.00, + 1729.00 + ], + [ + 2718.00, + 1736.00 + ], + [ + 2718.00, + 1736.00 + ], + [ + 2718.00, + 1736.00 + ], + [ + 2704.00, + 1750.00 + ], + [ + 2704.00, + 1750.00 + ], + [ + 2704.00, + 1750.00 + ], + [ + 2688.00, + 1761.00 + ], + [ + 2688.00, + 1761.00 + ], + [ + 2688.00, + 1761.00 + ], + [ + 2679.00, + 1771.00 + ], + [ + 2679.00, + 1771.00 + ], + [ + 2679.00, + 1771.00 + ], + [ + 2663.00, + 1784.00 + ], + [ + 2663.00, + 1784.00 + ], + [ + 2663.00, + 1784.00 + ], + [ + 2647.00, + 1800.00 + ], + [ + 2647.00, + 1800.00 + ], + [ + 2647.00, + 1800.00 + ], + [ + 2615.00, + 1825.00 + ], + [ + 2615.00, + 1825.00 + ], + [ + 2615.00, + 1825.00 + ], + [ + 2599.00, + 1835.00 + ], + [ + 2599.00, + 1835.00 + ], + [ + 2599.00, + 1835.00 + ], + [ + 2577.00, + 1853.00 + ], + [ + 2577.00, + 1853.00 + ], + [ + 2577.00, + 1853.00 + ], + [ + 2562.00, + 1865.00 + ], + [ + 2562.00, + 1865.00 + ], + [ + 2562.00, + 1865.00 + ], + [ + 2535.00, + 1886.00 + ], + [ + 2535.00, + 1886.00 + ], + [ + 2535.00, + 1886.00 + ], + [ + 2511.00, + 1907.00 + ], + [ + 2511.00, + 1907.00 + ], + [ + 2511.00, + 1907.00 + ], + [ + 2486.00, + 1926.00 + ], + [ + 2486.00, + 1926.00 + ], + [ + 2486.00, + 1926.00 + ], + [ + 2470.00, + 1936.00 + ], + [ + 2470.00, + 1936.00 + ], + [ + 2470.00, + 1936.00 + ], + [ + 2448.00, + 1948.00 + ], + [ + 2448.00, + 1948.00 + ], + [ + 2448.00, + 1948.00 + ], + [ + 2432.00, + 1956.00 + ], + [ + 2432.00, + 1956.00 + ], + [ + 2432.00, + 1956.00 + ], + [ + 2426.00, + 1976.00 + ], + [ + 2426.00, + 1976.00 + ], + [ + 2426.00, + 1976.00 + ], + [ + 2419.00, + 1993.00 + ], + [ + 2419.00, + 1993.00 + ], + [ + 2419.00, + 1993.00 + ], + [ + 2420.00, + 2009.00 + ], + [ + 2420.00, + 2009.00 + ], + [ + 2420.00, + 2009.00 + ], + [ + 2427.00, + 2027.00 + ], + [ + 2427.00, + 2027.00 + ], + [ + 2427.00, + 2027.00 + ], + [ + 2438.00, + 2042.00 + ], + [ + 2438.00, + 2042.00 + ], + [ + 2438.00, + 2042.00 + ], + [ + 2455.00, + 2049.00 + ], + [ + 2455.00, + 2049.00 + ], + [ + 2455.00, + 2049.00 + ], + [ + 2472.00, + 2052.00 + ], + [ + 2472.00, + 2052.00 + ], + [ + 2472.00, + 2052.00 + ], + [ + 2491.00, + 2057.00 + ], + [ + 2491.00, + 2057.00 + ], + [ + 2491.00, + 2057.00 + ], + [ + 2508.00, + 2062.00 + ], + [ + 2508.00, + 2062.00 + ], + [ + 2508.00, + 2062.00 + ], + [ + 2539.00, + 2072.00 + ], + [ + 2539.00, + 2072.00 + ], + [ + 2539.00, + 2072.00 + ], + [ + 2552.00, + 2076.00 + ], + [ + 2552.00, + 2076.00 + ], + [ + 2552.00, + 2076.00 + ], + [ + 2572.00, + 2082.00 + ], + [ + 2572.00, + 2082.00 + ], + [ + 2572.00, + 2082.00 + ], + [ + 2590.00, + 2087.00 + ], + [ + 2590.00, + 2087.00 + ], + [ + 2590.00, + 2087.00 + ], + [ + 2610.00, + 2095.00 + ], + [ + 2610.00, + 2095.00 + ], + [ + 2610.00, + 2095.00 + ], + [ + 2627.00, + 2099.00 + ], + [ + 2627.00, + 2099.00 + ], + [ + 2627.00, + 2099.00 + ], + [ + 2618.00, + 2118.00 + ], + [ + 2618.00, + 2118.00 + ], + [ + 2618.00, + 2118.00 + ], + [ + 2610.00, + 2134.00 + ], + [ + 2610.00, + 2134.00 + ], + [ + 2610.00, + 2134.00 + ], + [ + 2607.00, + 2150.00 + ], + [ + 2607.00, + 2150.00 + ], + [ + 2607.00, + 2150.00 + ], + [ + 2598.00, + 2166.00 + ], + [ + 2598.00, + 2166.00 + ], + [ + 2598.00, + 2166.00 + ], + [ + 2597.00, + 2184.00 + ], + [ + 2597.00, + 2184.00 + ], + [ + 2597.00, + 2184.00 + ], + [ + 2597.00, + 2200.00 + ], + [ + 2597.00, + 2200.00 + ], + [ + 2597.00, + 2200.00 + ], + [ + 2602.00, + 2221.00 + ], + [ + 2602.00, + 2221.00 + ], + [ + 2602.00, + 2221.00 + ], + [ + 2600.00, + 2239.00 + ], + [ + 2600.00, + 2239.00 + ], + [ + 2600.00, + 2239.00 + ], + [ + 2601.00, + 2260.00 + ], + [ + 2601.00, + 2260.00 + ], + [ + 2601.00, + 2260.00 + ], + [ + 2599.00, + 2278.00 + ], + [ + 2599.00, + 2278.00 + ], + [ + 2599.00, + 2278.00 + ], + [ + 2595.00, + 2298.00 + ], + [ + 2595.00, + 2298.00 + ], + [ + 2595.00, + 2298.00 + ], + [ + 2593.00, + 2317.00 + ], + [ + 2593.00, + 2317.00 + ], + [ + 2593.00, + 2317.00 + ], + [ + 2589.00, + 2346.00 + ], + [ + 2589.00, + 2346.00 + ], + [ + 2589.00, + 2346.00 + ], + [ + 2590.00, + 2366.00 + ], + [ + 2590.00, + 2366.00 + ], + [ + 2590.00, + 2366.00 + ], + [ + 2590.00, + 2379.00 + ], + [ + 2590.00, + 2379.00 + ], + [ + 2590.00, + 2379.00 + ], + [ + 2591.00, + 2388.00 + ], + [ + 2591.00, + 2388.00 + ], + [ + 2591.00, + 2388.00 + ], + [ + 2575.00, + 2367.00 + ], + [ + 2575.00, + 2367.00 + ], + [ + 2575.00, + 2367.00 + ], + [ + 2562.00, + 2352.00 + ], + [ + 2562.00, + 2352.00 + ], + [ + 2562.00, + 2352.00 + ], + [ + 2552.00, + 2346.00 + ], + [ + 2552.00, + 2346.00 + ], + [ + 2552.00, + 2346.00 + ], + [ + 2543.00, + 2339.00 + ], + [ + 2543.00, + 2339.00 + ], + [ + 2543.00, + 2339.00 + ], + [ + 2531.00, + 2331.00 + ], + [ + 2531.00, + 2331.00 + ], + [ + 2531.00, + 2331.00 + ], + [ + 2518.00, + 2321.00 + ], + [ + 2518.00, + 2321.00 + ], + [ + 2518.00, + 2321.00 + ], + [ + 2504.00, + 2310.00 + ], + [ + 2504.00, + 2310.00 + ], + [ + 2504.00, + 2310.00 + ], + [ + 2484.00, + 2300.00 + ], + [ + 2484.00, + 2300.00 + ], + [ + 2484.00, + 2300.00 + ], + [ + 2471.00, + 2293.00 + ], + [ + 2471.00, + 2293.00 + ], + [ + 2471.00, + 2293.00 + ], + [ + 2458.00, + 2289.00 + ], + [ + 2458.00, + 2289.00 + ], + [ + 2458.00, + 2289.00 + ], + [ + 2439.00, + 2284.00 + ], + [ + 2439.00, + 2284.00 + ], + [ + 2439.00, + 2284.00 + ], + [ + 2425.00, + 2272.00 + ], + [ + 2425.00, + 2272.00 + ], + [ + 2425.00, + 2272.00 + ], + [ + 2415.00, + 2264.00 + ], + [ + 2415.00, + 2264.00 + ], + [ + 2415.00, + 2264.00 + ], + [ + 2391.00, + 2262.00 + ], + [ + 2391.00, + 2262.00 + ], + [ + 2391.00, + 2262.00 + ], + [ + 2360.00, + 2255.00 + ], + [ + 2360.00, + 2255.00 + ], + [ + 2360.00, + 2255.00 + ], + [ + 2336.00, + 2253.00 + ], + [ + 2336.00, + 2253.00 + ], + [ + 2336.00, + 2253.00 + ], + [ + 2344.00, + 2231.00 + ], + [ + 2344.00, + 2231.00 + ], + [ + 2344.00, + 2231.00 + ], + [ + 2339.00, + 2213.00 + ], + [ + 2339.00, + 2213.00 + ], + [ + 2339.00, + 2213.00 + ], + [ + 2344.00, + 2196.00 + ], + [ + 2344.00, + 2196.00 + ], + [ + 2344.00, + 2196.00 + ], + [ + 2344.00, + 2185.00 + ], + [ + 2344.00, + 2185.00 + ], + [ + 2344.00, + 2185.00 + ], + [ + 2350.00, + 2163.00 + ], + [ + 2350.00, + 2163.00 + ], + [ + 2350.00, + 2163.00 + ], + [ + 2344.00, + 2135.00 + ], + [ + 2344.00, + 2135.00 + ], + [ + 2344.00, + 2135.00 + ], + [ + 2339.00, + 2118.00 + ], + [ + 2339.00, + 2118.00 + ], + [ + 2339.00, + 2118.00 + ], + [ + 2334.00, + 2135.00 + ], + [ + 2334.00, + 2135.00 + ], + [ + 2334.00, + 2135.00 + ], + [ + 2327.00, + 2151.00 + ], + [ + 2327.00, + 2151.00 + ], + [ + 2327.00, + 2151.00 + ], + [ + 2324.00, + 2164.00 + ], + [ + 2324.00, + 2164.00 + ], + [ + 2324.00, + 2164.00 + ], + [ + 2322.00, + 2176.00 + ], + [ + 2322.00, + 2176.00 + ], + [ + 2322.00, + 2176.00 + ], + [ + 2322.00, + 2191.00 + ], + [ + 2322.00, + 2191.00 + ], + [ + 2322.00, + 2191.00 + ], + [ + 2322.00, + 2209.00 + ], + [ + 2322.00, + 2209.00 + ], + [ + 2322.00, + 2209.00 + ], + [ + 2327.00, + 2232.00 + ], + [ + 2327.00, + 2232.00 + ], + [ + 2351.00, + 2267.00 + ], + [ + 2351.00, + 2267.00 + ], + [ + 2368.00, + 2275.00 + ], + [ + 2368.00, + 2275.00 + ], + [ + 2368.00, + 2275.00 + ], + [ + 2383.00, + 2282.00 + ], + [ + 2383.00, + 2282.00 + ], + [ + 2383.00, + 2282.00 + ], + [ + 2395.00, + 2285.00 + ], + [ + 2395.00, + 2285.00 + ], + [ + 2395.00, + 2285.00 + ], + [ + 2409.00, + 2289.00 + ], + [ + 2409.00, + 2289.00 + ], + [ + 2409.00, + 2289.00 + ], + [ + 2428.00, + 2296.00 + ], + [ + 2428.00, + 2296.00 + ], + [ + 2428.00, + 2296.00 + ], + [ + 2449.00, + 2307.00 + ], + [ + 2449.00, + 2307.00 + ], + [ + 2449.00, + 2307.00 + ], + [ + 2462.00, + 2312.00 + ], + [ + 2462.00, + 2312.00 + ], + [ + 2462.00, + 2312.00 + ], + [ + 2485.00, + 2322.00 + ], + [ + 2485.00, + 2322.00 + ], + [ + 2485.00, + 2322.00 + ], + [ + 2502.00, + 2331.00 + ], + [ + 2502.00, + 2331.00 + ], + [ + 2502.00, + 2331.00 + ], + [ + 2515.00, + 2336.00 + ], + [ + 2515.00, + 2336.00 + ], + [ + 2515.00, + 2336.00 + ], + [ + 2539.00, + 2352.00 + ], + [ + 2539.00, + 2352.00 + ], + [ + 2539.00, + 2352.00 + ], + [ + 2556.00, + 2363.00 + ], + [ + 2556.00, + 2363.00 + ], + [ + 2556.00, + 2363.00 + ], + [ + 2574.00, + 2382.00 + ], + [ + 2574.00, + 2382.00 + ], + [ + 2574.00, + 2382.00 + ], + [ + 2581.00, + 2394.00 + ], + [ + 2581.00, + 2394.00 + ], + [ + 2581.00, + 2394.00 + ], + [ + 2603.00, + 2408.00 + ], + [ + 2603.00, + 2408.00 + ], + [ + 2603.00, + 2408.00 + ], + [ + 2622.00, + 2417.00 + ], + [ + 2622.00, + 2417.00 + ], + [ + 2622.00, + 2417.00 + ], + [ + 2632.00, + 2434.00 + ], + [ + 2632.00, + 2434.00 + ], + [ + 2632.00, + 2434.00 + ], + [ + 2642.00, + 2445.00 + ], + [ + 2642.00, + 2445.00 + ], + [ + 2642.00, + 2445.00 + ], + [ + 2653.00, + 2456.00 + ], + [ + 2653.00, + 2456.00 + ], + [ + 2653.00, + 2456.00 + ], + [ + 2665.00, + 2466.00 + ], + [ + 2665.00, + 2466.00 + ], + [ + 2665.00, + 2466.00 + ], + [ + 2679.00, + 2478.00 + ], + [ + 2679.00, + 2478.00 + ], + [ + 2679.00, + 2478.00 + ], + [ + 2696.00, + 2491.00 + ], + [ + 2696.00, + 2491.00 + ], + [ + 2696.00, + 2491.00 + ], + [ + 2717.00, + 2503.00 + ], + [ + 2717.00, + 2503.00 + ], + [ + 2717.00, + 2503.00 + ], + [ + 2732.00, + 2509.00 + ], + [ + 2732.00, + 2509.00 + ], + [ + 2732.00, + 2509.00 + ], + [ + 2756.00, + 2518.00 + ], + [ + 2756.00, + 2518.00 + ], + [ + 2756.00, + 2518.00 + ], + [ + 2771.00, + 2523.00 + ], + [ + 2771.00, + 2523.00 + ], + [ + 2771.00, + 2523.00 + ], + [ + 2796.00, + 2534.00 + ], + [ + 2796.00, + 2534.00 + ], + [ + 2796.00, + 2534.00 + ], + [ + 2815.00, + 2541.00 + ], + [ + 2815.00, + 2541.00 + ], + [ + 2815.00, + 2541.00 + ], + [ + 2831.00, + 2548.00 + ], + [ + 2831.00, + 2548.00 + ], + [ + 2831.00, + 2548.00 + ], + [ + 2854.00, + 2555.00 + ], + [ + 2854.00, + 2555.00 + ], + [ + 2854.00, + 2555.00 + ], + [ + 2874.00, + 2560.00 + ], + [ + 2874.00, + 2560.00 + ], + [ + 2874.00, + 2560.00 + ], + [ + 2890.00, + 2561.00 + ], + [ + 2890.00, + 2561.00 + ], + [ + 2890.00, + 2561.00 + ], + [ + 2907.00, + 2567.00 + ], + [ + 2907.00, + 2567.00 + ], + [ + 2907.00, + 2567.00 + ], + [ + 2931.00, + 2575.00 + ], + [ + 2931.00, + 2575.00 + ], + [ + 2931.00, + 2575.00 + ], + [ + 2951.00, + 2583.00 + ], + [ + 2951.00, + 2583.00 + ], + [ + 2951.00, + 2583.00 + ], + [ + 2970.00, + 2591.00 + ], + [ + 2970.00, + 2591.00 + ], + [ + 2970.00, + 2591.00 + ], + [ + 3006.00, + 2600.00 + ], + [ + 3006.00, + 2600.00 + ], + [ + 3006.00, + 2600.00 + ], + [ + 3031.00, + 2603.00 + ], + [ + 3031.00, + 2603.00 + ], + [ + 3031.00, + 2603.00 + ], + [ + 3052.00, + 2607.00 + ], + [ + 3052.00, + 2607.00 + ], + [ + 3052.00, + 2607.00 + ], + [ + 3071.00, + 2611.00 + ], + [ + 3071.00, + 2611.00 + ], + [ + 3071.00, + 2611.00 + ], + [ + 3092.00, + 2616.00 + ], + [ + 3092.00, + 2616.00 + ], + [ + 3092.00, + 2616.00 + ], + [ + 3116.00, + 2621.00 + ], + [ + 3116.00, + 2621.00 + ], + [ + 3116.00, + 2621.00 + ], + [ + 3153.00, + 2626.00 + ], + [ + 3153.00, + 2626.00 + ], + [ + 3153.00, + 2626.00 + ], + [ + 3182.00, + 2630.00 + ], + [ + 3182.00, + 2630.00 + ], + [ + 3182.00, + 2630.00 + ], + [ + 3205.00, + 2630.00 + ], + [ + 3205.00, + 2630.00 + ], + [ + 3205.00, + 2630.00 + ], + [ + 3222.00, + 2635.00 + ], + [ + 3222.00, + 2635.00 + ], + [ + 3222.00, + 2635.00 + ], + [ + 3236.00, + 2643.00 + ], + [ + 3236.00, + 2643.00 + ], + [ + 3236.00, + 2643.00 + ], + [ + 3248.00, + 2655.00 + ], + [ + 3248.00, + 2655.00 + ], + [ + 3248.00, + 2655.00 + ], + [ + 3263.00, + 2675.00 + ], + [ + 3263.00, + 2675.00 + ], + [ + 3263.00, + 2675.00 + ], + [ + 3276.00, + 2695.00 + ], + [ + 3276.00, + 2695.00 + ], + [ + 3276.00, + 2695.00 + ], + [ + 3280.00, + 2706.00 + ], + [ + 3280.00, + 2706.00 + ], + [ + 3280.00, + 2706.00 + ], + [ + 3287.00, + 2709.00 + ], + [ + 3287.00, + 2709.00 + ], + [ + 3287.00, + 2709.00 + ], + [ + 3312.00, + 2704.00 + ], + [ + 3312.00, + 2704.00 + ], + [ + 3312.00, + 2704.00 + ], + [ + 3328.00, + 2704.00 + ], + [ + 3328.00, + 2704.00 + ], + [ + 3328.00, + 2704.00 + ], + [ + 3342.00, + 2703.00 + ], + [ + 3342.00, + 2703.00 + ], + [ + 3342.00, + 2703.00 + ], + [ + 3365.00, + 2704.00 + ], + [ + 3365.00, + 2704.00 + ], + [ + 3365.00, + 2704.00 + ], + [ + 3373.00, + 2702.00 + ], + [ + 3373.00, + 2702.00 + ], + [ + 3373.00, + 2702.00 + ], + [ + 3371.00, + 2684.00 + ], + [ + 3371.00, + 2684.00 + ], + [ + 3371.00, + 2684.00 + ], + [ + 3370.00, + 2667.00 + ], + [ + 3370.00, + 2667.00 + ], + [ + 3370.00, + 2667.00 + ], + [ + 3366.00, + 2651.00 + ], + [ + 3366.00, + 2651.00 + ], + [ + 3366.00, + 2651.00 + ], + [ + 3362.00, + 2635.00 + ], + [ + 3362.00, + 2635.00 + ], + [ + 3362.00, + 2635.00 + ], + [ + 3360.00, + 2618.00 + ], + [ + 3360.00, + 2618.00 + ], + [ + 3360.00, + 2618.00 + ], + [ + 3357.00, + 2602.00 + ], + [ + 3357.00, + 2602.00 + ], + [ + 3357.00, + 2602.00 + ], + [ + 3356.00, + 2585.00 + ], + [ + 3356.00, + 2585.00 + ], + [ + 3356.00, + 2585.00 + ], + [ + 3353.00, + 2569.00 + ], + [ + 3353.00, + 2569.00 + ], + [ + 3353.00, + 2569.00 + ], + [ + 3351.00, + 2558.00 + ], + [ + 3351.00, + 2558.00 + ], + [ + 3351.00, + 2558.00 + ], + [ + 3342.00, + 2540.00 + ], + [ + 3342.00, + 2540.00 + ], + [ + 3342.00, + 2540.00 + ], + [ + 3338.00, + 2525.00 + ], + [ + 3338.00, + 2525.00 + ], + [ + 3338.00, + 2525.00 + ], + [ + 3334.00, + 2513.00 + ], + [ + 3334.00, + 2513.00 + ], + [ + 3334.00, + 2513.00 + ], + [ + 3332.00, + 2496.00 + ], + [ + 3332.00, + 2496.00 + ], + [ + 3332.00, + 2496.00 + ], + [ + 3330.00, + 2484.00 + ], + [ + 3330.00, + 2484.00 + ], + [ + 3330.00, + 2484.00 + ], + [ + 3328.00, + 2467.00 + ], + [ + 3328.00, + 2467.00 + ], + [ + 3328.00, + 2467.00 + ], + [ + 3330.00, + 2451.00 + ], + [ + 3330.00, + 2451.00 + ], + [ + 3330.00, + 2451.00 + ], + [ + 3332.00, + 2434.00 + ], + [ + 3332.00, + 2434.00 + ], + [ + 3332.00, + 2434.00 + ], + [ + 3337.00, + 2419.00 + ], + [ + 3337.00, + 2419.00 + ], + [ + 3337.00, + 2419.00 + ], + [ + 3347.00, + 2401.00 + ], + [ + 3347.00, + 2401.00 + ], + [ + 3347.00, + 2401.00 + ], + [ + 3353.00, + 2389.00 + ], + [ + 3353.00, + 2389.00 + ], + [ + 3353.00, + 2389.00 + ], + [ + 3367.00, + 2378.00 + ], + [ + 3367.00, + 2378.00 + ], + [ + 3367.00, + 2378.00 + ], + [ + 3373.00, + 2373.00 + ], + [ + 3373.00, + 2373.00 + ] + ] + }, + { + "name": "Aragorn", + "id": "aragorn", + "color": "blue", + "distance": "2100 miles / 3400 km", + "startDate": "September 29, T.A. 3018", + "endDate": "March 25, T.A. 3019", + "path": [ + [ + 3374.00, + 2375.00 + ], + [ + 3374.00, + 2375.00 + ], + [ + 3361.00, + 2384.00 + ], + [ + 3361.00, + 2384.00 + ], + [ + 3361.00, + 2384.00 + ], + [ + 3343.00, + 2405.00 + ], + [ + 3343.00, + 2405.00 + ], + [ + 3343.00, + 2405.00 + ], + [ + 3332.00, + 2424.00 + ], + [ + 3332.00, + 2424.00 + ], + [ + 3332.00, + 2424.00 + ], + [ + 3328.00, + 2449.00 + ], + [ + 3328.00, + 2449.00 + ], + [ + 3328.00, + 2449.00 + ], + [ + 3330.00, + 2471.00 + ], + [ + 3330.00, + 2471.00 + ], + [ + 3330.00, + 2471.00 + ], + [ + 3330.00, + 2500.00 + ], + [ + 3330.00, + 2500.00 + ], + [ + 3330.00, + 2500.00 + ], + [ + 3341.00, + 2523.00 + ], + [ + 3341.00, + 2523.00 + ], + [ + 3341.00, + 2523.00 + ], + [ + 3348.00, + 2547.00 + ], + [ + 3348.00, + 2547.00 + ], + [ + 3348.00, + 2547.00 + ], + [ + 3354.00, + 2567.00 + ], + [ + 3354.00, + 2567.00 + ], + [ + 3354.00, + 2567.00 + ], + [ + 3360.00, + 2592.00 + ], + [ + 3360.00, + 2592.00 + ], + [ + 3360.00, + 2592.00 + ], + [ + 3361.00, + 2610.00 + ], + [ + 3361.00, + 2614.00 + ], + [ + 3361.00, + 2618.00 + ], + [ + 3361.00, + 2634.00 + ], + [ + 3361.00, + 2636.00 + ], + [ + 3361.00, + 2638.00 + ], + [ + 3367.00, + 2658.00 + ], + [ + 3367.00, + 2658.00 + ], + [ + 3367.00, + 2658.00 + ], + [ + 3375.00, + 2687.00 + ], + [ + 3375.00, + 2688.00 + ], + [ + 3375.00, + 2689.00 + ], + [ + 3365.00, + 2699.00 + ], + [ + 3365.00, + 2699.00 + ], + [ + 3365.00, + 2699.00 + ], + [ + 3342.00, + 2700.00 + ], + [ + 3342.00, + 2700.00 + ], + [ + 3342.00, + 2700.00 + ], + [ + 3316.00, + 2703.00 + ], + [ + 3316.00, + 2703.00 + ], + [ + 3316.00, + 2703.00 + ], + [ + 3297.00, + 2705.00 + ], + [ + 3297.00, + 2705.00 + ], + [ + 3297.00, + 2705.00 + ], + [ + 3284.00, + 2712.00 + ], + [ + 3284.00, + 2712.00 + ], + [ + 3284.00, + 2712.00 + ], + [ + 3290.00, + 2716.00 + ], + [ + 3297.00, + 2720.00 + ], + [ + 3304.00, + 2724.00 + ], + [ + 3304.00, + 2725.00 + ], + [ + 3308.00, + 2728.00 + ], + [ + 3312.00, + 2731.00 + ], + [ + 3307.00, + 2737.00 + ], + [ + 3306.00, + 2740.00 + ], + [ + 3305.00, + 2743.00 + ], + [ + 3293.00, + 2749.00 + ], + [ + 3289.00, + 2752.00 + ], + [ + 3285.00, + 2755.00 + ], + [ + 3277.00, + 2763.00 + ], + [ + 3274.00, + 2767.00 + ], + [ + 3271.00, + 2771.00 + ], + [ + 3272.00, + 2785.00 + ], + [ + 3272.00, + 2786.00 + ], + [ + 3272.00, + 2787.00 + ], + [ + 3275.00, + 2802.00 + ], + [ + 3278.00, + 2812.00 + ], + [ + 3281.00, + 2822.00 + ], + [ + 3285.00, + 2827.00 + ], + [ + 3286.00, + 2831.00 + ], + [ + 3287.00, + 2835.00 + ], + [ + 3291.00, + 2855.00 + ], + [ + 3291.00, + 2864.00 + ], + [ + 3291.00, + 2873.00 + ], + [ + 3289.00, + 2881.00 + ], + [ + 3288.00, + 2887.00 + ], + [ + 3287.00, + 2893.00 + ], + [ + 3284.00, + 2907.00 + ], + [ + 3282.00, + 2917.00 + ], + [ + 3280.00, + 2927.00 + ], + [ + 3273.00, + 2936.00 + ], + [ + 3271.00, + 2941.00 + ], + [ + 3269.00, + 2946.00 + ], + [ + 3261.00, + 2964.00 + ], + [ + 3259.00, + 2968.00 + ], + [ + 3257.00, + 2972.00 + ], + [ + 3247.00, + 2986.00 + ], + [ + 3239.00, + 2995.00 + ], + [ + 3231.00, + 3004.00 + ], + [ + 3227.00, + 3008.00 + ], + [ + 3224.00, + 3011.00 + ], + [ + 3221.00, + 3014.00 + ], + [ + 3206.00, + 3029.00 + ], + [ + 3206.00, + 3029.00 + ], + [ + 3206.00, + 3029.00 + ], + [ + 3179.00, + 3035.00 + ], + [ + 3179.00, + 3035.00 + ], + [ + 3179.00, + 3035.00 + ], + [ + 3156.00, + 3032.00 + ], + [ + 3154.00, + 3032.00 + ], + [ + 3152.00, + 3032.00 + ], + [ + 3148.00, + 3032.00 + ], + [ + 3148.00, + 3032.00 + ], + [ + 3148.00, + 3032.00 + ], + [ + 3134.00, + 3031.00 + ], + [ + 3130.00, + 3031.00 + ], + [ + 3126.00, + 3031.00 + ], + [ + 3119.00, + 3035.00 + ], + [ + 3116.00, + 3036.00 + ], + [ + 3113.00, + 3037.00 + ], + [ + 3099.00, + 3039.00 + ], + [ + 3093.00, + 3040.00 + ], + [ + 3087.00, + 3041.00 + ], + [ + 3084.00, + 3041.00 + ], + [ + 3082.00, + 3041.00 + ], + [ + 3080.00, + 3041.00 + ], + [ + 3072.00, + 3045.00 + ], + [ + 3066.00, + 3047.00 + ], + [ + 3060.00, + 3049.00 + ], + [ + 3051.00, + 3051.00 + ], + [ + 3050.00, + 3051.00 + ], + [ + 3049.00, + 3051.00 + ], + [ + 3020.00, + 3064.00 + ], + [ + 3019.00, + 3064.00 + ], + [ + 3018.00, + 3064.00 + ], + [ + 2989.00, + 3066.00 + ], + [ + 2985.00, + 3066.00 + ], + [ + 2981.00, + 3066.00 + ], + [ + 2957.00, + 3064.00 + ], + [ + 2957.00, + 3064.00 + ], + [ + 2957.00, + 3064.00 + ], + [ + 2937.00, + 3058.00 + ], + [ + 2934.00, + 3057.00 + ], + [ + 2931.00, + 3056.00 + ], + [ + 2911.00, + 3043.00 + ], + [ + 2911.00, + 3043.00 + ], + [ + 2911.00, + 3043.00 + ], + [ + 2896.00, + 3027.00 + ], + [ + 2896.00, + 3026.00 + ], + [ + 2896.00, + 3025.00 + ], + [ + 2887.00, + 3012.00 + ], + [ + 2887.00, + 3012.00 + ], + [ + 2887.00, + 3012.00 + ], + [ + 2884.00, + 2992.00 + ], + [ + 2884.00, + 2992.00 + ], + [ + 2884.00, + 2992.00 + ], + [ + 2880.00, + 2979.00 + ], + [ + 2880.00, + 2979.00 + ], + [ + 2880.00, + 2979.00 + ], + [ + 2879.00, + 2964.00 + ], + [ + 2879.00, + 2964.00 + ], + [ + 2879.00, + 2964.00 + ], + [ + 2879.00, + 2950.00 + ], + [ + 2879.00, + 2947.00 + ], + [ + 2879.00, + 2944.00 + ], + [ + 2875.00, + 2934.00 + ], + [ + 2875.00, + 2934.00 + ], + [ + 2875.00, + 2934.00 + ], + [ + 2873.00, + 2917.00 + ], + [ + 2873.00, + 2912.00 + ], + [ + 2873.00, + 2907.00 + ], + [ + 2872.00, + 2904.00 + ], + [ + 2872.00, + 2903.00 + ], + [ + 2872.00, + 2902.00 + ], + [ + 2871.00, + 2887.00 + ], + [ + 2871.00, + 2887.00 + ], + [ + 2871.00, + 2887.00 + ], + [ + 2867.00, + 2862.00 + ], + [ + 2867.00, + 2860.00 + ], + [ + 2867.00, + 2858.00 + ], + [ + 2864.00, + 2840.00 + ], + [ + 2862.00, + 2835.00 + ], + [ + 2860.00, + 2830.00 + ], + [ + 2858.00, + 2828.00 + ], + [ + 2857.00, + 2828.00 + ], + [ + 2856.00, + 2828.00 + ], + [ + 2839.00, + 2809.00 + ], + [ + 2838.00, + 2809.00 + ], + [ + 2837.00, + 2809.00 + ], + [ + 2822.00, + 2802.00 + ], + [ + 2818.00, + 2798.00 + ], + [ + 2814.00, + 2794.00 + ], + [ + 2810.00, + 2790.00 + ], + [ + 2810.00, + 2790.00 + ], + [ + 2810.00, + 2790.00 + ], + [ + 2795.00, + 2784.00 + ], + [ + 2792.00, + 2783.00 + ], + [ + 2789.00, + 2782.00 + ], + [ + 2784.00, + 2776.00 + ], + [ + 2784.00, + 2776.00 + ], + [ + 2784.00, + 2776.00 + ], + [ + 2773.00, + 2771.00 + ], + [ + 2765.00, + 2767.00 + ], + [ + 2757.00, + 2763.00 + ], + [ + 2759.00, + 2764.00 + ], + [ + 2758.00, + 2763.00 + ], + [ + 2757.00, + 2762.00 + ], + [ + 2739.00, + 2757.00 + ], + [ + 2738.00, + 2757.00 + ], + [ + 2737.00, + 2757.00 + ], + [ + 2726.00, + 2755.00 + ], + [ + 2724.00, + 2754.00 + ], + [ + 2722.00, + 2753.00 + ], + [ + 2704.00, + 2751.00 + ], + [ + 2702.00, + 2751.00 + ], + [ + 2700.00, + 2751.00 + ], + [ + 2693.00, + 2744.00 + ], + [ + 2690.00, + 2742.00 + ], + [ + 2687.00, + 2740.00 + ], + [ + 2688.00, + 2731.00 + ], + [ + 2687.00, + 2729.00 + ], + [ + 2686.00, + 2727.00 + ], + [ + 2687.00, + 2713.00 + ], + [ + 2687.00, + 2713.00 + ], + [ + 2687.00, + 2713.00 + ], + [ + 2685.00, + 2693.00 + ], + [ + 2685.00, + 2694.00 + ], + [ + 2685.00, + 2695.00 + ], + [ + 2679.00, + 2680.00 + ], + [ + 2678.00, + 2676.00 + ], + [ + 2677.00, + 2672.00 + ], + [ + 2673.00, + 2663.00 + ], + [ + 2673.00, + 2662.00 + ], + [ + 2673.00, + 2661.00 + ], + [ + 2671.00, + 2648.00 + ], + [ + 2671.00, + 2646.00 + ], + [ + 2671.00, + 2644.00 + ], + [ + 2663.00, + 2630.00 + ], + [ + 2663.00, + 2630.00 + ], + [ + 2663.00, + 2630.00 + ], + [ + 2646.00, + 2616.00 + ], + [ + 2634.00, + 2606.00 + ], + [ + 2629.00, + 2600.00 + ], + [ + 2617.00, + 2600.00 + ], + [ + 2617.00, + 2600.00 + ], + [ + 2617.00, + 2600.00 + ], + [ + 2578.00, + 2590.00 + ], + [ + 2577.00, + 2590.00 + ], + [ + 2576.00, + 2590.00 + ], + [ + 2569.00, + 2580.00 + ], + [ + 2569.00, + 2579.00 + ], + [ + 2569.00, + 2578.00 + ], + [ + 2556.00, + 2570.00 + ], + [ + 2553.00, + 2566.00 + ], + [ + 2550.00, + 2562.00 + ], + [ + 2548.00, + 2559.00 + ], + [ + 2547.00, + 2557.00 + ], + [ + 2546.00, + 2555.00 + ], + [ + 2537.00, + 2542.00 + ], + [ + 2536.00, + 2539.00 + ], + [ + 2535.00, + 2536.00 + ], + [ + 2527.00, + 2519.00 + ], + [ + 2526.00, + 2515.00 + ], + [ + 2525.00, + 2511.00 + ], + [ + 2520.00, + 2506.00 + ], + [ + 2520.00, + 2505.00 + ], + [ + 2520.00, + 2504.00 + ], + [ + 2512.00, + 2492.00 + ], + [ + 2512.00, + 2492.00 + ], + [ + 2512.00, + 2492.00 + ], + [ + 2504.00, + 2477.00 + ], + [ + 2504.00, + 2477.00 + ], + [ + 2504.00, + 2477.00 + ], + [ + 2498.00, + 2464.00 + ], + [ + 2498.00, + 2459.00 + ], + [ + 2498.00, + 2454.00 + ], + [ + 2496.00, + 2440.00 + ], + [ + 2496.00, + 2439.00 + ], + [ + 2496.00, + 2438.00 + ], + [ + 2493.00, + 2418.00 + ], + [ + 2493.00, + 2418.00 + ], + [ + 2493.00, + 2418.00 + ], + [ + 2494.00, + 2397.00 + ], + [ + 2492.00, + 2396.00 + ], + [ + 2490.00, + 2395.00 + ], + [ + 2481.00, + 2393.00 + ], + [ + 2477.00, + 2391.00 + ], + [ + 2473.00, + 2389.00 + ], + [ + 2465.00, + 2386.00 + ], + [ + 2464.00, + 2384.00 + ], + [ + 2463.00, + 2382.00 + ], + [ + 2453.00, + 2376.00 + ], + [ + 2450.00, + 2374.00 + ], + [ + 2447.00, + 2372.00 + ], + [ + 2437.00, + 2361.00 + ], + [ + 2435.00, + 2359.00 + ], + [ + 2433.00, + 2357.00 + ], + [ + 2423.00, + 2343.00 + ], + [ + 2417.00, + 2335.00 + ], + [ + 2415.00, + 2332.00 + ], + [ + 2415.00, + 2328.00 + ], + [ + 2414.00, + 2323.00 + ], + [ + 2413.00, + 2318.00 + ], + [ + 2411.00, + 2314.00 + ], + [ + 2410.00, + 2309.00 + ], + [ + 2409.00, + 2304.00 + ], + [ + 2407.00, + 2293.00 + ], + [ + 2407.00, + 2291.00 + ], + [ + 2407.00, + 2289.00 + ], + [ + 2400.00, + 2281.00 + ], + [ + 2399.00, + 2280.00 + ], + [ + 2398.00, + 2279.00 + ], + [ + 2390.00, + 2277.00 + ], + [ + 2390.00, + 2276.00 + ], + [ + 2390.00, + 2275.00 + ], + [ + 2379.00, + 2274.00 + ], + [ + 2377.00, + 2273.00 + ], + [ + 2375.00, + 2272.00 + ], + [ + 2361.00, + 2265.00 + ], + [ + 2360.00, + 2265.00 + ], + [ + 2359.00, + 2265.00 + ], + [ + 2347.00, + 2261.00 + ], + [ + 2347.00, + 2261.00 + ], + [ + 2347.00, + 2261.00 + ], + [ + 2329.00, + 2250.00 + ], + [ + 2329.00, + 2250.00 + ], + [ + 2329.00, + 2250.00 + ], + [ + 2321.00, + 2242.00 + ], + [ + 2320.00, + 2240.00 + ], + [ + 2319.00, + 2238.00 + ], + [ + 2314.00, + 2224.00 + ], + [ + 2314.00, + 2224.00 + ], + [ + 2314.00, + 2224.00 + ], + [ + 2312.00, + 2201.00 + ], + [ + 2312.00, + 2196.00 + ], + [ + 2312.00, + 2191.00 + ], + [ + 2316.00, + 2184.00 + ], + [ + 2316.00, + 2184.00 + ], + [ + 2316.00, + 2184.00 + ], + [ + 2321.00, + 2180.00 + ], + [ + 2323.00, + 2173.00 + ], + [ + 2323.00, + 2172.00 + ], + [ + 2327.00, + 2164.00 + ], + [ + 2327.00, + 2164.00 + ], + [ + 2327.00, + 2164.00 + ], + [ + 2332.00, + 2150.00 + ], + [ + 2332.00, + 2148.00 + ], + [ + 2332.00, + 2146.00 + ], + [ + 2332.00, + 2137.00 + ], + [ + 2332.00, + 2137.00 + ], + [ + 2332.00, + 2137.00 + ], + [ + 2336.00, + 2123.00 + ], + [ + 2336.00, + 2123.00 + ], + [ + 2336.00, + 2123.00 + ], + [ + 2341.00, + 2135.00 + ], + [ + 2341.00, + 2135.00 + ], + [ + 2341.00, + 2135.00 + ], + [ + 2342.00, + 2142.00 + ], + [ + 2342.00, + 2142.00 + ], + [ + 2342.00, + 2142.00 + ], + [ + 2343.00, + 2151.00 + ], + [ + 2344.00, + 2152.00 + ], + [ + 2345.00, + 2153.00 + ], + [ + 2346.00, + 2161.00 + ], + [ + 2346.00, + 2161.00 + ], + [ + 2346.00, + 2161.00 + ], + [ + 2346.00, + 2179.00 + ], + [ + 2346.00, + 2180.00 + ], + [ + 2346.00, + 2181.00 + ], + [ + 2346.00, + 2189.00 + ], + [ + 2346.00, + 2193.00 + ], + [ + 2346.00, + 2197.00 + ], + [ + 2345.00, + 2201.00 + ], + [ + 2345.00, + 2202.00 + ], + [ + 2345.00, + 2203.00 + ], + [ + 2340.00, + 2213.00 + ], + [ + 2340.00, + 2215.00 + ], + [ + 2340.00, + 2217.00 + ], + [ + 2342.00, + 2225.00 + ], + [ + 2342.00, + 2227.00 + ], + [ + 2342.00, + 2229.00 + ], + [ + 2344.00, + 2240.00 + ], + [ + 2345.00, + 2243.00 + ], + [ + 2346.00, + 2246.00 + ], + [ + 2346.00, + 2249.00 + ], + [ + 2346.00, + 2249.00 + ], + [ + 2346.00, + 2249.00 + ], + [ + 2359.00, + 2254.00 + ], + [ + 2360.00, + 2254.00 + ], + [ + 2361.00, + 2254.00 + ], + [ + 2377.00, + 2255.00 + ], + [ + 2378.00, + 2255.00 + ], + [ + 2379.00, + 2255.00 + ], + [ + 2393.00, + 2260.00 + ], + [ + 2393.00, + 2260.00 + ], + [ + 2393.00, + 2260.00 + ], + [ + 2404.00, + 2264.00 + ], + [ + 2404.00, + 2264.00 + ], + [ + 2404.00, + 2264.00 + ], + [ + 2415.00, + 2270.00 + ], + [ + 2415.00, + 2270.00 + ], + [ + 2415.00, + 2270.00 + ], + [ + 2414.00, + 2280.00 + ], + [ + 2414.00, + 2281.00 + ], + [ + 2414.00, + 2282.00 + ], + [ + 2414.00, + 2291.00 + ], + [ + 2414.00, + 2291.00 + ], + [ + 2414.00, + 2291.00 + ], + [ + 2428.00, + 2328.00 + ], + [ + 2427.00, + 2328.00 + ], + [ + 2426.00, + 2328.00 + ], + [ + 2425.00, + 2321.00 + ], + [ + 2425.00, + 2320.00 + ], + [ + 2420.99, + 2317.60 + ], + [ + 2417.59, + 2305.71 + ], + [ + 2427.00, + 2308.00 + ], + [ + 2427.00, + 2307.73 + ], + [ + 2427.15, + 2306.86 + ], + [ + 2427.36, + 2305.73 + ], + [ + 2427.94, + 2302.69 + ], + [ + 2429.00, + 2297.73 + ], + [ + 2429.00, + 2297.00 + ], + [ + 2429.00, + 2296.00 + ], + [ + 2435.00, + 2285.00 + ], + [ + 2436.00, + 2284.00 + ], + [ + 2437.00, + 2283.00 + ], + [ + 2451.00, + 2280.00 + ], + [ + 2451.00, + 2280.00 + ], + [ + 2451.00, + 2280.00 + ], + [ + 2464.00, + 2287.00 + ], + [ + 2465.00, + 2287.00 + ], + [ + 2466.00, + 2287.00 + ], + [ + 2479.00, + 2294.00 + ], + [ + 2480.00, + 2294.00 + ], + [ + 2481.00, + 2294.00 + ], + [ + 2500.00, + 2305.00 + ], + [ + 2500.00, + 2305.00 + ], + [ + 2500.00, + 2305.00 + ], + [ + 2518.00, + 2317.00 + ], + [ + 2518.00, + 2317.00 + ], + [ + 2518.00, + 2317.00 + ], + [ + 2533.00, + 2327.00 + ], + [ + 2533.00, + 2327.00 + ], + [ + 2533.00, + 2327.00 + ], + [ + 2545.00, + 2330.00 + ], + [ + 2545.00, + 2330.00 + ], + [ + 2545.00, + 2330.00 + ], + [ + 2555.00, + 2342.00 + ], + [ + 2555.00, + 2342.00 + ], + [ + 2555.00, + 2342.00 + ], + [ + 2565.00, + 2351.00 + ], + [ + 2565.00, + 2352.00 + ], + [ + 2565.00, + 2353.00 + ], + [ + 2576.00, + 2361.00 + ], + [ + 2576.00, + 2361.00 + ], + [ + 2576.00, + 2361.00 + ], + [ + 2590.00, + 2390.00 + ], + [ + 2590.00, + 2390.00 + ], + [ + 2590.00, + 2390.00 + ], + [ + 2596.00, + 2369.00 + ], + [ + 2597.00, + 2357.00 + ], + [ + 2598.00, + 2345.00 + ], + [ + 2599.00, + 2344.00 + ], + [ + 2600.00, + 2334.00 + ], + [ + 2601.00, + 2324.00 + ], + [ + 2600.00, + 2321.00 + ], + [ + 2600.00, + 2311.00 + ], + [ + 2600.00, + 2301.00 + ], + [ + 2600.00, + 2304.00 + ], + [ + 2600.00, + 2298.00 + ], + [ + 2600.00, + 2292.00 + ], + [ + 2600.00, + 2283.00 + ], + [ + 2600.00, + 2272.00 + ], + [ + 2600.00, + 2261.00 + ], + [ + 2600.00, + 2266.00 + ], + [ + 2600.00, + 2256.00 + ], + [ + 2600.00, + 2246.00 + ], + [ + 2600.00, + 2249.00 + ], + [ + 2601.00, + 2234.00 + ], + [ + 2602.00, + 2219.00 + ], + [ + 2602.00, + 2226.00 + ], + [ + 2602.00, + 2197.00 + ], + [ + 2602.00, + 2182.00 + ], + [ + 2601.00, + 2190.00 + ], + [ + 2599.00, + 2178.00 + ], + [ + 2597.00, + 2166.00 + ], + [ + 2599.00, + 2170.00 + ], + [ + 2602.00, + 2162.00 + ], + [ + 2605.00, + 2154.00 + ], + [ + 2606.00, + 2154.00 + ], + [ + 2608.00, + 2147.00 + ], + [ + 2610.00, + 2140.00 + ], + [ + 2611.00, + 2137.00 + ], + [ + 2614.00, + 2132.00 + ], + [ + 2617.00, + 2127.00 + ], + [ + 2617.00, + 2126.00 + ], + [ + 2617.00, + 2123.00 + ], + [ + 2617.00, + 2120.00 + ], + [ + 2618.00, + 2115.00 + ], + [ + 2619.00, + 2111.00 + ], + [ + 2620.00, + 2107.00 + ], + [ + 2622.00, + 2105.00 + ], + [ + 2623.00, + 2103.00 + ], + [ + 2624.00, + 2101.00 + ], + [ + 2625.00, + 2091.00 + ], + [ + 2625.00, + 2089.00 + ], + [ + 2625.00, + 2087.00 + ], + [ + 2642.00, + 2087.00 + ], + [ + 2650.00, + 2088.00 + ], + [ + 2652.00, + 2088.00 + ], + [ + 2657.00, + 2090.00 + ], + [ + 2658.00, + 2091.00 + ], + [ + 2659.00, + 2092.00 + ], + [ + 2666.00, + 2092.00 + ], + [ + 2667.00, + 2093.00 + ], + [ + 2668.00, + 2094.00 + ], + [ + 2684.00, + 2097.00 + ], + [ + 2686.00, + 2098.00 + ], + [ + 2688.00, + 2099.00 + ], + [ + 2695.00, + 2103.00 + ], + [ + 2696.00, + 2104.00 + ], + [ + 2697.00, + 2105.00 + ], + [ + 2708.00, + 2112.00 + ], + [ + 2708.00, + 2112.00 + ], + [ + 2708.00, + 2112.00 + ], + [ + 2730.00, + 2128.00 + ], + [ + 2730.00, + 2128.00 + ], + [ + 2730.00, + 2128.00 + ], + [ + 2745.00, + 2140.00 + ], + [ + 2745.00, + 2140.00 + ], + [ + 2745.00, + 2140.00 + ], + [ + 2761.00, + 2150.00 + ], + [ + 2761.00, + 2150.00 + ], + [ + 2761.00, + 2150.00 + ], + [ + 2791.00, + 2168.00 + ], + [ + 2791.00, + 2168.00 + ], + [ + 2791.00, + 2168.00 + ], + [ + 2808.00, + 2194.00 + ], + [ + 2808.00, + 2194.00 + ], + [ + 2808.00, + 2194.00 + ], + [ + 2823.00, + 2214.00 + ], + [ + 2823.00, + 2214.00 + ], + [ + 2823.00, + 2214.00 + ], + [ + 2850.00, + 2233.00 + ], + [ + 2850.00, + 2233.00 + ], + [ + 2850.00, + 2233.00 + ], + [ + 2865.00, + 2250.00 + ], + [ + 2865.00, + 2250.00 + ], + [ + 2865.00, + 2250.00 + ], + [ + 2878.00, + 2269.00 + ], + [ + 2878.00, + 2269.00 + ], + [ + 2878.00, + 2269.00 + ], + [ + 2890.00, + 2286.00 + ], + [ + 2891.00, + 2287.00 + ], + [ + 2892.00, + 2288.00 + ], + [ + 2904.00, + 2291.00 + ], + [ + 2904.00, + 2291.00 + ], + [ + 2904.00, + 2291.00 + ], + [ + 2921.00, + 2293.00 + ], + [ + 2924.00, + 2293.00 + ], + [ + 2927.00, + 2293.00 + ], + [ + 2949.00, + 2300.00 + ], + [ + 2952.00, + 2301.00 + ], + [ + 2955.00, + 2302.00 + ], + [ + 2970.00, + 2308.00 + ], + [ + 2970.00, + 2308.00 + ], + [ + 2970.00, + 2308.00 + ], + [ + 2986.00, + 2325.00 + ], + [ + 2989.00, + 2328.00 + ], + [ + 2992.00, + 2331.00 + ], + [ + 3009.00, + 2340.00 + ], + [ + 3009.00, + 2340.00 + ], + [ + 3009.00, + 2340.00 + ], + [ + 3016.00, + 2355.00 + ], + [ + 3016.00, + 2355.00 + ], + [ + 3016.00, + 2355.00 + ], + [ + 3031.00, + 2368.00 + ], + [ + 3031.00, + 2368.00 + ], + [ + 3031.00, + 2368.00 + ], + [ + 3049.00, + 2383.00 + ], + [ + 3049.00, + 2383.00 + ], + [ + 3049.00, + 2383.00 + ], + [ + 3053.00, + 2367.00 + ], + [ + 3053.00, + 2366.00 + ], + [ + 3053.00, + 2365.00 + ], + [ + 3045.00, + 2348.00 + ], + [ + 3045.00, + 2345.00 + ], + [ + 3045.00, + 2342.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3042.00, + 2320.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3039.00, + 2302.00 + ], + [ + 3037.00, + 2288.00 + ], + [ + 3035.00, + 2285.00 + ], + [ + 3033.00, + 2282.00 + ], + [ + 3031.00, + 2270.00 + ], + [ + 3031.00, + 2268.00 + ], + [ + 3031.00, + 2266.00 + ], + [ + 3028.00, + 2252.00 + ], + [ + 3028.00, + 2249.00 + ], + [ + 3028.00, + 2246.00 + ], + [ + 3024.00, + 2231.00 + ], + [ + 3024.00, + 2228.00 + ], + [ + 3024.00, + 2225.00 + ], + [ + 3028.00, + 2215.00 + ], + [ + 3029.00, + 2211.00 + ], + [ + 3030.00, + 2207.00 + ], + [ + 3032.00, + 2193.00 + ], + [ + 3033.00, + 2190.00 + ], + [ + 3034.00, + 2187.00 + ], + [ + 3039.00, + 2177.00 + ], + [ + 3039.00, + 2176.00 + ], + [ + 3039.00, + 2175.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3043.00, + 2163.00 + ], + [ + 3046.00, + 2150.00 + ], + [ + 3046.00, + 2149.00 + ], + [ + 3046.00, + 2148.00 + ], + [ + 3051.00, + 2131.00 + ], + [ + 3052.00, + 2130.00 + ], + [ + 3053.00, + 2129.00 + ], + [ + 3054.00, + 2114.00 + ], + [ + 3054.00, + 2113.00 + ], + [ + 3054.00, + 2112.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3054.00, + 2099.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3043.00, + 2089.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3025.00, + 2080.00 + ], + [ + 3006.00, + 2071.00 + ], + [ + 3005.00, + 2070.00 + ], + [ + 3004.00, + 2069.00 + ], + [ + 3003.00, + 2055.00 + ], + [ + 3003.00, + 2051.00 + ], + [ + 3003.00, + 2047.00 + ], + [ + 3009.00, + 2039.00 + ], + [ + 3010.00, + 2038.00 + ], + [ + 3011.00, + 2037.00 + ], + [ + 3020.00, + 2021.00 + ], + [ + 3021.00, + 2020.00 + ], + [ + 3022.00, + 2019.00 + ], + [ + 3031.00, + 2002.00 + ], + [ + 3031.00, + 2000.00 + ], + [ + 3031.00, + 1998.00 + ], + [ + 3027.00, + 1985.00 + ], + [ + 3027.00, + 1984.00 + ], + [ + 3027.00, + 1983.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 3007.00, + 1975.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2990.00, + 1982.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2973.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2966.00, + 1984.00 + ], + [ + 2960.00, + 1983.00 + ], + [ + 2954.00, + 1979.00 + ], + [ + 2948.00, + 1975.00 + ], + [ + 2946.00, + 1970.00 + ], + [ + 2945.00, + 1968.00 + ], + [ + 2944.00, + 1966.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2938.00, + 1956.00 + ], + [ + 2941.00, + 1935.00 + ], + [ + 2941.00, + 1933.00 + ], + [ + 2941.00, + 1931.00 + ], + [ + 2948.00, + 1923.00 + ], + [ + 2949.00, + 1921.00 + ], + [ + 2950.00, + 1919.00 + ], + [ + 2955.00, + 1910.00 + ], + [ + 2955.00, + 1909.00 + ], + [ + 2955.00, + 1908.00 + ], + [ + 2956.00, + 1901.00 + ], + [ + 2956.00, + 1900.00 + ], + [ + 2956.00, + 1899.00 + ], + [ + 2947.00, + 1893.00 + ], + [ + 2943.00, + 1889.00 + ], + [ + 2939.00, + 1885.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2934.00, + 1887.00 + ], + [ + 2913.00, + 1880.00 + ], + [ + 2910.00, + 1879.00 + ], + [ + 2907.00, + 1878.00 + ], + [ + 2901.00, + 1874.00 + ], + [ + 2900.00, + 1873.00 + ], + [ + 2899.00, + 1872.00 + ], + [ + 2886.00, + 1861.00 + ], + [ + 2881.00, + 1857.00 + ], + [ + 2876.00, + 1853.00 + ], + [ + 2868.00, + 1848.00 + ], + [ + 2866.00, + 1846.00 + ], + [ + 2864.00, + 1844.00 + ], + [ + 2851.00, + 1836.00 + ], + [ + 2850.00, + 1836.00 + ], + [ + 2849.00, + 1836.00 + ], + [ + 2838.00, + 1828.00 + ], + [ + 2837.00, + 1827.00 + ], + [ + 2836.00, + 1826.00 + ], + [ + 2821.00, + 1820.00 + ], + [ + 2818.00, + 1819.00 + ], + [ + 2815.00, + 1818.00 + ], + [ + 2803.00, + 1811.00 + ], + [ + 2801.00, + 1810.00 + ], + [ + 2799.00, + 1809.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2794.00, + 1802.00 + ], + [ + 2791.00, + 1787.00 + ], + [ + 2791.00, + 1785.00 + ], + [ + 2791.00, + 1783.00 + ], + [ + 2790.00, + 1772.00 + ], + [ + 2784.00, + 1766.00 + ], + [ + 2778.00, + 1760.00 + ], + [ + 2787.00, + 1746.00 + ], + [ + 2787.00, + 1745.00 + ], + [ + 2787.00, + 1744.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2770.00, + 1731.00 + ], + [ + 2744.00, + 1728.00 + ], + [ + 2744.00, + 1727.00 + ], + [ + 2744.00, + 1726.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2720.00, + 1722.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2696.00, + 1712.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2673.00, + 1699.00 + ], + [ + 2660.00, + 1693.00 + ], + [ + 2659.00, + 1693.00 + ], + [ + 2658.00, + 1693.00 + ], + [ + 2646.00, + 1685.00 + ], + [ + 2645.00, + 1684.00 + ], + [ + 2644.00, + 1683.00 + ], + [ + 2636.00, + 1679.00 + ], + [ + 2634.00, + 1677.00 + ], + [ + 2632.00, + 1675.00 + ], + [ + 2624.00, + 1667.00 + ], + [ + 2624.00, + 1666.00 + ], + [ + 2624.00, + 1665.00 + ], + [ + 2613.00, + 1653.00 + ], + [ + 2612.00, + 1652.00 + ], + [ + 2611.00, + 1651.00 + ], + [ + 2598.00, + 1647.00 + ], + [ + 2598.00, + 1646.00 + ], + [ + 2598.00, + 1645.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2601.00, + 1627.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2593.00, + 1610.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2576.00, + 1603.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2565.00, + 1593.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2558.00, + 1573.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2551.00, + 1556.00 + ], + [ + 2538.00, + 1545.00 + ], + [ + 2537.00, + 1544.00 + ], + [ + 2536.00, + 1543.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2526.00, + 1537.00 + ], + [ + 2514.00, + 1534.00 + ], + [ + 2513.00, + 1534.00 + ], + [ + 2512.00, + 1534.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2503.00, + 1535.00 + ], + [ + 2477.00, + 1533.00 + ], + [ + 2473.00, + 1533.00 + ], + [ + 2469.00, + 1533.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2457.00, + 1537.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2439.00, + 1538.00 + ], + [ + 2428.00, + 1540.00 + ], + [ + 2427.00, + 1540.00 + ], + [ + 2426.00, + 1540.00 + ], + [ + 2407.00, + 1537.00 + ], + [ + 2404.00, + 1535.00 + ], + [ + 2401.00, + 1533.00 + ], + [ + 2394.00, + 1529.00 + ], + [ + 2394.00, + 1526.00 + ], + [ + 2394.00, + 1523.00 + ], + [ + 2398.00, + 1509.00 + ], + [ + 2399.00, + 1507.00 + ], + [ + 2400.00, + 1505.00 + ], + [ + 2401.00, + 1496.00 + ], + [ + 2403.00, + 1488.00 + ], + [ + 2405.00, + 1480.00 + ], + [ + 2409.00, + 1474.00 + ], + [ + 2410.00, + 1471.00 + ], + [ + 2411.00, + 1468.00 + ], + [ + 2417.00, + 1457.00 + ], + [ + 2419.00, + 1453.00 + ], + [ + 2421.00, + 1449.00 + ], + [ + 2425.00, + 1439.00 + ], + [ + 2426.00, + 1438.00 + ], + [ + 2427.00, + 1437.00 + ], + [ + 2432.00, + 1423.00 + ], + [ + 2434.00, + 1419.00 + ], + [ + 2436.00, + 1415.00 + ], + [ + 2439.00, + 1408.00 + ], + [ + 2440.00, + 1406.00 + ], + [ + 2441.00, + 1404.00 + ], + [ + 2455.00, + 1402.00 + ], + [ + 2460.00, + 1401.00 + ], + [ + 2465.00, + 1400.00 + ], + [ + 2468.00, + 1400.00 + ], + [ + 2476.00, + 1402.00 + ], + [ + 2484.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2498.00, + 1404.00 + ], + [ + 2515.00, + 1404.00 + ], + [ + 2516.00, + 1403.00 + ], + [ + 2517.00, + 1402.00 + ], + [ + 2503.00, + 1398.00 + ], + [ + 2501.00, + 1398.00 + ], + [ + 2499.00, + 1398.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2485.00, + 1393.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2462.00, + 1387.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2448.00, + 1376.00 + ], + [ + 2457.00, + 1367.00 + ], + [ + 2463.00, + 1355.00 + ], + [ + 2466.00, + 1348.00 + ], + [ + 2467.00, + 1348.00 + ], + [ + 2470.00, + 1340.00 + ], + [ + 2473.00, + 1332.00 + ], + [ + 2471.00, + 1331.00 + ], + [ + 2491.00, + 1287.00 + ], + [ + 2493.00, + 1281.00 + ], + [ + 2490.00, + 1275.00 + ], + [ + 2492.00, + 1273.00 + ], + [ + 2494.00, + 1271.00 + ], + [ + 2505.00, + 1241.00 + ], + [ + 2507.00, + 1237.00 + ], + [ + 2509.00, + 1233.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2509.00, + 1231.00 + ], + [ + 2517.00, + 1210.00 + ], + [ + 2516.00, + 1206.00 + ], + [ + 2515.00, + 1202.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2510.00, + 1189.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2505.00, + 1178.00 + ], + [ + 2500.00, + 1163.00 + ], + [ + 2501.00, + 1162.00 + ], + [ + 2506, + 1147 + ], + [ + 2514, + 1132 + ], + [ + 2492, + 1151 + ], + [ + 2467, + 1153 + ], + [ + 2467, + 1153 + ], + [ + 2467, + 1153 + ], + [ + 2443, + 1152 + ], + [ + 2442, + 1152 + ], + [ + 2441, + 1152 + ], + [ + 2414, + 1150 + ], + [ + 2414, + 1150 + ], + [ + 2414, + 1150 + ], + [ + 2400, + 1147.33 + ], + [ + 2399.33, + 1147.33 + ], + [ + 2398.67, + 1147.33 + ], + [ + 2387.33, + 1145.33 + ], + [ + 2387.33, + 1145.33 + ], + [ + 2387.33, + 1145.33 + ], + [ + 2375.33, + 1144 + ], + [ + 2375.33, + 1144 + ], + [ + 2375.33, + 1144 + ], + [ + 2364, + 1142 + ], + [ + 2364, + 1142 + ], + [ + 2364, + 1142 + ], + [ + 2354.67, + 1140 + ], + [ + 2354.67, + 1140 + ], + [ + 2354.67, + 1140 + ], + [ + 2346, + 1125.33 + ], + [ + 2346, + 1125.33 + ], + [ + 2346, + 1125.33 + ], + [ + 2339.33, + 1116 + ], + [ + 2339.33, + 1115.33 + ], + [ + 2339.33, + 1114.67 + ], + [ + 2332, + 1102 + ], + [ + 2332, + 1102 + ], + [ + 2332, + 1102 + ], + [ + 2328.67, + 1090.67 + ], + [ + 2328.67, + 1090.67 + ], + [ + 2328.67, + 1090.67 + ], + [ + 2328.67, + 1075.33 + ], + [ + 2328.67, + 1075.33 + ], + [ + 2328.67, + 1075.33 + ], + [ + 2329.33, + 1062 + ], + [ + 2329.33, + 1062 + ], + [ + 2329.33, + 1062 + ], + [ + 2329.33, + 1046 + ], + [ + 2329.33, + 1046 + ], + [ + 2329.33, + 1046 + ], + [ + 2319.33, + 1060.67 + ], + [ + 2319.33, + 1060.67 + ], + [ + 2319.33, + 1060.67 + ], + [ + 2314, + 1074 + ], + [ + 2314, + 1074 + ], + [ + 2314, + 1074 + ], + [ + 2308.67, + 1084 + ], + [ + 2308.67, + 1084 + ], + [ + 2308.67, + 1084 + ], + [ + 2303.33, + 1094 + ], + [ + 2303.33, + 1094 + ], + [ + 2303.33, + 1094 + ], + [ + 2294, + 1110.67 + ], + [ + 2294, + 1110.67 + ], + [ + 2294, + 1110.67 + ], + [ + 2286.67, + 1119.33 + ], + [ + 2286.67, + 1119.33 + ], + [ + 2286.67, + 1119.33 + ], + [ + 2280.67, + 1128.67 + ], + [ + 2280, + 1128.67 + ], + [ + 2279.33, + 1128.67 + ], + [ + 2262, + 1142 + ], + [ + 2262, + 1142 + ], + [ + 2262, + 1142 + ], + [ + 2238.67, + 1158.67 + ], + [ + 2238.67, + 1158.67 + ], + [ + 2238.67, + 1158.67 + ], + [ + 2215.33, + 1173.33 + ], + [ + 2215.33, + 1174 + ], + [ + 2215.33, + 1174.67 + ], + [ + 2193.33, + 1192 + ], + [ + 2193.33, + 1192.67 + ], + [ + 2193.33, + 1193.33 + ], + [ + 2160.67, + 1202 + ], + [ + 2160.67, + 1202.67 + ], + [ + 2160.67, + 1203.33 + ], + [ + 2137.33, + 1210.67 + ], + [ + 2137.33, + 1210.67 + ], + [ + 2137.33, + 1210.67 + ], + [ + 2105.33, + 1213.33 + ], + [ + 2104, + 1214 + ], + [ + 2102.67, + 1214.67 + ], + [ + 2074, + 1218 + ], + [ + 2073.33, + 1217.33 + ], + [ + 2072.67, + 1216.67 + ], + [ + 2048, + 1214.67 + ], + [ + 2048, + 1214.67 + ], + [ + 2048, + 1214.67 + ], + [ + 2023.33, + 1218 + ], + [ + 2022.67, + 1218 + ], + [ + 2022, + 1218 + ], + [ + 1992.67, + 1211.33 + ], + [ + 1991.33, + 1210.67 + ], + [ + 1990, + 1210 + ], + [ + 1981.33, + 1195.33 + ], + [ + 1981.33, + 1195.33 + ], + [ + 1981.33, + 1195.33 + ], + [ + 1975.33, + 1184.67 + ], + [ + 1975.33, + 1184.67 + ], + [ + 1975.33, + 1184.67 + ], + [ + 1971.33, + 1176 + ], + [ + 1971.33, + 1175.33 + ], + [ + 1971.33, + 1174.67 + ], + [ + 1966.67, + 1160.67 + ], + [ + 1966.67, + 1160 + ], + [ + 1966.67, + 1159.33 + ], + [ + 1961.33, + 1147.33 + ], + [ + 1961.33, + 1147.33 + ], + [ + 1961.33, + 1147.33 + ], + [ + 1953.33, + 1137.33 + ], + [ + 1953.33, + 1137.33 + ], + [ + 1953.33, + 1137.33 + ], + [ + 1938, + 1133.33 + ], + [ + 1937.33, + 1133.33 + ], + [ + 1936.67, + 1133.33 + ], + [ + 1916, + 1132 + ], + [ + 1915.33, + 1132 + ], + [ + 1914.67, + 1132 + ], + [ + 1885.33, + 1134 + ], + [ + 1885.33, + 1134 + ], + [ + 1885.33, + 1134 + ], + [ + 1868, + 1134 + ], + [ + 1868, + 1134 + ], + [ + 1868, + 1134 + ], + [ + 1847.33, + 1131.33 + ], + [ + 1847.33, + 1131.33 + ], + [ + 1847.33, + 1131.33 + ], + [ + 1838, + 1130 + ], + [ + 1838, + 1130 + ], + [ + 1838, + 1130 + ], + [ + 1830.67, + 1129.33 + ], + [ + 1828.67, + 1129.33 + ], + [ + 1826.67, + 1129.33 + ], + [ + 1814, + 1131.33 + ], + [ + 1814, + 1131.33 + ], + [ + 1814, + 1131.33 + ], + [ + 1806, + 1139.33 + ], + [ + 1806, + 1139.33 + ], + [ + 1806, + 1139.33 + ], + [ + 1800.67, + 1144.67 + ], + [ + 1800.67, + 1145.33 + ], + [ + 1800.67, + 1146 + ], + [ + 1794.67, + 1153.33 + ], + [ + 1794.67, + 1154 + ], + [ + 1794.67, + 1154.67 + ], + [ + 1790.67, + 1162 + ], + [ + 1790.67, + 1162 + ] + ] + } +] \ No newline at end of file diff --git a/sut/frontend/public/middle-earth-map/fonts/RingbearerMedium.ttf b/sut/frontend/public/middle-earth-map/fonts/RingbearerMedium.ttf new file mode 100644 index 0000000..5fb3a09 Binary files /dev/null and b/sut/frontend/public/middle-earth-map/fonts/RingbearerMedium.ttf differ diff --git a/sut/frontend/public/middle-earth-map/icons/castle.svg b/sut/frontend/public/middle-earth-map/icons/castle.svg new file mode 100644 index 0000000..6845cd8 --- /dev/null +++ b/sut/frontend/public/middle-earth-map/icons/castle.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sut/frontend/public/middle-earth-map/icons/close.svg b/sut/frontend/public/middle-earth-map/icons/close.svg new file mode 100644 index 0000000..b0fe363 --- /dev/null +++ b/sut/frontend/public/middle-earth-map/icons/close.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/sut/frontend/public/middle-earth-map/icons/coffee.svg b/sut/frontend/public/middle-earth-map/icons/coffee.svg new file mode 100644 index 0000000..a7a19c1 --- /dev/null +++ b/sut/frontend/public/middle-earth-map/icons/coffee.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/sut/frontend/public/middle-earth-map/icons/coffin.svg b/sut/frontend/public/middle-earth-map/icons/coffin.svg new file mode 100644 index 0000000..b4cdf8c --- /dev/null +++ b/sut/frontend/public/middle-earth-map/icons/coffin.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sut/frontend/public/middle-earth-map/icons/death.svg b/sut/frontend/public/middle-earth-map/icons/death.svg new file mode 100644 index 0000000..1dcbd58 --- /dev/null +++ b/sut/frontend/public/middle-earth-map/icons/death.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sut/frontend/public/middle-earth-map/icons/dwarf.svg b/sut/frontend/public/middle-earth-map/icons/dwarf.svg new file mode 100644 index 0000000..a501174 --- /dev/null +++ b/sut/frontend/public/middle-earth-map/icons/dwarf.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sut/frontend/public/middle-earth-map/icons/earth.svg b/sut/frontend/public/middle-earth-map/icons/earth.svg new file mode 100644 index 0000000..a498cd9 --- /dev/null +++ b/sut/frontend/public/middle-earth-map/icons/earth.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/sut/frontend/public/middle-earth-map/icons/elf.svg b/sut/frontend/public/middle-earth-map/icons/elf.svg new file mode 100644 index 0000000..0181162 --- /dev/null +++ b/sut/frontend/public/middle-earth-map/icons/elf.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sut/frontend/public/middle-earth-map/icons/evil.svg b/sut/frontend/public/middle-earth-map/icons/evil.svg new file mode 100644 index 0000000..fbeeadf --- /dev/null +++ b/sut/frontend/public/middle-earth-map/icons/evil.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sut/frontend/public/middle-earth-map/icons/eye.svg b/sut/frontend/public/middle-earth-map/icons/eye.svg new file mode 100644 index 0000000..397a774 --- /dev/null +++ b/sut/frontend/public/middle-earth-map/icons/eye.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sut/frontend/public/middle-earth-map/icons/hobbit.svg b/sut/frontend/public/middle-earth-map/icons/hobbit.svg new file mode 100644 index 0000000..a763e1c --- /dev/null +++ b/sut/frontend/public/middle-earth-map/icons/hobbit.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sut/frontend/public/middle-earth-map/icons/layers.svg b/sut/frontend/public/middle-earth-map/icons/layers.svg new file mode 100644 index 0000000..5b82a84 --- /dev/null +++ b/sut/frontend/public/middle-earth-map/icons/layers.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sut/frontend/public/middle-earth-map/icons/swords.svg b/sut/frontend/public/middle-earth-map/icons/swords.svg new file mode 100644 index 0000000..091c703 --- /dev/null +++ b/sut/frontend/public/middle-earth-map/icons/swords.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sut/frontend/public/middle-earth-map/icons/the_one_ring.ico b/sut/frontend/public/middle-earth-map/icons/the_one_ring.ico new file mode 100644 index 0000000..bf6348b Binary files /dev/null and b/sut/frontend/public/middle-earth-map/icons/the_one_ring.ico differ diff --git a/sut/frontend/public/robots.txt b/sut/frontend/public/robots.txt new file mode 100644 index 0000000..5fa602e --- /dev/null +++ b/sut/frontend/public/robots.txt @@ -0,0 +1,33 @@ +# robots.txt for Fellowship's Quest List +# Guides search engine crawlers for optimal indexing + +# Allow all robots to crawl public content +User-agent: * +Allow: / +Allow: /login +Allow: /map +Allow: /api/health +Allow: /api/status + +# Disallow private/protected routes +Disallow: /dashboard +Disallow: /quests +Disallow: /inventory +Disallow: /api/ + +# Prevent crawling of temporary files and build artifacts +Disallow: /build/ +Disallow: /__pycache__/ +Disallow: /.git/ + +# Specify sitemap location for search engines +Sitemap: https://lotr.testingfantasy.com/sitemap.xml + +# Crawl delay to respect server resources +Crawl-delay: 1 + +# Request rate limiting (following guidelines) +Request-rate: 1 request per 10 seconds + +# Comment: Fellowship's Quest List - A LOTR-themed quest tracking application +# For more information, visit: https://lotr.testingfantasy.com/ diff --git a/sut/frontend/public/sitemap.xml b/sut/frontend/public/sitemap.xml new file mode 100644 index 0000000..c88dead --- /dev/null +++ b/sut/frontend/public/sitemap.xml @@ -0,0 +1,53 @@ + + + + + %VITE_APP_SITE_URL%/ + daily + 1.0 + + + + %VITE_APP_SITE_URL%/login + weekly + 0.9 + + + + %VITE_APP_SITE_URL%/dashboard + daily + 0.9 + + + + %VITE_APP_SITE_URL%/quests + daily + 0.8 + + + + %VITE_APP_SITE_URL%/map + daily + 0.8 + + + + %VITE_APP_SITE_URL%/inventory + daily + 0.7 + + + + + %VITE_APP_SITE_URL%/api/health + hourly + 0.5 + + + + %VITE_APP_SITE_URL%/api/status + hourly + 0.5 + + diff --git a/sut/frontend/scripts/setup-env-urls.js b/sut/frontend/scripts/setup-env-urls.js new file mode 100644 index 0000000..e63d787 --- /dev/null +++ b/sut/frontend/scripts/setup-env-urls.js @@ -0,0 +1,61 @@ +/** + * Environment-aware URL setup script + * Updates sitemap.xml and index.html with the correct URLs based on VITE_APP_SITE_URL + * + * Usage: node scripts/setup-env-urls.js + * + * Environment variables: + * - VITE_APP_SITE_URL: The full site URL (e.g., https://lotr-prod.testingfantasy.com) + * If not set, defaults to http://localhost:5173 for development + */ + +const fs = require('fs'); +const path = require('path'); + +// Get the site URL from environment variable or use default for development +const siteUrl = process.env.VITE_APP_SITE_URL || 'http://localhost:5173'; + +console.log(`🌍 Setting up environment-aware URLs with: ${siteUrl}`); + +// Update sitemap.xml +const sitemapPath = path.join(__dirname, '../public/sitemap.xml'); +try { + let sitemapContent = fs.readFileSync(sitemapPath, 'utf-8'); + const originalSitemap = sitemapContent; + + // Replace all occurrences of the placeholder + sitemapContent = sitemapContent.replace(/%VITE_APP_SITE_URL%/g, siteUrl); + + if (originalSitemap !== sitemapContent) { + fs.writeFileSync(sitemapPath, sitemapContent, 'utf-8'); + console.log(`✅ Updated sitemap.xml with environment-aware URLs`); + } else { + console.log(`ℹ️ sitemap.xml already has correct URLs`); + } +} catch (error) { + console.error(`❌ Error updating sitemap.xml:`, error.message); + process.exit(1); +} + +// Update index.html +const indexPath = path.join(__dirname, '../public/index.html'); +try { + let indexContent = fs.readFileSync(indexPath, 'utf-8'); + const originalIndex = indexContent; + + // Replace all occurrences of the placeholder + indexContent = indexContent.replace(/%VITE_APP_SITE_URL%/g, siteUrl); + + if (originalIndex !== indexContent) { + fs.writeFileSync(indexPath, indexContent, 'utf-8'); + console.log(`✅ Updated index.html with environment-aware URLs`); + } else { + console.log(`ℹ️ index.html already has correct URLs`); + } +} catch (error) { + console.error(`❌ Error updating index.html:`, error.message); + process.exit(1); +} + +console.log(`\n✨ Environment setup complete!`); +console.log(`📍 Site URL: ${siteUrl}`); diff --git a/sut/frontend/src/App.css b/sut/frontend/src/App.css new file mode 100644 index 0000000..945a13d --- /dev/null +++ b/sut/frontend/src/App.css @@ -0,0 +1,639 @@ +/* LOTR Color Palette */ +:root { + /* Primary Colors */ + --parchment-light: #F4E4BC; + --parchment: #E8D5B7; + --parchment-dark: #D4C0A4; + --earth-brown: #8B4513; + --earth-brown-light: #A0522D; + --forest-green: #2D5016; + --forest-green-light: #3D6B1F; + --gold: #DAA520; + --gold-light: #FFD700; + --gold-bright: #FFF8DC; + --dark-red: #8B0000; + --dark-red-light: #A52A2A; + --deep-blue: #1A1F2E; + --deep-blue-light: #2C3E50; + + /* Status Colors */ + --status-not-yet-begun: #6B7280; + --status-road-goes-on: #F59E0B; + --status-it-is-done: #10B981; + --status-shadow-falls: #DC2626; + + /* Priority Colors */ + --priority-critical: #DC2626; + --priority-important: #F59E0B; + --priority-standard: #6B7280; + + /* Glow & Shimmer Colors */ + --gold-glow: rgba(218, 165, 32, 0.6); + --arcane-glow: #B19CD9; + --arcane-glow-rgba: rgba(177, 156, 217, 0.4); + --fire-glow: #FF6B35; + --fire-glow-rgba: rgba(255, 107, 53, 0.3); + --success-glow: #51CF66; + --success-glow-rgba: rgba(81, 207, 102, 0.3); + --danger-glow: #FF4444; + --danger-glow-rgba: rgba(255, 68, 68, 0.3); + + /* Transparency Variants */ + --earth-brown-fade: rgba(139, 69, 19, 0.1); + --earth-brown-border: rgba(139, 69, 19, 0.2); + --parchment-overlay: rgba(244, 228, 188, 0.95); + --dark-overlay: rgba(26, 31, 46, 0.85); + + /* Typography */ + --text-shadow-dm: 1px 1px 2px rgba(218, 165, 32, 0.3); + --text-shadow-glow: 0 0 10px rgba(218, 165, 32, 0.4); + + /* Quest UI Tokens */ + --quest-chip-height: 2rem; + --quest-chip-radius: 9999px; + --quest-chip-padding-x: 0.75rem; + --quest-action-min-height: 2.75rem; + --quest-action-gap: 0.65rem; +} + +/* LOTR Typography */ +@import url('https://fonts.googleapis.com/css2?family=Cinzel:wght@400;600;700&family=Lora:wght@400;600&display=swap'); + +* { + box-sizing: border-box; +} + +body { + font-family: 'Lora', serif; + background: linear-gradient(135deg, #FBF3E6 0%, #F0E5D8 50%, #F5EDE2 100%); + background-attachment: fixed; + min-height: 100vh; + margin: 0; + color: var(--earth-brown); + font-weight: 400; + line-height: 1.6; + letter-spacing: 0.3px; + position: relative; +} + +/* Atmospheric mist effect */ +body::before { + content: ''; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: radial-gradient(ellipse at 20% 50%, rgba(212, 164, 55, 0.03) 0%, transparent 50%), + radial-gradient(ellipse at 80% 80%, rgba(45, 80, 22, 0.02) 0%, transparent 50%); + pointer-events: none; + z-index: 0; +} + +h1, h2, h3, h4, h5, h6 { + font-family: 'Cinzel', serif; + font-weight: 700; + color: var(--deep-blue); + text-shadow: 0 2px 4px rgba(218, 165, 32, 0.2); + letter-spacing: 1px; + margin-top: 0; +} + +h1 { + font-size: 2.5rem; + font-weight: 700; + letter-spacing: 2px; + text-transform: uppercase; + color: var(--forest-dark); + text-shadow: 1px 1px 3px rgba(138, 43, 43, 0.15), 0 0 20px rgba(212, 164, 55, 0.1); +} + +h2 { + font-size: 1.875rem; + font-weight: 700; + letter-spacing: 1.5px; + color: var(--forest-dark); +} + +h3 { + font-size: 1.5rem; + font-weight: 600; + letter-spacing: 1px; + color: var(--deep-blue); +} + +h4 { + font-size: 1.25rem; + font-weight: 600; +} + +h5, h6 { + font-size: 1rem; + font-weight: 600; +} + +.app { + min-height: 100vh; +} + +.app-loading { + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; + color: white; + font-size: 1.5rem; +} + +.loading-spinner { + animation: pulse 1.5s ease-in-out infinite; +} + +@keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } +} + +/* Shimmer effect for buttons */ +@keyframes shimmer { + 0% { + background-position: -1000px 0; + } + 100% { + background-position: 1000px 0; + } +} + +/* Common button styles */ +.btn { + padding: 10px 20px; + border: none; + border-radius: 5px; + cursor: pointer; + font-size: 1rem; + transition: all 0.3s ease; + font-family: 'Cinzel', serif; + font-weight: 600; + position: relative; + overflow: hidden; + letter-spacing: 0.5px; + text-transform: uppercase; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); +} + +.btn::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); + animation: none; + pointer-events: none; +} + +.btn:hover::before { + animation: shimmer 0.6s ease-in-out; +} + +.btn-primary { + background-color: var(--gold); + color: var(--deep-blue); + border: 2px solid var(--earth-brown); + box-shadow: 0 4px 12px rgba(218, 165, 32, 0.4); +} + +.btn-primary:hover { + background-color: var(--gold-light); + box-shadow: 0 6px 20px rgba(218, 165, 32, 0.6), + 0 0 15px rgba(218, 165, 32, 0.3); + transform: translateY(-2px); +} + +.btn-primary:active { + transform: translateY(0); + box-shadow: 0 2px 8px rgba(218, 165, 32, 0.4); +} + +.btn-secondary { + background-color: var(--earth-brown-light); + color: var(--parchment); + border: 2px solid var(--earth-brown); + box-shadow: 0 4px 12px rgba(139, 69, 19, 0.3); +} + +.btn-secondary:hover { + background-color: var(--earth-brown); + box-shadow: 0 6px 20px rgba(139, 69, 19, 0.5), + 0 0 15px rgba(139, 69, 19, 0.2); + transform: translateY(-2px); +} + +.btn-secondary:active { + transform: translateY(0); + box-shadow: 0 2px 8px rgba(139, 69, 19, 0.3); +} + +.btn-danger { + background-color: var(--dark-red); + color: var(--parchment); + border: 2px solid var(--dark-red-light); + box-shadow: 0 4px 12px rgba(139, 0, 0, 0.3); +} + +.btn-danger:hover { + background-color: var(--dark-red-light); + box-shadow: 0 6px 20px rgba(139, 0, 0, 0.5), + 0 0 15px rgba(220, 38, 38, 0.3); + transform: translateY(-2px); +} + +.btn-danger:active { + transform: translateY(0); + box-shadow: 0 2px 8px rgba(139, 0, 0, 0.3); +} + +/* Form styles */ +.form-group { + margin-bottom: 1.5rem; +} + +.form-label { + display: block; + margin-bottom: 0.5rem; + font-weight: 600; + color: var(--deep-blue); + font-family: 'Cinzel', serif; + text-transform: uppercase; + font-size: 0.9rem; + letter-spacing: 0.5px; +} + +.form-input { + width: 100%; + padding: 0.75rem; + border: 2px solid var(--earth-brown); + border-radius: 4px; + font-size: 1rem; + background-color: var(--parchment); + color: var(--deep-blue); + font-family: 'Lora', serif; + box-shadow: inset 0 2px 4px rgba(139, 69, 19, 0.1); + transition: all 0.3s ease; +} + +.form-input:focus { + outline: none; + border-color: var(--gold); + background-color: var(--parchment-light); + box-shadow: inset 0 2px 4px rgba(139, 69, 19, 0.1), + 0 0 0 3px rgba(218, 165, 32, 0.2), + 0 0 10px rgba(218, 165, 32, 0.15); +} + +.form-input::placeholder { + color: rgba(139, 69, 19, 0.5); + font-style: italic; +} + +/* Card styles */ +.card { + background: linear-gradient(135deg, var(--parchment) 0%, var(--parchment-light) 100%); + border-radius: 8px; + padding: 1.5rem; + box-shadow: 0 4px 16px rgba(139, 69, 19, 0.2), + 0 0 1px rgba(139, 69, 19, 0.05); + margin-bottom: 1rem; + border: 2px solid var(--earth-brown); + position: relative; + overflow: hidden; + transition: all 0.3s ease; +} + +.card::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: repeating-linear-gradient( + 90deg, + transparent, + transparent 2px, + rgba(139, 69, 19, 0.03) 2px, + rgba(139, 69, 19, 0.03) 4px + ); + pointer-events: none; +} + +.card:hover { + box-shadow: 0 8px 24px rgba(139, 69, 19, 0.3), + 0 0 1px rgba(139, 69, 19, 0.05), + 0 0 15px rgba(218, 165, 32, 0.1); + transform: translateY(-2px); +} + +.card-header { + margin-bottom: 1rem; + padding-bottom: 1rem; + border-bottom: 2px solid var(--earth-brown); + display: flex; + justify-content: space-between; + align-items: center; +} + +.card-title { + font-size: 1.5rem; + font-weight: 700; + color: var(--deep-blue); + margin: 0; + font-family: 'Cinzel', serif; + letter-spacing: 1px; +} + +/* Container */ +.container { + max-width: 1200px; + margin: 0 auto; + padding: 2rem; +} + +/* Navigation */ +.navbar { + background: linear-gradient(180deg, var(--parchment-light) 0%, var(--parchment) 100%); + padding: 1rem 2rem; + box-shadow: 0 4px 12px rgba(139, 69, 19, 0.3); + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 3px solid var(--earth-brown); +} + +.navbar-brand { + font-size: 1.5rem; + font-weight: 700; + font-family: 'Cinzel', serif; + color: var(--deep-blue); + text-decoration: none; + text-shadow: 2px 2px 4px rgba(218, 165, 32, 0.3); + transition: all 0.3s ease; +} + +.navbar-brand:hover { + color: var(--earth-brown); + text-shadow: 2px 2px 6px rgba(218, 165, 32, 0.5); +} + +.navbar-nav { + display: flex; + gap: 1rem; + align-items: center; +} + +.nav-link { + color: var(--deep-blue); + text-decoration: none; + padding: 0.75rem 1rem; + border-radius: 4px; + transition: all 0.3s ease; + font-family: 'Lora', serif; + border: 2px solid transparent; +} + +.nav-link:hover { + background-color: rgba(218, 165, 32, 0.2); + border-bottom-color: var(--gold); +} + +.nav-link.active { + color: var(--gold); + border-bottom: 2px solid var(--gold); + font-weight: 600; +} + +/* Error message */ +.error-message { + background-color: #f8d7da; + color: #721c24; + padding: 1rem; + border-radius: 4px; + margin-bottom: 1rem; + border-left: 4px solid var(--dark-red); + box-shadow: 0 2px 8px rgba(220, 38, 38, 0.2); +} + +/* Success message */ +.success-message { + background-color: #d4edda; + color: #155724; + padding: 1rem; + border-radius: 4px; + margin-bottom: 1rem; + border-left: 4px solid var(--status-it-is-done); + box-shadow: 0 2px 8px rgba(16, 185, 129, 0.2); +} + +/* Small button variant */ +.btn-sm { + padding: 0.5rem 0.75rem; + font-size: 0.85rem; + min-width: auto; + max-width: none; + white-space: normal; + line-height: 1.2; + word-break: break-word; +} +/* ========== RESPONSIVE DESIGN ========== */ + +/* Tablet screens (768px - 1024px) */ +@media (max-width: 1024px) { + .container { + padding: 1.5rem; + } + + h1 { + font-size: 2rem; + } + + h2 { + font-size: 1.5rem; + } + + .navbar { + padding: 0.75rem 1.5rem; + } + + .btn { + padding: 8px 16px; + font-size: 0.95rem; + } +} + +/* Mobile screens (480px - 768px) */ +@media (max-width: 768px) { + body { + font-size: 14px; + } + + .container { + padding: 1rem; + } + + h1 { + font-size: 1.75rem; + letter-spacing: 0.5px; + } + + h2 { + font-size: 1.25rem; + } + + h3 { + font-size: 1.1rem; + } + + .navbar { + flex-direction: column; + gap: 1rem; + padding: 1rem; + } + + .navbar-brand { + font-size: 1.25rem; + } + + .navbar-nav { + width: 100%; + justify-content: space-between; + flex-wrap: wrap; + } + + .nav-link { + padding: 0.5rem 0.75rem; + font-size: 0.9rem; + } + + .btn { + padding: 8px 12px; + font-size: 0.9rem; + } + + .card { + padding: 1rem; + margin-bottom: 1rem; + } + + .card-title { + font-size: 1.25rem; + } + + .form-input, + .form-label { + font-size: 0.95rem; + } + + .form-textarea { + min-height: 80px; + } + + /* Improve touch targets for mobile */ + .btn, + .nav-link, + .form-input, + input[type="checkbox"] { + min-height: 44px; + min-width: 44px; + } +} + +/* Small mobile screens (< 480px) */ +@media (max-width: 480px) { + body { + font-size: 13px; + } + + .container { + padding: 0.75rem; + } + + h1 { + font-size: 1.5rem; + letter-spacing: 0px; + } + + h2 { + font-size: 1.1rem; + } + + h3 { + font-size: 1rem; + } + + .navbar { + padding: 0.75rem; + } + + .navbar-brand { + font-size: 1.1rem; + } + + .navbar-nav { + gap: 0.5rem; + } + + .nav-link { + padding: 0.4rem 0.6rem; + font-size: 0.85rem; + } + + .btn { + padding: 8px 10px; + font-size: 0.85rem; + min-width: 44px; + } + + .card { + padding: 0.75rem; + border-radius: 6px; + } + + .card-title { + font-size: 1.1rem; + } + + .form-group { + margin-bottom: 1rem; + } + + .form-label { + font-size: 0.85rem; + } + + .form-input { + padding: 0.6rem; + font-size: 0.9rem; + } + + /* Stack grid layouts on very small screens */ + .stats-grid, + .quest-list { + grid-template-columns: 1fr; + gap: 1rem; + } + + .navbar-nav { + flex-direction: column; + width: 100%; + } + + .nav-link { + width: 100%; + text-align: center; + } +} \ No newline at end of file diff --git a/sut/frontend/src/App.tsx b/sut/frontend/src/App.tsx new file mode 100644 index 0000000..f60bc01 --- /dev/null +++ b/sut/frontend/src/App.tsx @@ -0,0 +1,191 @@ +import React, { useEffect } from 'react'; +import { BrowserRouter, Routes, Route, Navigate, useLocation } from 'react-router-dom'; +import LoginPage from './pages/LoginPage'; +import DashboardPage from './pages/DashboardPage'; +import QuestsPage from './pages/QuestsPage'; +import MapPage from './pages/MapPage'; +import InventoryPage from './pages/InventoryPage'; +import { apiService } from './services/api'; +import { analyticsService } from './services/analyticsService'; +import { useQuestStore } from './store/questStore'; +import { useCharacterStore } from './store/characterStore'; +import { getRandomQuote } from './utils/easterEggs'; +import { User } from './types'; +import { GuidedWalkthrough } from './components/ui/GuidedWalkthrough'; +import './App.css'; +import './animations.css'; + +function App() { + const { currentUser, setCurrentUser, fetchAllData } = useQuestStore((state) => ({ + currentUser: state.currentUser, + setCurrentUser: state.setCurrentUser, + fetchAllData: state.fetchAllData, + })); + + const { isLoading } = useQuestStore((state) => ({ + isLoading: state.isLoading, + })); + + useEffect(() => { + // Check if user is already logged in + apiService + .getCurrentUser() + .then((user) => { + setCurrentUser(user); + // Set user properties in analytics after successful login + analyticsService.setUserId(user.id); + analyticsService.setUserProperties({ + [analyticsService.constructor.name]: user.username, // Map username to character name + }); + // Load all quest data after user is authenticated + fetchAllData(); + }) + .catch(() => { + setCurrentUser(null); + }) + .finally(() => { + // Display a random Tolkien quote on app load + console.log( + `%c${getRandomQuote()}`, + 'font-size: 14px; color: #DAA520; font-style: italic; font-family: Lora, serif;' + ); + }); + }, [setCurrentUser, fetchAllData]); + + const handleLogin = (user: User) => { + setCurrentUser(user); + // Set user properties in analytics after login + analyticsService.setUserId(user.id); + analyticsService.setUserProperties({ + [analyticsService.constructor.name]: user.username, + }); + fetchAllData(); + }; + + const handleLogout = async () => { + try { + await apiService.logout(); + analyticsService.trackLogout(); + } catch (error) { + console.error('Logout error:', error); + analyticsService.trackLogout(); + } finally { + setCurrentUser(null); + useCharacterStore.getState().clearDialogueHistory(); + } + }; + + return ( + + + + ); +} + +/** + * AppContent component to handle route and page view tracking + */ +function AppContent({ + currentUser, + isLoading, + onLogin, + onLogout, +}: { + currentUser: User | null; + isLoading: boolean; + onLogin: (user: User) => void; + onLogout: () => void; +}) { + const location = useLocation(); + + // Track page views when location changes + useEffect(() => { + const pageNames: Record = { + '/login': { title: 'Login' }, + '/dashboard': { title: 'The Council Chamber', trackEvent: 'trackDashboardViewed' }, + '/quests': { title: 'Quests', trackEvent: 'trackQuestsPageViewed' }, + '/map': { title: 'Middle-earth Map', trackEvent: 'trackMapViewed' }, + '/inventory': { title: 'Inventory' }, + }; + + const currentPage = pageNames[location.pathname] || { title: location.pathname }; + analyticsService.trackPageView(location.pathname, currentPage.title); + + // Track specific page events + if (currentPage.trackEvent && currentPage.trackEvent === 'trackDashboardViewed') { + analyticsService.trackDashboardViewed(); + } else if (currentPage.trackEvent && currentPage.trackEvent === 'trackQuestsPageViewed') { + analyticsService.trackQuestsPageViewed(); + } else if (currentPage.trackEvent && currentPage.trackEvent === 'trackMapViewed') { + analyticsService.trackMapViewed(); + } + }, [location]); + + return ( +
+ {isLoading && ( +
+
+
🧙‍♂️
+

Loading your Fellowship...

+
+
+ )} + + + : + } + /> + + ) : ( + + ) + } + /> + + ) : ( + + ) + } + /> + + } + /> + + ) : ( + + ) + } + /> + } /> + + {/* Disable walkthrough during tests (navigator.webdriver is true in Playwright) */} + {!navigator.webdriver && } +
+ ); +} + +export default App; diff --git a/sut/frontend/src/animations.css b/sut/frontend/src/animations.css new file mode 100644 index 0000000..c7588f4 --- /dev/null +++ b/sut/frontend/src/animations.css @@ -0,0 +1,451 @@ +/* ======================================== + LOTR Fellowship - Immersive Animations + ======================================== */ + +/* ========== PAGE TRANSITIONS ========== */ + +/* Fade in animation for page load */ +@keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Slide in from left */ +@keyframes slideInLeft { + from { + opacity: 0; + transform: translateX(-30px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +/* Slide in from right */ +@keyframes slideInRight { + from { + opacity: 0; + transform: translateX(30px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +/* Slide in from top */ +@keyframes slideInDown { + from { + opacity: 0; + transform: translateY(-20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* Slide in from bottom */ +@keyframes slideInUp { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* Scale and fade for modal/dialog entrance */ +@keyframes scaleIn { + from { + opacity: 0; + transform: scale(0.95); + } + to { + opacity: 1; + transform: scale(1); + } +} + +/* ========== SHIMMER & GLOW EFFECTS ========== */ + +/* Enhanced shimmer effect for buttons and cards */ +@keyframes shimmer { + 0% { + background-position: -1000px 0; + } + 100% { + background-position: 1000px 0; + } +} + +/* Arcane shimmer - gradient sweep across element */ +@keyframes arcaneShimmer { + 0% { + background-position: -200% center; + } + 50% { + background-position: 200% center; + } + 100% { + background-position: -200% center; + } +} + +/* Gold glow pulse - pulsing aura effect */ +@keyframes goldGlow { + 0%, 100% { + box-shadow: 0 0 5px rgba(218, 165, 32, 0.2), + 0 0 10px rgba(218, 165, 32, 0.1); + } + 50% { + box-shadow: 0 0 15px rgba(218, 165, 32, 0.5), + 0 0 25px rgba(218, 165, 32, 0.3); + } +} + +/* Danger glow pulse - red warning aura */ +@keyframes dangerGlow { + 0%, 100% { + box-shadow: 0 0 5px rgba(220, 38, 38, 0.2), + 0 0 10px rgba(220, 38, 38, 0.1); + } + 50% { + box-shadow: 0 0 15px rgba(220, 38, 38, 0.5), + 0 0 25px rgba(220, 38, 38, 0.3); + } +} + +/* Success glow pulse - green shimmer */ +@keyframes successGlow { + 0%, 100% { + box-shadow: 0 0 5px rgba(81, 207, 102, 0.2), + 0 0 10px rgba(81, 207, 102, 0.1); + } + 50% { + box-shadow: 0 0 15px rgba(81, 207, 102, 0.5), + 0 0 25px rgba(81, 207, 102, 0.3); + } +} + +/* Text glow - subtle text shadow animation */ +@keyframes textGlow { + 0%, 100% { + text-shadow: 0 0 5px rgba(218, 165, 32, 0.2); + } + 50% { + text-shadow: 0 0 15px rgba(218, 165, 32, 0.5), + 0 0 25px rgba(218, 165, 32, 0.3); + } +} + +/* ========== ELEVATION & HOVER EFFECTS ========== */ + +/* Hover lift effect - elevates elements on hover */ +@keyframes hoverLift { + from { + transform: translateY(0); + } + to { + transform: translateY(-4px); + } +} + +/* Subtle scale on hover */ +@keyframes hoverScale { + from { + transform: scale(1); + } + to { + transform: scale(1.02); + } +} + +/* ========== INTERACTIVE EFFECTS ========== */ + +/* Ripple effect on button press */ +@keyframes ripple { + 0% { + transform: scale(0); + opacity: 1; + } + 100% { + transform: scale(4); + opacity: 0; + } +} + +/* Pulse effect for important elements */ +@keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } +} + +/* Quick pulse for form validation */ +@keyframes quickPulse { + 0%, 100% { + transform: scale(1); + } + 50% { + transform: scale(1.05); + } +} + +/* Bounce effect */ +@keyframes bounce { + 0%, 100% { + transform: translateY(0); + } + 50% { + transform: translateY(-10px); + } +} + +/* Shake effect for errors */ +@keyframes shake { + 0%, 100% { + transform: translateX(0); + } + 10%, 30%, 50%, 70%, 90% { + transform: translateX(-5px); + } + 20%, 40%, 60%, 80% { + transform: translateX(5px); + } +} + +/* ========== NUMBER COUNTERS ========== */ + +/* Counter animation for stats */ +@keyframes countUp { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* ========== PARALLAX & DEPTH ========== */ + +/* Subtle parallax scroll effect */ +@keyframes parallaxFloat { + 0%, 100% { + transform: translateY(0px); + } + 50% { + transform: translateY(-5px); + } +} + +/* ========== CHARACTER ANIMATIONS ========== */ + +/* Quest completion cascade - staggered reveal */ +@keyframes cascadeReveal { + 0% { + opacity: 0; + transform: translateY(20px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + +/* Character quote entrance */ +@keyframes quoteEntrance { + 0% { + opacity: 0; + transform: scale(0.8) rotate(-2deg); + } + 100% { + opacity: 1; + transform: scale(1) rotate(0deg); + } +} + +/* ========== STATE TRANSITIONS ========== */ + +/* Smooth color transition */ +@keyframes colorShift { + 0%, 100% { + color: currentColor; + } + 50% { + color: var(--gold); + } +} + +/* Border glow on focus */ +@keyframes focusGlow { + 0% { + box-shadow: 0 0 0 0 rgba(218, 165, 32, 0.4); + } + 70% { + box-shadow: 0 0 0 10px rgba(218, 165, 32, 0); + } + 100% { + box-shadow: 0 0 0 0 rgba(218, 165, 32, 0); + } +} + +/* ========== LOADING STATES ========== */ + +/* Rotating loader */ +@keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +/* Pulsing skeleton loader */ +@keyframes skeletonPulse { + 0%, 100% { + background-color: var(--parchment); + } + 50% { + background-color: var(--parchment-light); + } +} + +/* ========== UTILITY ANIMATION CLASSES ========== */ + +.page-enter { + animation: fadeIn 0.6s ease-out; +} + +.page-enter-left { + animation: slideInLeft 0.6s ease-out; +} + +.page-enter-right { + animation: slideInRight 0.6s ease-out; +} + +.page-enter-down { + animation: slideInDown 0.5s ease-out; +} + +.page-enter-up { + animation: slideInUp 0.5s ease-out; +} + +.modal-enter { + animation: scaleIn 0.3s ease-out; +} + +/* Card hover elevation */ +.card-elevated:hover { + transform: translateY(-4px); + transition: transform 0.3s ease, box-shadow 0.3s ease; +} + +/* Ripple button class */ +.btn-ripple { + position: relative; + overflow: hidden; +} + +.btn-ripple::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 10px; + height: 10px; + background: rgba(255, 255, 255, 0.3); + border-radius: 50%; + transform: translate(-50%, -50%); + animation: ripple 0.6s ease-out; + pointer-events: none; +} + +/* Glow variants for different element types */ +.glow-gold { + animation: goldGlow 3s ease-in-out infinite; +} + +.glow-danger { + animation: dangerGlow 2s ease-in-out infinite; +} + +.glow-success { + animation: successGlow 2s ease-in-out infinite; +} + +/* Text glow class */ +.text-glow { + animation: textGlow 3s ease-in-out infinite; +} + +/* Pulse for badges and notifications */ +.pulse { + animation: pulse 2s ease-in-out infinite; +} + +/* Quick pulse for form feedback */ +.quick-pulse { + animation: quickPulse 0.4s ease-out; +} + +/* Shake effect for errors */ +.shake { + animation: shake 0.5s; +} + +/* Bounce effect */ +.bounce-in { + animation: bounce 0.6s ease-out; +} + +/* Loading spinner with shimmer */ +.loading-shimmer { + animation: arcaneShimmer 2s infinite; + background-size: 200% 100%; +} + +/* Parallax floating effect */ +.parallax-float { + animation: parallaxFloat 4s ease-in-out infinite; +} + +/* Cascade reveal for list items */ +.cascade-reveal { + animation: cascadeReveal 0.6s ease-out; +} + +/* Staggered cascade for multiple items */ +.cascade-item { + animation: cascadeReveal 0.6s ease-out backwards; +} + +.cascade-item:nth-child(1) { animation-delay: 0s; } +.cascade-item:nth-child(2) { animation-delay: 0.1s; } +.cascade-item:nth-child(3) { animation-delay: 0.2s; } +.cascade-item:nth-child(4) { animation-delay: 0.3s; } +.cascade-item:nth-child(5) { animation-delay: 0.4s; } +.cascade-item:nth-child(n+6) { animation-delay: 0.5s; } + +/* ========== ACCESSIBILITY ========== */ +/* Respect prefers-reduced-motion */ +@media (prefers-reduced-motion: reduce) { + * { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } +} diff --git a/sut/frontend/src/components/AppHeader.css b/sut/frontend/src/components/AppHeader.css new file mode 100644 index 0000000..df712a7 --- /dev/null +++ b/sut/frontend/src/components/AppHeader.css @@ -0,0 +1,489 @@ +/* ========================================================================== + AppHeader — LOTR Fantasy Modern Theme + Palette: forest greens (#0F2409 → #2D5016), gold (#DAA520 / #FFD700), + parchment (#E8D5B7 / #F4E4BC), earth brown (#8B4513) + ========================================================================== */ + +/* ── HEADER CONTAINER ── */ +.lotr-header { + position: sticky; + top: 0; + z-index: 100; + background: linear-gradient( + 180deg, + #1A3209 0%, + #1B3A0D 30%, + #2D5016 50%, + #1F3A0E 80%, + #162608 100% + ); + box-shadow: + inset 0 1px 0 rgba(255, 215, 0, 0.08), + inset 0 -1px 0 rgba(0, 0, 0, 0.3), + 0 6px 20px rgba(0, 0, 0, 0.5); + position: relative; +} + +/* Atmospheric shimmer overlay — elegant fantasy texture */ +.lotr-header::before { + content: ''; + position: absolute; + inset: 0; + background-image: + radial-gradient(circle at 10% 50%, rgba(218, 165, 32, 0.06) 0%, transparent 50%), + radial-gradient(circle at 90% 50%, rgba(218, 165, 32, 0.06) 0%, transparent 50%), + radial-gradient(circle at 50% 0%, rgba(255, 215, 0, 0.02) 0%, transparent 60%); + pointer-events: none; + z-index: 0; + animation: shimmerFlow 8s ease-in-out infinite; +} + +@keyframes shimmerFlow { + 0%, 100% { opacity: 0.6; } + 50% { opacity: 1; } +} + +/* ── top GOLD SHIMMER ACCENT LINE ── */ +.lotr-header__top-accent { + height: 1px; + background: linear-gradient( + to right, + transparent 0%, + #A67C52 20%, + #FFD700 50%, + #A67C52 80%, + transparent 100% + ); + opacity: 0.85; + box-shadow: 0 0 8px rgba(255, 215, 0, 0.3); +} + +/* ── INNER LAYOUT ── */ +.lotr-header__inner { + position: relative; + z-index: 1; + max-width: 90rem; + margin: 0 auto; + padding: 0.75rem 1.75rem; + display: flex; + align-items: center; + gap: 1.5rem; + min-width: 0; +} + +/* ── BRAND ── */ +.lotr-header__brand { + display: flex; + align-items: center; + gap: 0.75rem; + flex-shrink: 0; + text-decoration: none; + min-width: 0; + max-width: 380px; +} + +.lotr-header__ring-wrap { + display: flex; + align-items: center; + filter: drop-shadow(0 0 8px rgba(218, 165, 32, 0.6)); + transition: filter 0.4s ease; + cursor: default; +} + +.lotr-header__ring-wrap:hover { + filter: drop-shadow(0 0 16px rgba(255, 215, 0, 0.9)); +} + +/* Slow pulse glow on the ring SVG */ +.lotr-header__ring-svg { + animation: ringPulse 5s ease-in-out infinite; +} + +@keyframes ringPulse { + 0%, 100% { + opacity: 1; + filter: drop-shadow(0 0 4px rgba(218, 165, 32, 0.5)); + } + 50% { + opacity: 0.95; + filter: drop-shadow(0 0 12px rgba(255, 215, 0, 0.85)); + } +} + + +/* Brand text: more prominent, fantasy style */ +.lotr-header__brand-text { + display: flex; + flex-direction: column; + line-height: 1.05; + gap: 0.05em; + min-width: 0; + flex: 0 1 auto; +} + + +.lotr-header__subtitle { + font-family: 'Cinzel', serif; + font-size: 0.7rem; + font-weight: 600; + letter-spacing: 0.35em; + text-transform: uppercase; + color: #FFD700; + opacity: 0.9; + user-select: none; + text-shadow: + 0 1px 2px rgba(0, 0, 0, 0.7), + 0 0 8px rgba(218, 165, 32, 0.3); +} + + +.lotr-header__page-title { + font-family: 'Uncial Antiqua', 'Cinzel', serif; + font-size: 1.65rem; + font-weight: 800; + color: #FFF8DC; + letter-spacing: 0.08em; + margin: 0; + line-height: 1.1; + text-shadow: + 0 2px 4px rgba(0, 0, 0, 0.6), + 0 0 12px rgba(218, 165, 32, 0.25), + 0 0 24px rgba(218, 165, 32, 0.1); + filter: drop-shadow(0 1px 3px #1A320966); + min-width: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/* ── DIVIDER between brand and nav ── */ +.lotr-header__brand::after { + content: ''; + display: block; + width: 1px; + height: 2.2rem; + background: linear-gradient( + to bottom, + transparent 0%, + rgba(255, 215, 0, 0.3) 20%, + rgba(255, 215, 0, 0.5) 50%, + rgba(255, 215, 0, 0.3) 80%, + transparent 100% + ); + margin-left: 1.25rem; + margin-right: 0.25rem; + flex-shrink: 0; + box-shadow: 0 0 8px rgba(218, 165, 32, 0.2); +} + +/* ── NAVIGATION ── */ +.lotr-header__nav { + display: flex; + align-items: center; + gap: 0.1rem; + flex: 1; + justify-content: center; +} + +/* ── NAV LINK ── */ +.lotr-nav-link { + display: inline-flex; + align-items: center; + gap: 0.4rem; + padding: 0.45rem 1rem; + border-radius: 0.5rem; + font-family: 'Lora', serif; + font-size: 0.95rem; + font-weight: 500; + color: #E8D5B7; + text-decoration: none; + white-space: nowrap; + position: relative; + transition: + color 0.25s cubic-bezier(0.34, 1.56, 0.64, 1), + background-color 0.25s ease, + transform 0.2s ease; + border-bottom: 2px solid transparent; +} + +/* Animated gold underline */ +.lotr-nav-link::after { + content: ''; + position: absolute; + bottom: -2px; + left: 50%; + transform: translateX(-50%); + width: 0; + height: 2px; + border-radius: 9999px; + background: linear-gradient(to right, transparent, #FFD700, transparent); + transition: width 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); + box-shadow: 0 0 8px rgba(255, 215, 0, 0.3); +} + +.lotr-nav-link:hover { + color: #FFD700; + background-color: rgba(218, 165, 32, 0.12); + transform: translateY(-2px); +} + +.lotr-nav-link:hover::after { + width: 60%; +} + +/* Active state */ +.lotr-nav-link--active { + color: #FFD700 !important; + background-color: rgba(218, 165, 32, 0.16) !important; + border-bottom: 2px solid #FFD700; +} + +.lotr-nav-link--active::after { + width: 60%; + opacity: 0; +} + +.lotr-nav-link:focus-visible { + outline: 2px solid #FFD700; + outline-offset: 3px; +} + +.lotr-nav-link__icon { + font-size: 1rem; + flex-shrink: 0; + transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); +} + +.lotr-nav-link:hover .lotr-nav-link__icon { + transform: scale(1.15) rotate(-5deg); +} + + +/* ── CONTROLS (scoring card + logout) ── */ +.lotr-header__controls { + display: flex; + align-items: center; + gap: 1.2rem; + flex-shrink: 0; + min-width: auto; +} + + +/* Subtle fantasy logout button override */ +.lotr-logout-btn { + border: 1.5px solid rgba(255, 215, 0, 0.55) !important; + background: linear-gradient(135deg, #2D5016 0%, #1F3A0E 100%); + color: #FFD700 !important; + font-family: 'Cinzel', serif; + font-size: 1rem; + font-weight: 600; + letter-spacing: 0.1em; + box-shadow: + 0 2px 8px rgba(218, 165, 32, 0.15), + inset 0 1px 0 rgba(255, 215, 0, 0.1); + transition: + all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); +} + +.lotr-logout-btn:hover { + border-color: #FFF8DC !important; + background: linear-gradient(135deg, #243A12 0%, #2D5016 100%); + color: #FFF8DC !important; + box-shadow: + 0 4px 16px rgba(255, 215, 0, 0.35), + inset 0 1px 0 rgba(255, 215, 0, 0.2); + transform: translateY(-2px); +} + +/* ── HAMBURGER (mobile only) ── */ +.lotr-hamburger { + display: none; /* shown via media query below */ + flex-direction: column; + justify-content: center; + align-items: center; + gap: 5px; + width: 2.5rem; + height: 2.5rem; + padding: 0.5rem; + border-radius: 0.5rem; + border: 1.5px solid rgba(218, 165, 32, 0.45); + background: rgba(26, 50, 9, 0.6); + cursor: pointer; + flex-shrink: 0; + transition: + all 0.25s ease; +} + +.lotr-hamburger:hover { + background: rgba(26, 50, 9, 0.9); + border-color: rgba(255, 215, 0, 0.65); + box-shadow: 0 0 12px rgba(218, 165, 32, 0.2); +} + +.lotr-hamburger:focus-visible { + outline: 2px solid #FFD700; + outline-offset: 2px; +} + +.lotr-hamburger__bar { + display: block; + width: 18px; + height: 2px; + background-color: #E8D5B7; + border-radius: 9999px; + transition: + transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1), + opacity 0.2s ease, + background-color 0.25s ease; +} + +.lotr-hamburger--open .lotr-hamburger__bar:nth-child(1) { + transform: translateY(7px) rotate(45deg); + background-color: #FFD700; +} + +.lotr-hamburger--open .lotr-hamburger__bar:nth-child(2) { + opacity: 0; + transform: scaleX(0); +} + +.lotr-hamburger--open .lotr-hamburger__bar:nth-child(3) { + transform: translateY(-7px) rotate(-45deg); + background-color: #FFD700; +} + +/* ── ELVISH WAVY BORDER BOTTOM ── */ +.lotr-header__elvish-border { + position: relative; + height: 16px; + overflow: visible; + pointer-events: none; +} + +.lotr-header__border-svg { + width: 100%; + height: 16px; + display: block; + filter: drop-shadow(0 1px 3px rgba(0, 0, 0, 0.25)); +} + +/* Decorative gem cluster centred on the border */ +.lotr-header__gems { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-size: 0.5rem; + color: #FFD700; + letter-spacing: 0.8rem; + opacity: 0.75; + user-select: none; + white-space: nowrap; + text-shadow: 0 0 6px rgba(255, 215, 0, 0.5); +} + + +/* ── RESPONSIVE — MOBILE (< 768 px) ── */ +@media (max-width: 767px) { + .lotr-header__inner { + padding: 0.6rem 0.75rem; + flex-wrap: wrap; + row-gap: 0.3rem; + } + + /* Brand takes remaining space on first row */ + .lotr-header__brand { + flex: 1; + } + + /* Nav hidden by default on mobile */ + .lotr-header__nav { + display: none; + order: 10; /* below hamburger row */ + width: 100%; + flex-direction: column; + align-items: flex-start; + gap: 0.1rem; + padding-top: 0.45rem; + border-top: 1px solid rgba(218, 165, 32, 0.15); + margin-top: 0.3rem; + animation: mobileNavIn 220ms cubic-bezier(0.34, 1.56, 0.64, 1) forwards; + } + + /* Controls hidden by default on mobile */ + .lotr-header__controls { + display: none; + order: 11; + width: 100%; + flex-direction: column; + align-items: stretch; + gap: 0.55rem; + padding-top: 0.45rem; + padding-bottom: 0.2rem; + border-top: 1px solid rgba(218, 165, 32, 0.12); + margin-top: 0.2rem; + animation: mobileNavIn 240ms cubic-bezier(0.34, 1.56, 0.64, 1) forwards; + } + + /* When menu is open: reveal nav and controls */ + .lotr-header--menu-open .lotr-header__nav, + .lotr-header--menu-open .lotr-header__controls { + display: flex; + } + + /* Show hamburger on mobile */ + .lotr-hamburger { + display: flex; + } + + /* Full-width nav links on mobile */ + .lotr-nav-link { + width: 100%; + padding: 0.55rem 0.8rem; + font-size: 1.05rem; + border-radius: 0.5rem; + } + + /* Logout fills width on mobile */ + .lotr-logout-btn { + width: 100% !important; + justify-content: center; + text-align: center; + padding: 0.7rem 1rem !important; + } + + /* Hide brand divider on mobile */ + .lotr-header__brand::after { + display: none; + } +} + +/* ── SLIDE-IN ANIMATION FOR MOBILE MENU ── */ +@keyframes mobileNavIn { + from { + opacity: 0; + transform: translateY(-8px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* ── DESKTOP ADJUSTMENTS ── */ +@media (min-width: 768px) { + /* Ensure hamburger stays hidden on desktop */ + .lotr-hamburger { + display: none !important; + } + + /* Ensure controls are always visible on desktop */ + .lotr-header__controls { + display: flex !important; + } + + /* Ensure nav is always visible on desktop */ + .lotr-header__nav { + display: flex !important; + } +} diff --git a/sut/frontend/src/components/AppHeader.tsx b/sut/frontend/src/components/AppHeader.tsx new file mode 100644 index 0000000..8b5b6d0 --- /dev/null +++ b/sut/frontend/src/components/AppHeader.tsx @@ -0,0 +1,195 @@ +/** + * AppHeader Component + * LOTR-themed unified header with navigation, page title, and user stats. + * Fantasy-modern design: elvish border, ring icon, gold shimmer accents, + * responsive hamburger menu for mobile. + * + * Used across all main pages (Dashboard, Quests, Map, Inventory). + */ + +import React, { useState } from 'react'; +import { Link } from 'react-router-dom'; +import { Button } from './ui/Button'; +import ScoringCard from './ScoringCard'; +import './AppHeader.css'; + +interface AppHeaderProps { + page: 'dashboard' | 'quests' | 'map' | 'inventory'; + gold: number; + completedQuests: number; + averageSavings?: number | null; + onLogout: () => void; +} + +/** SVG ring icon — the One Ring as a minimal emblem */ +const RingIcon: React.FC = () => ( + +); + +const PAGE_CONFIG: Record = { + dashboard: { title: 'Dashboard', icon: '🏰' }, + quests: { title: 'Quests', icon: '📜' }, + map: { title: 'Middle-Earth Map', icon: '🗺️' }, + inventory: { title: 'Inventory', icon: '🎒' }, +}; + +interface NavLink { + to: string; + label: string; + icon: string; + pageKey: 'dashboard' | 'quests' | 'map' | 'inventory'; +} + +const NAV_LINKS: NavLink[] = [ + { to: '/dashboard', label: 'Dashboard', icon: '🏰', pageKey: 'dashboard' }, + { to: '/quests', label: 'Quests', icon: '📜', pageKey: 'quests' }, + { to: '/map', label: 'Middle-Earth Map', icon: '🗺️', pageKey: 'map' }, + { to: '/inventory', label: 'Inventory', icon: '🎒', pageKey: 'inventory' }, +]; + +const AppHeader: React.FC = ({ + page, + gold, + completedQuests, + averageSavings, + onLogout, +}) => { + const [isMenuOpen, setIsMenuOpen] = useState(false); + + const currentPage = PAGE_CONFIG[page] ?? PAGE_CONFIG.dashboard; + + return ( +
+ {/* Top gold shimmer accent line */} +
+ ); +}; + +export default AppHeader; diff --git a/sut/frontend/src/components/CompletedQuestCounter.tsx b/sut/frontend/src/components/CompletedQuestCounter.tsx new file mode 100644 index 0000000..d7120fc --- /dev/null +++ b/sut/frontend/src/components/CompletedQuestCounter.tsx @@ -0,0 +1,51 @@ +/** + * Completed Quest Counter - Displays completed quest count with animation + */ + +import React, { useEffect, useState } from 'react'; +import { motion } from 'framer-motion'; + +interface CompletedQuestCounterProps { + completedCount: number; +} + +export const CompletedQuestCounter: React.FC = ({ completedCount }) => { + const [prevCount, setPrevCount] = useState(completedCount); + const [hasIncreased, setHasIncremented] = useState(false); + + useEffect(() => { + if (completedCount > prevCount) { + setHasIncremented(true); + const timer = setTimeout(() => { + setHasIncremented(false); + }, 600); + setPrevCount(completedCount); + return () => clearTimeout(timer); + } + setPrevCount(completedCount); + }, [completedCount, prevCount]); + + return ( + + 🏆 +
+ Quests Complete + + {completedCount} + +
+
+ ); +}; + +export default CompletedQuestCounter; diff --git a/sut/frontend/src/components/Dashboard.css b/sut/frontend/src/components/Dashboard.css new file mode 100644 index 0000000..e55836d --- /dev/null +++ b/sut/frontend/src/components/Dashboard.css @@ -0,0 +1,202 @@ +.dashboard { + padding: 2rem; + animation: fadeIn 0.8s ease-out; +} + +.dashboard-header { + margin-bottom: 2rem; + text-align: center; + color: var(--deep-blue); + animation: slideInDown 0.6s ease-out; +} + +.dashboard-header h1 { + font-size: 2.5rem; + margin-bottom: 0.5rem; + font-family: 'Cinzel', serif; + font-weight: 700; + color: var(--deep-blue); + letter-spacing: 1.5px; + text-transform: uppercase; + text-shadow: var(--text-shadow-dm); +} + +.dashboard-subtitle { + font-size: 1.2rem; + color: var(--earth-brown); + font-family: 'Lora', serif; + font-style: italic; + letter-spacing: 0.3px; +} + +.stats-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 1.5rem; + margin-bottom: 2rem; + animation: fadeIn 0.8s ease-out 0.2s both; +} + +.stat-card { + background: linear-gradient(135deg, var(--parchment-light) 0%, var(--parchment) 100%); + border-radius: 8px; + padding: 1.5rem; + text-align: center; + box-shadow: 0 4px 16px rgba(45, 80, 22, 0.15); + border: 2px solid var(--gold-dark); + transition: all 0.3s ease; + animation: cascade-item; +} + +.stat-card:hover { + transform: translateY(-4px); + box-shadow: 0 12px 32px rgba(45, 80, 22, 0.25), + 0 0 15px rgba(218, 165, 32, 0.15); + border-color: var(--gold); +} + +.stat-value { + font-size: 2.5rem; + font-weight: 700; + color: var(--gold); + margin-bottom: 0.5rem; + font-family: 'Cinzel', serif; + text-shadow: var(--text-shadow-dm); + letter-spacing: 1px; +} + +.stat-label { + font-size: 1rem; + color: var(--earth-brown); + font-weight: 600; + font-family: 'Lora', serif; + letter-spacing: 0.5px; +} + +.dashboard-section { + background: var(--parchment); + border-radius: 8px; + padding: 2rem; + box-shadow: 0 2px 8px rgba(139, 69, 19, 0.2); + border: 2px solid var(--earth-brown); + margin-bottom: 2rem; +} + +.dashboard-section h2 { + margin-bottom: 1.5rem; + color: var(--deep-blue); + font-family: 'Cinzel', serif; + font-weight: 700; +} + +.dark-magic-warning { + background: linear-gradient(135deg, #2a1a1a 0%, #3d2525 100%); + color: var(--parchment); + padding: 1rem 1.5rem; + border-radius: 8px; + margin-bottom: 2rem; + border: 2px solid var(--dark-red); + box-shadow: 0 0 10px rgba(220, 38, 38, 0.5), + 0 0 20px rgba(220, 38, 38, 0.2); + font-family: 'Lora', serif; + font-weight: 600; + animation: dangerGlow 2s ease-in-out infinite; + letter-spacing: 0.5px; +} + +.user-stats { + display: flex; + gap: 2rem; + margin-top: 1rem; +} + +.user-stat-item { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.user-stat-label { + font-size: 0.9rem; + color: var(--earth-brown); + font-family: 'Lora', serif; +} + +.user-stat-value { + font-size: 1.5rem; + font-weight: 700; + color: var(--gold); + font-family: 'Cinzel', serif; +} + +.quest-list { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.quest-item { + padding: 1rem; + border: 2px solid var(--earth-brown); + border-radius: 6px; + background: linear-gradient(135deg, var(--parchment) 0%, var(--parchment-light) 100%); + transition: all 0.3s ease; + animation: cascade-item; +} + +.quest-item:hover { + box-shadow: 0 4px 12px rgba(139, 69, 19, 0.3), + 0 0 10px rgba(218, 165, 32, 0.1); + transform: translateY(-2px); +} + +.quest-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.5rem; +} + +.quest-header h3 { + margin: 0; + color: var(--deep-blue); + font-size: 1.2rem; + font-family: 'Cinzel', serif; + font-weight: 600; +} + +.quest-status { + padding: 0.25rem 0.75rem; + border-radius: 12px; + font-size: 0.85rem; + font-weight: 600; + text-transform: capitalize; +} + +.quest-status-pending { + background-color: #fff3cd; + color: #856404; +} + +.quest-status-in_progress { + background-color: #d1ecf1; + color: #0c5460; +} + +.quest-status-completed { + background-color: #d4edda; + color: #155724; +} + +.quest-description { + color: var(--earth-brown); + margin: 0.5rem 0; + font-family: 'Lora', serif; +} + +.quest-location { + color: var(--earth-brown-light); + font-size: 0.9rem; + margin-top: 0.5rem; + font-family: 'Lora', serif; +} diff --git a/sut/frontend/src/components/Dashboard.tsx b/sut/frontend/src/components/Dashboard.tsx new file mode 100644 index 0000000..9f1cbf2 --- /dev/null +++ b/sut/frontend/src/components/Dashboard.tsx @@ -0,0 +1,336 @@ +import React, { useMemo, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { Quest, Member } from '../types'; +import { Card } from './ui/Card'; +import { Alert } from './ui/Alert'; +import { Badge } from './ui/Badge'; +import { Button } from './ui/Button'; +import { CharacterPanel } from './characters/CharacterPanel'; +import { getMissionObjective } from '../utils/missionObjective'; +import { motion } from 'framer-motion'; + +interface DashboardProps { + quests: Quest[]; + members: Member[]; + user: { username: string; role: string }; +} + +const Dashboard: React.FC = ({ quests, members, user }) => { + const navigate = useNavigate(); + const [selectedStatus, setSelectedStatus] = useState(null); + + // Helper function to check if status matches (handles both old and new values) + const matchesStatus = (quest: Quest, statuses: string[]): boolean => { + return statuses.includes(quest.status); + }; + + // Helper function to get status display text + const getStatusText = (status: string): string => { + if (status === 'not_yet_begun' || status === 'pending') { + return 'Not Yet Begun'; + } + if (status === 'the_road_goes_ever_on' || status === 'in_progress') { + return 'The Road Goes Ever On...'; + } + if (status === 'it_is_done' || status === 'completed') { + return 'It Is Done'; + } + if (status === 'the_shadow_falls' || status === 'blocked') { + return 'The Shadow Falls'; + } + return String(status).replace(/_/g, ' '); + }; + + const stats = { + total: quests.length, + notYetBegun: quests.filter(q => matchesStatus(q, ['not_yet_begun', 'pending'])).length, + inProgress: quests.filter(q => matchesStatus(q, ['the_road_goes_ever_on', 'in_progress'])).length, + completed: quests.filter(q => matchesStatus(q, ['it_is_done', 'completed'])).length, + shadowFalls: quests.filter(q => matchesStatus(q, ['the_shadow_falls', 'blocked'])).length, + darkMagic: quests.filter(q => q.is_dark_magic).length, + }; + + const activeMembers = members.filter(m => m.status === 'active').length; + const userQuests = quests.filter(q => q.assignee_name === user.role || q.assigned_to); + const userCompleted = userQuests.filter(q => matchesStatus(q, ['it_is_done', 'completed'])).length; + const completionRate = quests.length > 0 ? Math.round((stats.completed / quests.length) * 100) : 0; + + // Filter displayed quests based on selected status + const displayedQuests = selectedStatus + ? quests.filter(q => q.status === selectedStatus) + : quests.slice(0, 8); + + const missionObjective = useMemo(() => getMissionObjective(quests), [quests]); + + const containerVariants = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { + staggerChildren: 0.1, + delayChildren: 0.2, + }, + }, + }; + + const itemVariants = { + hidden: { opacity: 0, y: 20 }, + visible: { + opacity: 1, + y: 0, + transition: { duration: 0.5, ease: 'easeOut' }, + }, + }; + + return ( +
+
+ {/* Header Section */} + +
+
+ +

+ Welcome, {user.role}! Track the Fellowship's journey through Middle-earth +

+
+
+
+ + {/* Dark Magic Warning */} + {stats.darkMagic > 0 && ( + + + {stats.darkMagic} quest{stats.darkMagic !== 1 ? 's have' : ' has'} been corrupted by Sauron's influence. + + + )} + + {/* Mission Briefing */} + + +
+
+

Mission Briefing

+

{missionObjective.title}

+

{missionObjective.description}

+
+ +
+
+ +
+
+
+ + {/* Stats Grid */} + + {/* Total Quests */} + + +
+
{stats.total}
+
Total Quest Objectives
+
+ All Quests +
+
+
+
+ + {/* In Progress */} + + setSelectedStatus('the_road_goes_ever_on')} + > +
+
{stats.inProgress}
+
The Road Goes Ever On...
+
+ In Progress +
+
+
+
+ + {/* Completed */} + + setSelectedStatus('it_is_done')} + > +
+
{stats.completed}
+
It Is Done
+
+ Completed +
+
+
+
+ + {/* Not Yet Begun */} + + +
+
{stats.notYetBegun}
+
Not Yet Begun
+
+ Planned +
+
+
+
+ + {/* Blocked */} + + +
+
{stats.shadowFalls}
+
The Shadow Falls
+
+ Blocked +
+
+
+
+ + {/* Fellowship Members */} + + +
+
{activeMembers}
+
Active Fellowship Members
+
+
+
+
+ + {/* User Personal Stats */} + {userQuests.length > 0 && ( + + +
+

Your Personal Journey

+
+
+
{userQuests.length}
+
Assigned to You
+
+
+
{userCompleted}
+
Completed
+
+
+
{completionRate}%
+
Completion Rate
+
+
+
+
+
+ )} + + {/* Recent/Filtered Quests */} + +
+
+

+ {selectedStatus ? 'Filtered Quests' : 'Recent Quest Objectives'} +

+ {selectedStatus && ( + + )} +
+ + + {displayedQuests.length > 0 ? ( + displayedQuests.map((quest, index) => ( + + +
+
+
+

{quest.title}

+

{quest.description}

+
+ + {getStatusText(quest.status)} + +
+
+ {quest.location_name && ( + 📍 {quest.location_name} + )} + {quest.priority && ( + ⚡ Priority: {quest.priority} + )} +
+
+
+
+ )) + ) : ( +
+

No quests found with current criteria

+
+ )} +
+
+
+ + {/* Clear Selection Footer */} + {selectedStatus && ( + + Showing {displayedQuests.length} of {quests.length} quests + + )} +
+ +
+ +
+
+ ); +}; + +export default Dashboard; diff --git a/sut/frontend/src/components/GoldCounter.tsx b/sut/frontend/src/components/GoldCounter.tsx new file mode 100644 index 0000000..11b533d --- /dev/null +++ b/sut/frontend/src/components/GoldCounter.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +interface GoldCounterProps { + gold: number; +} + +const GoldCounter: React.FC = ({ gold }) => { + return ( +
+ Gold: {gold} +
+ ); +}; + +export default GoldCounter; diff --git a/sut/frontend/src/components/Login.css b/sut/frontend/src/components/Login.css new file mode 100644 index 0000000..6a504a4 --- /dev/null +++ b/sut/frontend/src/components/Login.css @@ -0,0 +1,93 @@ +.login-container { + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; + padding: 2rem; + animation: fadeIn 0.6s ease-out; + position: relative; + overflow: hidden; +} + +.login-container::before { + content: ''; + position: absolute; + top: -50%; + right: -50%; + width: 200%; + height: 200%; + background: radial-gradient(circle, var(--gold-glow) 0%, transparent 70%); + opacity: 0.05; + animation: parallaxFloat 6s ease-in-out infinite; + pointer-events: none; +} + +.login-card { + background: linear-gradient(135deg, var(--parchment-light) 0%, var(--parchment) 100%); + border-radius: 12px; + padding: 3rem; + box-shadow: 0 10px 40px rgba(139, 69, 19, 0.4), + 0 0 30px rgba(218, 165, 32, 0.15); + border: 3px solid var(--earth-brown); + max-width: 450px; + width: 100%; + animation: scaleIn 0.6s ease-out; + position: relative; + z-index: 1; +} + +.login-title { + font-size: 2rem; + font-weight: 700; + font-family: 'Cinzel', serif; + color: var(--deep-blue); + text-align: center; + margin-bottom: 0.5rem; + letter-spacing: 1px; + text-transform: uppercase; + text-shadow: var(--text-shadow-dm); +} + +.login-subtitle { + text-align: center; + color: var(--earth-brown); + margin-bottom: 2rem; + font-family: 'Lora', serif; + font-style: italic; + letter-spacing: 0.3px; +} + +.login-form { + margin-bottom: 1.5rem; + animation: slideInUp 0.6s ease-out 0.2s both; +} + +.login-button { + width: 100%; + margin-top: 1rem; + padding: 12px; + font-size: 1.1rem; + text-transform: uppercase; + letter-spacing: 1px; +} + +.login-button:hover { + box-shadow: 0 8px 24px rgba(218, 165, 32, 0.5), + 0 0 20px rgba(218, 165, 32, 0.3); +} + +.login-hint { + margin-top: 2rem; + padding-top: 1.5rem; + border-top: 2px solid var(--earth-brown-fade); + text-align: center; + font-size: 0.9rem; + color: var(--earth-brown); + font-family: 'Lora', serif; + animation: slideInUp 0.6s ease-out 0.3s both; +} + +.login-hint p { + margin: 0.5rem 0; + line-height: 1.6; +} diff --git a/sut/frontend/src/components/Login.tsx b/sut/frontend/src/components/Login.tsx new file mode 100644 index 0000000..2a9573c --- /dev/null +++ b/sut/frontend/src/components/Login.tsx @@ -0,0 +1,194 @@ +import React, { useState, FormEvent } from 'react'; +import { apiService } from '../services/api'; +import { analyticsService } from '../services/analyticsService'; +import { SutStatus, User } from '../types'; +import { Alert, Button, Input } from './ui'; + +interface LoginProps { + onLogin: (user: User) => void; +} + +const Login: React.FC = ({ onLogin }) => { + const [mode, setMode] = useState<'login' | 'signup'>('login'); + const [username, setUsername] = useState(''); + const [password, setPassword] = useState(''); + const [email, setEmail] = useState(''); + const [showPassword, setShowPassword] = useState(false); + const [rememberMe, setRememberMe] = useState(true); + const [error, setError] = useState(''); + const [status, setStatus] = useState(null); + const [loading, setLoading] = useState(false); + + React.useEffect(() => { + apiService + .getSutStatus() + .then((response) => setStatus(response)) + .catch(() => setStatus(null)); + }, []); + + const handleSubmit = async (e: FormEvent) => { + e.preventDefault(); + setError(''); + setLoading(true); + + try { + console.log('Login: Starting login attempt for mode:', mode); + const response = + mode === 'signup' + ? await apiService.signup({ username, password, email: email || undefined }) + : await apiService.login({ username, password }); + + console.log('Login: API response received:', response); + + // Track authentication event + if (mode === 'signup') { + analyticsService.trackSignup(username); + } else { + analyticsService.trackLogin(username); + } + + // Call onLogin to update app state + onLogin(response.user); + console.log('Login: onLogin callback completed, navigating to dashboard'); + + // Navigate to dashboard using window.location to ensure navigation happens + // This bypasses React Router and forces a hard navigation + const baseUrl = window.location.pathname.includes('/login') ? window.location.origin : window.location.href; + console.log('Login: Setting window.location to /dashboard'); + window.location.href = baseUrl + '/dashboard'; + } catch (err: any) { + console.error('Login: Error during login/signup:', err); + setLoading(false); + const backendError = err.response?.data?.error; + if (mode === 'signup' && backendError === 'Username already exists') { + setError('Username already exists. Please choose a different username.'); + } else { + setError(backendError || (mode === 'signup' ? 'Signup failed. Please try again.' : 'Invalid credentials. Please try again.')); + } + } + // Note: Not calling setLoading(false) here - page will reload due to window.location.href + }; + + const formatUtc = (value: string | null | undefined): string => { + if (!value) { + return 'Unavailable'; + } + + const parsed = new Date(value); + if (Number.isNaN(parsed.getTime())) { + return value; + } + + return parsed.toLocaleString(); + }; + + return ( +
+
+

Enter the Fellowship

+

One does not simply walk into Middle-earth without credentials.

+ +
+ + +
+ + {error && ( + + {error} + + )} + +
+ setUsername(event.target.value)} + required + placeholder="e.g., frodo_baggins" + autoComplete="username" + /> + + {mode === 'signup' && ( + setEmail(event.target.value)} + placeholder="traveler@example.com" + autoComplete="email" + /> + )} + +
+ setPassword(event.target.value)} + required + placeholder="Enter your password" + autoComplete="current-password" + /> + {mode === 'signup' && ( +

+ Password requirements: minimum 8 characters and at least 1 number. +

+ )} + +
+ + + + +
+ +
+

+ Default password: fellowship123 +

+

+ Try: frodo_baggins, samwise_gamgee, aragorn, legolas, gimli, gandalf +

+

+ Last SUT restart (instance): {formatUtc(status?.instance_boot_time_utc)} +

+
+
+
+ ); +}; + +export default Login; diff --git a/sut/frontend/src/components/MiddleEarthMap.css b/sut/frontend/src/components/MiddleEarthMap.css new file mode 100644 index 0000000..7b3b635 --- /dev/null +++ b/sut/frontend/src/components/MiddleEarthMap.css @@ -0,0 +1,519 @@ +/* Middle-earth Map Component Styles */ +@import 'leaflet/dist/leaflet.css'; +/* Import markercluster CSS from package (no tilde for CRA) */ +@import 'leaflet.markercluster/dist/MarkerCluster.css'; + +.middle-earth-map-container { + width: 100%; + height: 100%; + min-height: 500px; + background-color: var(--color-parchment-dark, #E8D5B7); + border: 2px solid var(--color-earth-brown-medium, #A0522D); + border-radius: 8px; + overflow: hidden; + position: relative; +} + +/* Override Leaflet default styles with LOTR theme */ +.middle-earth-map-container .leaflet-container { + background-color: var(--color-parchment-light, #F4E4BC); + font-family: 'Lora', serif; +} + +.middle-earth-map-container .leaflet-popup-content-wrapper { + background: var(--color-parchment-light, #F4E4BC); + border: 2px solid var(--color-earth-brown-medium, #A0522D); + border-radius: 8px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); + color: var(--color-deep-blue-dark, #1A1F2E); +} + +.middle-earth-map-container .leaflet-popup-content { + margin: 12px; + font-family: 'Lora', serif; +} + +.middle-earth-map-container .leaflet-popup-tip { + background: var(--color-parchment-light, #F4E4BC); + border: 1px solid var(--color-earth-brown-medium, #A0522D); +} + +.middle-earth-map-container .leaflet-control-zoom { + border: 2px solid var(--color-earth-brown-medium, #A0522D); + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); +} + +.middle-earth-map-container .leaflet-control-zoom a { + background-color: var(--color-parchment-light, #F4E4BC); + color: var(--color-earth-brown-dark, #8B4513); + border-bottom: 1px solid var(--color-earth-brown-medium, #A0522D); +} + +.middle-earth-map-container .leaflet-control-zoom a:hover { + background-color: var(--color-parchment-dark, #E8D5B7); + color: var(--color-gold-dark, #FFD700); +} + +/* Custom marker styling */ +.custom-marker-icon { + background: transparent; + border: none; +} + +/* Location marker with quest count */ +.location-marker-icon { + background: transparent; + border: none; +} + +.location-marker { + width: 40px; + height: 40px; + border-radius: 50% 50% 50% 0; + transform: rotate(-45deg); + border: 3px solid var(--color-parchment-light, #F4E4BC); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4); + position: relative; + cursor: pointer; + transition: transform 0.2s ease, box-shadow 0.2s ease; +} + +.location-marker:hover { + transform: rotate(-45deg) scale(1.2); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.6); + z-index: 1000; +} + +.marker-pin-inner { + width: 12px; + height: 12px; + border-radius: 50%; + background-color: var(--color-parchment-light, #F4E4BC); + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + border: 2px solid rgba(255, 255, 255, 0.8); +} + +/* Quest count badge on marker */ +.quest-count-badge { + position: absolute; + top: -10px; + right: -10px; + background-color: var(--color-gold-dark, #FFD700); + color: var(--color-earth-brown-dark, #8B4513); + border-radius: 50%; + width: 24px; + height: 24px; + display: flex; + align-items: center; + justify-content: center; + font-size: 11px; + font-weight: bold; + border: 2px solid var(--color-parchment-light, #F4E4BC); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); + z-index: 10; + transform: rotate(45deg); /* Rotate with the marker pin */ + line-height: 1; +} + +/* Counter-rotate the text inside the badge to keep it upright */ +.quest-count-badge span { + transform: rotate(-45deg); + display: inline-block; +} + +/* Marker cluster styling */ +.marker-cluster-icon { + background: transparent !important; + border: none !important; +} + +.marker-cluster { + background-color: var(--color-forest-green-medium, #3D6B1F); + border: 3px solid var(--color-parchment-light, #F4E4BC); + border-radius: 50%; + color: white; + font-weight: bold; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4); + width: 40px; + height: 40px; + font-size: 14px; + cursor: pointer; + transition: transform 0.2s ease, box-shadow 0.2s ease; +} + +.marker-cluster:hover { + transform: scale(1.1); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.6); +} + +/* Override default marker cluster styles */ +.middle-earth-map-container .marker-cluster-small { + background-color: var(--color-forest-green-medium, #3D6B1F) !important; + border: 3px solid var(--color-parchment-light, #F4E4BC) !important; +} + +.middle-earth-map-container .marker-cluster-medium { + background-color: var(--color-forest-green-dark, #2D5016) !important; + border: 3px solid var(--color-parchment-light, #F4E4BC) !important; +} + +.middle-earth-map-container .marker-cluster-large { + background-color: var(--color-earth-brown-dark, #8B4513) !important; + border: 3px solid var(--color-parchment-light, #F4E4BC) !important; +} + +/* Quest marker cluster styling - aggregates quest markers on zoom out */ +.quest-marker-cluster-icon { + background: transparent !important; + border: none !important; +} + +.quest-marker-cluster { + background: linear-gradient(135deg, #CD853F, #8B4513); + border: 2px solid #DAA520; + border-radius: 50%; + color: #F4E4BC; + font-weight: bold; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.3); + font-size: 13px; + cursor: pointer; + transition: transform 0.2s ease, box-shadow 0.2s ease; +} + +.quest-marker-cluster-small { + width: 35px; + height: 35px; +} + +.quest-marker-cluster-medium { + width: 45px; + height: 45px; + font-size: 15px; +} + +.quest-marker-cluster-large { + width: 55px; + height: 55px; + font-size: 17px; +} + +.quest-marker-cluster:hover { + transform: scale(1.15); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.7), inset 0 1px 0 rgba(255, 255, 255, 0.4); +} + +/* Ensure quest markers are always on top and clickable */ +.middle-earth-map-container .leaflet-marker-pane .quest-marker-icon { + z-index: 2000 !important; + pointer-events: auto !important; + cursor: pointer !important; +} + +.middle-earth-map-container .leaflet-marker-pane .quest-marker-icon * { + pointer-events: auto !important; + cursor: pointer !important; +} + +.middle-earth-map-container .leaflet-interactive { + pointer-events: auto !important; +} + +/* Override Leaflet's default pointer-events for quest markers */ +.middle-earth-map-container .leaflet-container .quest-marker-icon, +.middle-earth-map-container .leaflet-container .quest-marker-icon * { + pointer-events: auto !important; + cursor: pointer !important; +} + +/* Ensure quest markers are not blocked by other layers */ +.middle-earth-map-container .leaflet-marker-pane { + z-index: 600 !important; +} + +.middle-earth-map-container .leaflet-marker-pane .quest-marker-icon { + z-index: 2600 !important; +} + +/* Location popup styling */ +.location-popup { + min-width: 200px; +} + +.location-popup h3 { + font-family: 'Cinzel', serif; + color: var(--color-earth-brown-dark, #8B4513); + margin: 0 0 8px 0; + font-size: 1.2rem; +} + +.location-popup .location-region { + font-size: 0.9rem; + color: var(--color-earth-brown-medium, #A0522D); + font-style: italic; + margin: 0 0 8px 0; +} + +.location-popup .location-description { + font-size: 0.85rem; + color: var(--color-deep-blue-dark, #1A1F2E); + margin: 0 0 12px 0; + line-height: 1.4; +} + +.location-popup .quest-count-info { + font-size: 0.9rem; + color: var(--color-forest-green-dark, #2D5016); + margin: 0 0 12px 0; + font-weight: 500; +} + +.location-popup .quest-count-info strong { + color: var(--color-gold-dark, #FFD700); + font-size: 1.1rem; +} + +.location-popup .btn-view-quests { + background-color: var(--color-forest-green-medium, #3D6B1F); + color: white; + border: none; + padding: 8px 16px; + border-radius: 4px; + cursor: pointer; + font-family: 'Lora', serif; + font-size: 0.9rem; + transition: background-color 0.2s ease; + width: 100%; +} + +.location-popup .btn-view-quests:hover { + background-color: var(--color-forest-green-dark, #2D5016); +} + + +.character-marker-icon { + background: transparent !important; + border: none !important; + z-index: 5000 !important; +} + +.character-marker { + width: 40px; + height: 40px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + background: radial-gradient(circle at 30% 30%, #ffe7a3, #d4a939); + border: 2px solid #8b4513; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.45); + font-size: 20px; + cursor: pointer; + transition: transform 0.2s ease; + z-index: 5001 !important; + position: relative; +} + +.character-marker:hover { + transform: scale(1.12); +} + +.character-popup { + min-width: 200px; +} + +.character-popup h4 { + margin: 0 0 6px 0; + color: var(--color-earth-brown-dark, #8B4513); +} + +.character-popup p { + margin: 0 0 10px 0; + font-size: 0.9rem; +} + +.character-popup .btn-bargain-character { + width: 100%; + border: none; + border-radius: 4px; + padding: 8px 10px; + background-color: var(--color-forest-green-medium, #3D6B1F); + color: #fff; + cursor: pointer; +} + +.character-popup .btn-bargain-character:hover { + background-color: var(--color-forest-green-dark, #2D5016); +} + +/* Quest marker styling */ +.quest-marker-icon { + background: transparent !important; + border: none !important; + pointer-events: auto !important; /* Ensure markers are clickable */ +} + +.leaflet-marker-icon.quest-marker-icon { + pointer-events: auto !important; + cursor: pointer !important; +} + +.quest-marker { + width: 35px; + height: 35px; + border-radius: 50%; + border: 2px solid var(--color-parchment-light, #F4E4BC); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4), 0 0 4px rgba(218, 165, 32, 0.3); + display: flex; + align-items: center; + justify-content: center; + cursor: pointer !important; + pointer-events: auto !important; /* Critical: make markers clickable */ + transition: transform 0.2s ease, box-shadow 0.2s ease; + position: relative; + z-index: 2000; /* Higher z-index than location markers */ + user-select: none; /* Prevent text selection */ + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +.quest-marker:hover { + transform: scale(1.3); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.6), 0 0 8px rgba(218, 165, 32, 0.5); + z-index: 3000; /* Even higher on hover */ + cursor: pointer !important; +} + +.quest-marker:active { + transform: scale(1.2); +} + +.quest-marker-selected { + border: 3px solid var(--color-gold-dark, #FFD700); + box-shadow: 0 0 15px rgba(218, 165, 32, 0.8), 0 2px 8px rgba(0, 0, 0, 0.4); + z-index: 2500; /* Higher than normal quest markers */ +} + +.quest-marker-inner { + font-size: 18px; + line-height: 1; + filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.3)); +} + +/* Quest popup styling */ +.quest-popup-wrapper .leaflet-popup-content-wrapper { + max-width: 350px; +} + +.quest-popup { + min-width: 250px; + max-width: 350px; +} + +.quest-popup h4 { + font-family: 'Cinzel', serif; + color: var(--color-earth-brown-dark, #8B4513); + margin: 0 0 10px 0; + font-size: 1.2rem; + line-height: 1.3; +} + +.quest-popup-type { + font-size: 0.9rem; + color: var(--color-gold-dark, #FFD700); + margin: 0 0 8px 0; + font-weight: 600; + font-family: 'Cinzel', serif; +} + +.quest-popup-status { + font-size: 0.85rem; + color: var(--color-forest-green-dark, #2D5016); + margin: 0 0 10px 0; + font-weight: 500; + padding: 4px 8px; + background-color: rgba(45, 80, 22, 0.1); + border-radius: 4px; + display: inline-block; +} + +.quest-popup-description { + font-size: 0.9rem; + color: var(--color-deep-blue-dark, #1A1F2E); + margin: 0 0 12px 0; + line-height: 1.5; + max-height: 200px; + overflow-y: auto; +} + +.quest-popup-location { + font-size: 0.85rem; + color: var(--color-earth-brown-medium, #A0522D); + margin: 0 0 8px 0; + font-style: italic; +} + +.quest-popup-assignee { + font-size: 0.85rem; + color: var(--color-deep-blue-dark, #1A1F2E); + margin: 0 0 12px 0; +} + +.quest-popup-actions { + display: flex; + flex-direction: column; + gap: 8px; + margin-top: 12px; +} + +.btn-view-quest, +.btn-complete-quest { + background-color: var(--color-forest-green-medium, #3D6B1F); + color: white; + border: none; + padding: 8px 16px; + border-radius: 4px; + cursor: pointer; + font-family: 'Lora', serif; + font-size: 0.9rem; + transition: background-color 0.2s ease, transform 0.1s ease; + width: 100%; + font-weight: 500; +} + +.btn-view-quest:hover, +.btn-complete-quest:hover { + background-color: var(--color-forest-green-dark, #2D5016); + transform: translateY(-1px); +} + +.btn-complete-quest { + background-color: var(--color-gold-dark, #FFD700); + color: var(--color-earth-brown-dark, #8B4513); +} + +.btn-complete-quest:hover { + background-color: var(--color-gold-light, #DAA520); + color: var(--color-earth-brown-dark, #8B4513); +} + +/* Responsive design */ +@media (max-width: 768px) { + .middle-earth-map-container { + min-height: 400px; + } + + .location-popup { + min-width: 150px; + } +} diff --git a/sut/frontend/src/components/MiddleEarthMap.tsx b/sut/frontend/src/components/MiddleEarthMap.tsx new file mode 100644 index 0000000..93bab07 --- /dev/null +++ b/sut/frontend/src/components/MiddleEarthMap.tsx @@ -0,0 +1,806 @@ +/** + * MiddleEarthMap Component + * + * Interactive Middle-earth map using Leaflet.js + * Inspired by and adapted from MiddleEarthMap by Yohann Bethoule + * Original project: https://github.com/YohannBethoule/MiddleEarthMap + * Live demo: https://middleearthmap.app/ + */ + +import React, { useEffect, useMemo, useRef } from 'react'; +import { MapContainer, ImageOverlay, useMap } from 'react-leaflet'; +import L from 'leaflet'; +// Fix for default marker icons in Leaflet with webpack +import 'leaflet/dist/leaflet.css'; +// @ts-ignore - leaflet.markercluster extends Leaflet namespace +import 'leaflet.markercluster'; +import { Location, NpcCharacter, Quest } from '../types'; +import './MiddleEarthMap.css'; + +// Extend Leaflet types for markercluster +declare module 'leaflet' { + namespace L { + function markerClusterGroup(options?: any): any; + } +} + +// Helper function to safely access marker icon element +// Note: _icon is a private property of Leaflet Marker, but we need it for styling +function getMarkerIcon(marker: L.Marker): HTMLElement | null { + // @ts-expect-error - _icon is a private property but necessary for DOM manipulation + return marker._icon || null; +} + +// Fix for default marker icons - use require for images to avoid TypeScript errors +// eslint-disable-next-line @typescript-eslint/no-var-requires +const icon = require('leaflet/dist/images/marker-icon.png'); +// eslint-disable-next-line @typescript-eslint/no-var-requires +const iconShadow = require('leaflet/dist/images/marker-shadow.png'); + +const DefaultIcon = L.icon({ + iconUrl: icon.default || icon, + shadowUrl: iconShadow.default || iconShadow, + iconSize: [25, 41], + iconAnchor: [12, 41], + popupAnchor: [1, -34], + shadowSize: [41, 41] +}); + +L.Marker.prototype.options.icon = DefaultIcon; + +// Helper function to get quest type icon +function getQuestTypeIcon(questType?: string): string { + const iconMap: { [key: string]: string } = { + 'The Journey': '🧭', + 'The Battle': '⚔️', + 'The Fellowship': '👥', + 'The Ring': '💍', + 'Dark Magic': '👁️' + }; + return iconMap[questType || ''] || '📜'; +} + +// Helper function to get status display text +function getStatusText(status: string): string { + const statusMap: { [key: string]: string } = { + 'not_yet_begun': 'Not Yet Begun', + 'the_road_goes_ever_on': 'The Road Goes Ever On...', + 'it_is_done': 'It Is Done', + 'the_shadow_falls': 'The Shadow Falls', + 'pending': 'Not Yet Begun', + 'in_progress': 'The Road Goes Ever On...', + 'completed': 'It Is Done', + 'blocked': 'The Shadow Falls' + }; + return statusMap[status] || String(status).replace(/_/g, ' '); +} + +interface MiddleEarthMapProps { + locations: Location[]; + quests: Quest[]; // Quests to count per location + selectedLocationId?: number; + selectedQuestId?: number; // Support quest selection + onLocationClick: (locationId: number) => void; + onQuestClick?: (questId: number) => void; // Support quest click + onCompleteQuest?: (questId: number) => void; // Support quest completion + onCharacterClick?: (character: NpcCharacter) => void; + focusLocationId?: number; // Location to focus on + zoomToLocation?: number; // Location to zoom to from navigation + onFocusComplete?: () => void; // Callback when focus animation completes +} + +interface CharacterMarkerData { + id: NpcCharacter; + name: string; + emoji: string; + map_x: number; + map_y: number; + title: string; +} + +const characterMarkers: CharacterMarkerData[] = [ + { + id: 'frodo', + name: 'Frodo', + emoji: '🧝', + map_x: 1482, + map_y: 1158, + title: 'Sentimental Seller', + }, + { + id: 'sam', + name: 'Sam', + emoji: '👨‍🌾', + map_x: 2589, + map_y: 2383, + title: 'Friendly Bargainer', + }, + { + id: 'gandalf', + name: 'Gandalf', + emoji: '🧙‍♂️', + map_x: 2516, + map_y: 1123, + title: 'Mystic Merchant', + }, +]; + +// Component to handle map bounds and view updates +// For L.CRS.Simple (pixel-based), we disable bounds fitting to avoid animation loops +function MapBoundsHandler({ bounds, initialFit }: { bounds: L.LatLngBounds; initialFit: boolean }) { + const map = useMap(); + + useEffect(() => { + if (initialFit && map) { + // Set initial view without animation to avoid triggering panning loops + map.setView([2172, 2500], -1, { animate: false }); + } + }, [map, initialFit]); + + return null; +} + +// Component to focus map on a location +function MapFocusHandler({ locationId, locations, convertToLatLng, onFocused }: { + locationId?: number; + locations: Location[]; + convertToLatLng: (mapX: number, mapY: number) => [number, number]; + onFocused?: () => void; +}) { + const map = useMap(); + const lastFocusedId = useRef(); + + useEffect(() => { + if (locationId && locationId !== lastFocusedId.current) { + const location = locations.find(loc => loc.id === locationId); + if (location && location.map_x !== undefined && location.map_y !== undefined) { + const [lat, lng] = convertToLatLng(location.map_x, location.map_y); + + // Use setView for pixel-based coordinate system instead of fitBounds + // Aim for a comfortable zoom level (0 or 1) + map.setView([lat, lng], 0, { animate: true, duration: 0.5 }); + + lastFocusedId.current = locationId; + // Call onFocused callback after a delay to allow animation + if (onFocused) { + setTimeout(() => onFocused(), 600); + } + } + } + }, [map, locationId, locations, convertToLatLng, onFocused]); + + // Add max bounds to prevent panning outside the map + useEffect(() => { + const mapBounds: [[number, number], [number, number]] = [ + [0, 0], + [4344, 5000] + ]; + const bounds = L.latLngBounds(mapBounds[0], mapBounds[1]); + map.setMaxBounds(bounds); + // Don't use panInsideBounds on drag - setMaxBounds is sufficient and prevents infinite loops + }, [map]); + + return null; +} + +// Calculate offset for quests at the same location (spiral pattern) +// Returns offset in pixel coordinates [y, x] for L.CRS.Simple +function getQuestOffset(index: number, total: number): [number, number] { + if (total === 1) return [0, 0]; + const angle = (2 * Math.PI * index) / total; + const radius = 30; // pixel offset (works directly with L.CRS.Simple) + // In L.CRS.Simple, coordinates are [y, x] where y increases downward + // Return offset as [y_offset, x_offset] in pixel coordinates + return [Math.sin(angle) * radius, Math.cos(angle) * radius]; +} + +// Component to add individual quest markers +function QuestMarkersComponent({ + quests, + locations, + selectedQuestId, + convertToLatLng, + onQuestClick, + onCompleteQuest +}: { + quests: Quest[]; + locations: Location[]; + selectedQuestId?: number; + convertToLatLng: (mapX: number, mapY: number) => [number, number]; + onQuestClick?: (questId: number) => void; + onCompleteQuest?: (questId: number) => void; +}) { + const map = useMap(); + const clusterGroupRef = useRef(null); + + // Group quests by location for offset calculation + // Filter out quests without location_id + const questsByLocation = useMemo(() => { + const questsWithLocations = quests.filter(quest => quest.location_id); + if (quests.length > 0 && questsWithLocations.length < quests.length) { + console.warn(`⚠ ${quests.length - questsWithLocations.length} quest(s) of ${quests.length} total without location_id will not be displayed on the map.`); + } + return questsWithLocations.reduce((acc, quest) => { + if (quest.location_id) { + if (!acc[quest.location_id]) { + acc[quest.location_id] = []; + } + acc[quest.location_id].push(quest); + } + return acc; + }, {} as Record); + }, [quests]); + + useEffect(() => { + // Wait for map to be ready + if (!map || !map.getContainer()) { + return; + } + + // Wait for map to be fully initialized and image overlay to load + const checkMapReady = () => { + const container = map.getContainer(); + if (!container) { + return false; + } + + // Check if Leaflet map is initialized + if (!map.getSize || map.getSize().x === 0) { + return false; + } + + // Check if image overlay is loaded (look for the image element) + const imageOverlay = container.querySelector('img.leaflet-image-layer'); + if (!imageOverlay || !(imageOverlay instanceof HTMLImageElement) || !imageOverlay.complete) { + return false; + } + + return true; + }; + + // Retry mechanism to wait for map to be ready + let retryCount = 0; + const maxRetries = 20; // 2 seconds max wait (20 * 100ms) + + const tryAddMarkers = () => { + if (!checkMapReady()) { + retryCount++; + if (retryCount < maxRetries) { + setTimeout(tryAddMarkers, 100); + return; + } else { + console.warn('⚠ Map not ready after max retries, adding markers anyway'); + } + } + + // Remove existing cluster group if it exists + if (clusterGroupRef.current) { + map.removeLayer(clusterGroupRef.current); + clusterGroupRef.current = null; + } + + // Create cluster group with custom icon function for quest markers + // @ts-ignore - markerClusterGroup is added by leaflet.markercluster plugin + const questClusterGroup = L.markerClusterGroup({ + maxClusterRadius: 50, + spiderfyOnMaxZoom: true, + showCoverageOnHover: false, + zoomToBoundsOnClick: true, + // Custom cluster icon for quests + iconCreateFunction: (cluster: { getChildCount: () => number }) => { + const count = cluster.getChildCount(); + const size = count < 10 ? 'small' : count < 50 ? 'medium' : 'large'; + return L.divIcon({ + html: `
${count}
`, + className: 'quest-marker-cluster-icon', + iconSize: size === 'small' ? [35, 35] : size === 'medium' ? [45, 45] : [55, 55] + }); + } + }); + + // Add markers for quests with locations + Object.entries(questsByLocation).forEach(([locationIdStr, locationQuests]) => { + const locationId = parseInt(locationIdStr, 10); + const location = locations.find(loc => loc.id === locationId); + + if (location && location.map_x !== undefined && location.map_y !== undefined) { + const [baseLat, baseLng] = convertToLatLng(location.map_x, location.map_y); + + locationQuests.forEach((quest, index) => { + // Calculate offset for this quest + const [offsetY, offsetX] = getQuestOffset(index, locationQuests.length); + const [lat, lng] = [baseLat + offsetY, baseLng + offsetX]; + const isSelected = selectedQuestId === quest.id; + + // Create quest marker icon (slightly larger for better visibility) + const questIcon = L.divIcon({ + className: 'quest-marker-icon', + html: ` +
+
${getQuestTypeIcon(quest.quest_type)}
+
+ `, + iconSize: [35, 35], + iconAnchor: [17, 17], + popupAnchor: [0, -17] + }); + + const marker = L.marker([lat, lng], { + icon: questIcon, + interactive: true, + keyboard: true, + title: quest.title, + riseOnHover: true, + bubblingMouseEvents: false + }); + + // Add popup with full quest info + const locationName = locations.find(loc => loc.id === quest.location_id)?.name || 'Unknown'; + const popupContent = ` +
+

${quest.title}

+ ${quest.quest_type ? `

${getQuestTypeIcon(quest.quest_type)} ${quest.quest_type}${quest.priority ? ` - ${quest.priority}` : ''}

` : ''} +

${getStatusText(quest.status)}

+ ${quest.description ? `

${quest.description}

` : ''} + ${locationName ? `

📍 ${locationName}

` : ''} + ${quest.assignee_name ? `

👤 Assigned to: ${quest.assignee_name}

` : ''} +
+ + ${quest.status !== 'it_is_done' && quest.status !== 'completed' ? ` + + ` : ''} +
+
+ `; + marker.bindPopup(popupContent, { + maxWidth: 350, + className: 'quest-popup-wrapper', + autoPan: true, + autoPanPadding: [50, 50], + closeOnClick: false, + autoClose: false, + keepInView: true + }); + + // Click handler + marker.on('click', (e) => { + if (e.originalEvent) { + e.originalEvent.stopPropagation(); + e.originalEvent.stopImmediatePropagation(); + } + marker.openPopup(); + if (onQuestClick) { + onQuestClick(quest.id); + } + }); + + // Hover effects + marker.on('mouseover', () => { + const icon = getMarkerIcon(marker); + if (icon) { + icon.style.zIndex = '3000'; + } + }); + + marker.on('mouseout', () => { + const icon = getMarkerIcon(marker); + if (icon) { + icon.style.zIndex = '2000'; + } + }); + + // Add marker to cluster group + questClusterGroup.addLayer(marker); + }); + } + }); + + // Add cluster group to map + questClusterGroup.addTo(map); + clusterGroupRef.current = questClusterGroup; + + // Store click handlers globally for popup buttons + if (onQuestClick) { + (window as any).questClickHandler = onQuestClick; + } + if (onCompleteQuest) { + (window as any).completeQuestHandler = onCompleteQuest; + } + + // Debug: Log marker count and details + const markerCount = Object.values(questsByLocation).flat().length; + const totalQuestCount = quests.length; + const questsWithLocationCount = quests.filter(q => q.location_id).length; + + if (markerCount > 0) { + console.log(`✓ Quest Markers: Added ${markerCount} clustered quest markers (${totalQuestCount} total quests, ${questsWithLocationCount} with locations)`); + console.log(` Quest locations: ${Object.keys(questsByLocation).join(', ')}`); + } else if (totalQuestCount > 0) { + console.warn(`⚠ No quest markers displayed: ${totalQuestCount} total quests found, but only ${questsWithLocationCount} have location_id`); + console.warn(` Ensure all quests have a valid location_id assigned`); + } else { + console.debug('ℹ No quests to display on map'); + } + }; + + // Start the retry mechanism + tryAddMarkers(); + + // Cleanup + return () => { + if (clusterGroupRef.current) { + map.removeLayer(clusterGroupRef.current); + clusterGroupRef.current = null; + } + delete (window as any).questClickHandler; + delete (window as any).completeQuestHandler; + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [map, questsByLocation, locations, selectedQuestId, convertToLatLng, onQuestClick, onCompleteQuest]); + + return null; +} + +// Custom marker icon with LOTR styling and quest count badge +function createLocationMarkerIcon(questCount: number, isSelected: boolean) { + const color = isSelected ? '#DAA520' : '#8B4513'; + return L.divIcon({ + className: 'location-marker-icon', + html: ` +
+
+ ${questCount > 0 ? `
${questCount}
` : ''} +
+ `, + iconSize: [40, 50], + iconAnchor: [20, 50], + popupAnchor: [0, -50] + }); +} + +// Component to handle marker clustering using leaflet.markercluster directly +function MarkerClusterComponent({ + locations, + questsByLocation, + selectedLocationId, + convertToLatLng, + onLocationClick +}: { + locations: Location[]; + questsByLocation: Record; + selectedLocationId?: number; + convertToLatLng: (mapX: number, mapY: number) => [number, number]; + onLocationClick: (locationId: number) => void; +}) { + const map = useMap(); + const clusterGroupRef = useRef(null); + + useEffect(() => { + // Wait for map to be ready + if (!map || !map.getContainer()) { + return; + } + + // Wait for map to be fully initialized and image overlay to load + const checkMapReady = () => { + const container = map.getContainer(); + if (!container) { + return false; + } + + // Check if Leaflet map is initialized + if (!map.getSize || map.getSize().x === 0) { + return false; + } + + // Check if image overlay is loaded (look for the image element) + const imageOverlay = container.querySelector('img.leaflet-image-layer'); + if (!imageOverlay || !(imageOverlay instanceof HTMLImageElement) || !imageOverlay.complete) { + return false; + } + + return true; + }; + + // Retry mechanism to wait for map to be ready + let retryCount = 0; + const maxRetries = 20; // 2 seconds max wait (20 * 100ms) + + const tryAddMarkers = () => { + if (!checkMapReady()) { + retryCount++; + if (retryCount < maxRetries) { + setTimeout(tryAddMarkers, 100); + return; + } else { + console.warn('Map not ready after max retries, adding location markers anyway'); + } + } + + // Remove existing cluster group if it exists + if (clusterGroupRef.current) { + map.removeLayer(clusterGroupRef.current); + clusterGroupRef.current = null; + } + + // Create cluster group with custom icon function + // @ts-ignore - markerClusterGroup is added by leaflet.markercluster plugin + const clusterGroup = L.markerClusterGroup({ + maxClusterRadius: 50, + spiderfyOnMaxZoom: true, + showCoverageOnHover: false, + zoomToBoundsOnClick: true, + iconCreateFunction: (cluster: { getChildCount: () => number }) => { + const count = cluster.getChildCount(); + return L.divIcon({ + html: `
${count}
`, + className: 'marker-cluster-icon', + iconSize: L.point(40, 40) + }); + } + }); + + // Add markers to cluster group + locations + .filter(loc => loc.map_x !== undefined && loc.map_y !== undefined) + .forEach((location) => { + const [lat, lng] = convertToLatLng(location.map_x!, location.map_y!); + const isSelected = selectedLocationId === location.id; + const questCount = questsByLocation[location.id] || 0; + + const marker = L.marker([lat, lng], { + icon: createLocationMarkerIcon(questCount, isSelected) + }); + + // Add popup + const popupContent = ` +
+

${location.name}

+

${location.region}

+ ${location.description ? `

${location.description}

` : ''} + ${questCount > 0 ? `

${questCount} quest${questCount !== 1 ? 's' : ''} at this location

` : ''} + +
+ `; + marker.bindPopup(popupContent); + + // Add click handler + marker.on('click', () => { + onLocationClick(location.id); + }); + + clusterGroup.addLayer(marker); + }); + + // Add cluster group to map + clusterGroup.addTo(map); + clusterGroupRef.current = clusterGroup; + + // Store click handler globally for popup buttons + (window as any).locationClickHandler = onLocationClick; + + // Debug: Log location marker count + const locationCount = locations.filter(loc => loc.map_x !== undefined && loc.map_y !== undefined).length; + if (locationCount > 0) { + console.log(`✓ Added ${locationCount} location markers to map`); + } else { + console.warn('⚠ No location markers to display - ensure locations have map_x and map_y coordinates'); + } + }; + + // Start the retry mechanism + tryAddMarkers(); + + // Cleanup + return () => { + if (clusterGroupRef.current) { + map.removeLayer(clusterGroupRef.current); + clusterGroupRef.current = null; + } + delete (window as any).locationClickHandler; + }; + }, [map, locations, questsByLocation, selectedLocationId, convertToLatLng, onLocationClick]); + + return null; +} + +function CharacterMarkersComponent({ + convertToLatLng, + onCharacterClick, +}: { + convertToLatLng: (mapX: number, mapY: number) => [number, number]; + onCharacterClick?: (character: NpcCharacter) => void; +}) { + const map = useMap(); + const layerRef = useRef(null); + + useEffect(() => { + if (!map || !onCharacterClick) { + return; + } + + if (layerRef.current) { + map.removeLayer(layerRef.current); + } + + const layerGroup = L.layerGroup(); + + characterMarkers.forEach((character) => { + const [lat, lng] = convertToLatLng(character.map_x, character.map_y); + console.log( + `Character Marker: ${character.name} (${character.id}) at map_x=${character.map_x}, map_y=${character.map_y} -> lat=${lat}, lng=${lng}` + ); + const markerIcon = L.divIcon({ + className: 'character-marker-icon', + html: `
${character.emoji}
`, + iconSize: [40, 40], + iconAnchor: [20, 20], + }); + + const marker = L.marker([lat, lng], { + icon: markerIcon, + title: `${character.name} - ${character.title}`, + interactive: true, + }); + + marker.bindPopup( + `
+

${character.emoji} ${character.name}

+

${character.title}

+ +
` + ); + + marker.on('click', () => { + marker.openPopup(); + onCharacterClick(character.id); + }); + + layerGroup.addLayer(marker); + }); + + layerGroup.addTo(map); + layerRef.current = layerGroup; + (window as any).characterBargainHandler = onCharacterClick; + + return () => { + if (layerRef.current) { + map.removeLayer(layerRef.current); + layerRef.current = null; + } + delete (window as any).characterBargainHandler; + }; + }, [map, convertToLatLng, onCharacterClick]); + + return null; +} + +const MiddleEarthMap: React.FC = ({ + locations, + quests, + selectedLocationId, + selectedQuestId, + onLocationClick, + onQuestClick, + onCompleteQuest, + onCharacterClick, + focusLocationId, + zoomToLocation, + onFocusComplete +}) => { + // Define bounds for Middle-earth map image + // Map image dimensions: 5000x4344 pixels (width x height) + // In L.CRS.Simple, bounds are [height, width] = [4344, 5000] + // Original map from MiddleEarthMap by Yohann Bethoule + // Map image credit: Emil Johansson (lotrproject.com) + const mapBounds: [[number, number], [number, number]] = [ + [0, 0], // Southwest corner (top-left in Simple CRS) + [4344, 5000] // Northeast corner (bottom-right) - height, width + ]; + + // Convert pixel coordinates (map_x, map_y) to Leaflet coordinates + // In L.CRS.Simple, coordinates are [y, x] where: + // - y ranges from 0 (top) to 4344 (bottom) - image height + // - x ranges from 0 (left) to 5000 (right) - image width + // Database coordinates need Y inversion: the image coordinate system starts from top, + // but we need to use [mapHeight - mapY, mapX] for proper positioning + const convertToLatLng = (mapX: number, mapY: number): [number, number] => { + // In L.CRS.Simple, y increases downward, so we invert: [height - y, x] + return [mapBounds[1][0] - mapY, mapX]; + }; + + // Group quests by location_id to calculate counts + const questsByLocation = useMemo(() => { + return quests.reduce((acc, quest) => { + if (quest.location_id) { + acc[quest.location_id] = (acc[quest.location_id] || 0) + 1; + } + return acc; + }, {} as Record); + }, [quests]); + + // Track if this is the initial mount for fitBounds + const [initialFit, setInitialFit] = React.useState(true); + + useEffect(() => { + // After first render, disable fitBounds + setInitialFit(false); + }, []); + + return ( +
+ + {/* Middle-earth map image overlay */} + {/* Map image from MiddleEarthMap by Yohann Bethoule */} + {/* Original map credit: Emil Johansson (lotrproject.com) */} + + + {/* Set map bounds - only on initial mount */} + + + {/* Focus handler */} + + + {/* Location markers with clustering - added first so quest markers render on top */} + + + + + {/* Individual quest markers - added last to ensure they render on top and are clickable */} + + +
+ ); +}; + +export default MiddleEarthMap; diff --git a/sut/frontend/src/components/QuestFilterBar.tsx b/sut/frontend/src/components/QuestFilterBar.tsx new file mode 100644 index 0000000..e1b192f --- /dev/null +++ b/sut/frontend/src/components/QuestFilterBar.tsx @@ -0,0 +1,220 @@ +/** + * Quest Filter Bar Component - LOTR themed quest filtering + * Provides compact, thematic filtering for quests by status, type, and location + * Uses collapsible categories to minimize space usage + */ + +import React, { useState } from 'react'; +import { Location, Quest } from '../types'; + +interface QuestFilterBarProps { + quests: Quest[]; + locations: Location[]; + onStatusChange: (status: string | null) => void; + onTypeChange: (type: string | null) => void; + onLocationChange: (locationId: number | null) => void; + selectedStatus: string | null; + selectedType: string | null; + selectedLocation: number | null; +} + +type FilterCategory = 'status' | 'type' | 'location'; + +export const QuestFilterBar: React.FC = ({ + quests, + locations, + onStatusChange, + onTypeChange, + onLocationChange, + selectedStatus, + selectedType, + selectedLocation, +}) => { + const [expandedCategories, setExpandedCategories] = useState>( + new Set(['status']) + ); + + const toggleCategory = (category: FilterCategory) => { + const newExpanded = new Set(expandedCategories); + if (newExpanded.has(category)) { + newExpanded.delete(category); + } else { + newExpanded.add(category); + } + setExpandedCategories(newExpanded); + }; + + const getStatusColor = (status: string | null) => { + switch (status) { + case 'the_road_goes_ever_on': + return 'bg-in-progress/20 text-in-progress border-in-progress/40 hover:bg-in-progress/30'; + case 'it_is_done': + return 'bg-ready/20 text-ready border-ready/40 hover:bg-ready/30'; + case 'the_shadow_falls': + return 'bg-blocked/20 text-blocked border-blocked/40 hover:bg-blocked/30'; + default: + return 'bg-parchment-light text-text-primary border-gold/30 hover:bg-gold/20'; + } + }; + + const getStatusLabel = (status: string) => { + switch (status) { + case 'the_road_goes_ever_on': + return 'In Progress'; + case 'it_is_done': + return 'Completed'; + case 'the_shadow_falls': + return 'Blocked'; + default: + return 'All Quests'; + } + }; + + const statuses = [ + { key: null, label: getStatusLabel('') }, + { key: 'the_road_goes_ever_on', label: getStatusLabel('the_road_goes_ever_on') }, + { key: 'it_is_done', label: getStatusLabel('it_is_done') }, + { key: 'the_shadow_falls', label: getStatusLabel('the_shadow_falls') }, + ]; + + const questTypes = [ + 'The Journey', + 'The Battle', + 'The Fellowship', + 'The Ring', + ]; + + return ( +
+ {/* Status Filter Category */} +
+ + + {expandedCategories.has('status') && ( +
+ {statuses.map(({ key, label }) => ( + + ))} +
+ )} +
+ + {/* Type Filter Category */} +
+ + + {expandedCategories.has('type') && ( +
+ + {questTypes.map((type) => ( + + ))} +
+ )} +
+ + {/* Location Filter Category */} + {locations.length > 0 && ( +
+ + + {expandedCategories.has('location') && ( +
+ + {locations.map((location) => ( + + ))} +
+ )} +
+ )} +
+ ); +}; + +export default QuestFilterBar; diff --git a/sut/frontend/src/components/QuestForm.css b/sut/frontend/src/components/QuestForm.css new file mode 100644 index 0000000..5a8f7c7 --- /dev/null +++ b/sut/frontend/src/components/QuestForm.css @@ -0,0 +1,147 @@ +.quest-form-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(26, 31, 46, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 9999; + padding: 1.5rem; + animation: fadeIn 0.3s ease-out; + backdrop-filter: blur(3px); +} + +.quest-form-modal { + background: linear-gradient(135deg, var(--parchment-light) 0%, var(--parchment) 100%); + border-radius: 1rem; + max-width: 550px; + width: 100%; + max-height: 88vh; + overflow-y: auto; + box-shadow: 0 8px 32px rgba(139, 69, 19, 0.25), 0 0 20px rgba(218, 165, 32, 0.1); + border: 1px solid var(--gold-dark); + animation: scaleIn 0.3s ease-out; +} + +.quest-form-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1.5rem; + border-bottom: 1px solid var(--gold-dark); + background: linear-gradient(90deg, rgba(218, 165, 32, 0.08) 0%, transparent 100%); +} + +.quest-form-header h2 { + margin: 0; + color: var(--deep-blue); + font-family: 'Cinzel', serif; + font-weight: 700; + font-size: 1.3rem; + letter-spacing: 0.5px; +} + +.close-button { + background: none; + border: none; + font-size: 1.75rem; + color: var(--earth-brown); + cursor: pointer; + line-height: 1; + padding: 0.25rem; + width: 2.25rem; + height: 2.25rem; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.25s ease; + border-radius: 0.5rem; +} + +.close-button:hover { + color: var(--dark-red); + background-color: rgba(218, 165, 32, 0.15); + transform: rotate(90deg); +} + +.quest-form { + padding: 1.5rem; + display: flex; + flex-direction: column; + gap: 1rem; +} + +.form-group { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.form-label { + font-family: 'Cinzel', serif; + font-weight: 600; + color: var(--deep-blue); + font-size: 0.9rem; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.form-input { + padding: 0.75rem; + border: 1px solid var(--gold-dark); + border-radius: 0.5rem; + font-family: 'Lora', serif; + font-size: 0.95rem; + color: var(--deep-blue); + background-color: var(--parchment-light); + transition: all 0.25s ease; + box-shadow: 0 1px 3px rgba(139, 69, 19, 0.1); +} + +.form-input:focus { + outline: none; + border-color: var(--gold); + background-color: white; + box-shadow: 0 2px 6px rgba(139, 69, 19, 0.15), 0 0 0 2px rgba(218, 165, 32, 0.15); +} + +.form-input::placeholder { + color: var(--text-secondary); + font-style: italic; + opacity: 0.7; +} + +.form-textarea { + resize: vertical; + min-height: 90px; + font-size: 0.95rem; + line-height: 1.5; + font-weight: 400; +} + +.form-textarea:focus { + border-color: var(--gold); + box-shadow: 0 2px 6px rgba(139, 69, 19, 0.15), 0 0 0 2px rgba(218, 165, 32, 0.15); +} + +.error-message { + background-color: rgba(220, 38, 38, 0.1); + color: var(--dark-red); + padding: 0.75rem; + border-radius: 0.5rem; + border-left: 3px solid var(--dark-red); + font-size: 0.9rem; + margin-bottom: 1rem; +} + +.quest-form-actions { + display: flex; + justify-content: flex-end; + gap: 0.75rem; + margin-top: 1.5rem; + padding-top: 1rem; + border-top: 1px solid var(--gold-dark); +} diff --git a/sut/frontend/src/components/QuestForm.tsx b/sut/frontend/src/components/QuestForm.tsx new file mode 100644 index 0000000..3d8c939 --- /dev/null +++ b/sut/frontend/src/components/QuestForm.tsx @@ -0,0 +1,220 @@ +import React, { useState } from 'react'; +import { Quest, Location, Member } from '../types'; +import './QuestForm.css'; + +interface QuestFormProps { + quest?: Partial; + locations: Location[]; + members: Member[]; + onSubmit: (quest: Partial) => Promise; + onCancel: () => void; +} + +const QuestForm: React.FC = ({ + quest, + locations, + members, + onSubmit, + onCancel, +}) => { + const [title, setTitle] = useState(quest?.title || ''); + const [description, setDescription] = useState(quest?.description || ''); + const [status, setStatus] = useState(quest?.status || 'not_yet_begun'); + const [questType, setQuestType] = useState(quest?.quest_type); + const [priority, setPriority] = useState(quest?.priority); + const [isDarkMagic, setIsDarkMagic] = useState(quest?.is_dark_magic || false); + const [characterQuote, setCharacterQuote] = useState(quest?.character_quote || ''); + const [locationId, setLocationId] = useState(quest?.location_id); + const [assignedTo, setAssignedTo] = useState(quest?.assigned_to); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(''); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setError(''); + + // Validate location is selected + if (!locationId) { + setError('Please select a location for this quest. All quests must be associated with a location on the map.'); + return; + } + + setLoading(true); + + try { + await onSubmit({ + title, + description, + status, + quest_type: questType, + priority, + is_dark_magic: isDarkMagic, + character_quote: characterQuote || undefined, + location_id: locationId, + assigned_to: assignedTo, + }); + } catch (err: any) { + setError(err.message || 'Failed to save quest'); + } finally { + setLoading(false); + } + }; + + return ( +
+
e.stopPropagation()}> +
+

{quest ? 'Revise the Quest' : 'Propose a Quest'}

+ +
+ + {error &&
{error}
} + +
+
+ + setTitle(e.target.value)} + required + /> +
+ +
+ +