diff --git a/.dockerignore b/.dockerignore
old mode 100644
new mode 100755
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
old mode 100644
new mode 100755
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
index 4005159..71055ef
--- a/.gitignore
+++ b/.gitignore
@@ -24,8 +24,11 @@ wheels/
*.egg
# FastAPI
+# IMPORTANT: Zero-Config - Aucun fichier .env par défaut
+# Seuls les fichiers d'environnement spécifiques sont autorisés
.env
.env.local
+.env.development
.env.production
*.db
*.sqlite
@@ -95,13 +98,9 @@ ehthumbs.db
Desktop.ini
# Production
-.env.production
-.env.staging
*.pem
-*.key
-*.crt
-# Temporary files
-*.tmp
-*.temp
-.cache/
+# IMPORTANT: Zero-Config - Aucune configuration par défaut
+# Tous les fichiers .env d'environnement doivent être explicitement configurés
+# Seuls les fichiers .env.local, .env.development, .env.production sont autorisés
+# Aucun fichier .env générique ou .env.example
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index 0e9c69c..0000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,158 +0,0 @@
-# Guide de contribution - LeDiscord
-
-## 🎯 Comment contribuer
-
-Merci de votre intérêt pour contribuer à LeDiscord ! Ce guide vous aidera à comprendre comment participer au projet.
-
-## 🚀 Démarrage rapide
-
-### 1. Fork et clone
-```bash
-# Fork le projet sur GitHub
-# Puis clonez votre fork
-git clone https://github.com/votre-username/LeDiscord.git
-cd LeDiscord
-```
-
-### 2. Configuration de l'environnement
-```bash
-# Copier le fichier d'environnement
-cp env.example .env
-
-# Éditer .env avec vos valeurs
-nano .env
-
-# Démarrer l'application
-make start
-```
-
-### 3. Créer une branche
-```bash
-git checkout -b feature/nom-de-votre-fonctionnalite
-```
-
-## 📝 Standards de code
-
-### Backend (Python)
-- **Formatage** : Utilisez `black` pour le formatage automatique
-- **Linting** : Utilisez `flake8` pour la vérification du code
-- **Types** : Utilisez les annotations de type Python
-- **Tests** : Écrivez des tests pour toutes les nouvelles fonctionnalités
-
-### Frontend (Vue.js)
-- **Formatage** : Utilisez `prettier` pour le formatage automatique
-- **Linting** : Utilisez `eslint` pour la vérification du code
-- **Composition API** : Utilisez la Composition API de Vue 3
-- **Tests** : Écrivez des tests unitaires pour les composants
-
-## 🔧 Outils de développement
-
-### Installation des outils
-```bash
-# Backend
-cd backend
-pip install black flake8 pytest
-
-# Frontend
-cd frontend
-npm install -g prettier eslint
-```
-
-### Commandes utiles
-```bash
-# Formatage automatique
-make format
-
-# Vérification du code
-make lint
-
-# Tests
-make test
-```
-
-## 🧪 Tests
-
-### Backend
-```bash
-cd backend
-pytest tests/ -v
-```
-
-### Frontend
-```bash
-cd frontend
-npm run test:unit
-```
-
-## 📋 Checklist avant de soumettre
-
-- [ ] Code formaté avec les outils appropriés
-- [ ] Tests passent
-- [ ] Documentation mise à jour
-- [ ] Pas de secrets ou de données sensibles dans le code
-- [ ] Messages de commit clairs et descriptifs
-
-## 🚀 Processus de contribution
-
-### 1. Développement
-- Développez votre fonctionnalité
-- Écrivez des tests
-- Mettez à jour la documentation
-
-### 2. Tests
-```bash
-# Tests backend
-make test-backend
-
-# Tests frontend
-make test-frontend
-
-# Tests complets
-make test
-```
-
-### 3. Commit et push
-```bash
-git add .
-git commit -m "feat: ajouter une nouvelle fonctionnalité"
-git push origin feature/nom-de-votre-fonctionnalite
-```
-
-### 4. Pull Request
-- Créez une PR sur GitHub
-- Décrivez clairement les changements
-- Attendez la review
-
-## 📚 Ressources utiles
-
-- [Documentation FastAPI](https://fastapi.tiangolo.com/)
-- [Documentation Vue.js 3](https://vuejs.org/)
-- [Documentation Tailwind CSS](https://tailwindcss.com/)
-- [Documentation Docker](https://docs.docker.com/)
-
-## 🐛 Signaler un bug
-
-1. Vérifiez que le bug n'a pas déjà été signalé
-2. Créez une issue avec :
- - Description claire du bug
- - Étapes pour le reproduire
- - Comportement attendu vs. observé
- - Version de l'application
- - Logs d'erreur si applicable
-
-## 💡 Proposer une fonctionnalité
-
-1. Créez une issue avec le label "enhancement"
-2. Décrivez la fonctionnalité souhaitée
-3. Expliquez pourquoi elle serait utile
-4. Proposez une implémentation si possible
-
-## 📞 Besoin d'aide ?
-
-- Créez une issue avec le label "question"
-- Consultez la documentation
-- Rejoignez la communauté
-
-## 🎉 Merci !
-
-Votre contribution aide à améliorer LeDiscord pour tous les utilisateurs. Merci de participer au projet !
diff --git a/Makefile b/Makefile
old mode 100644
new mode 100755
index fb669dc..3ac5991
--- a/Makefile
+++ b/Makefile
@@ -1,56 +1,232 @@
-.PHONY: help start stop restart logs clean build install
+.PHONY: help local dev prod start stop restart logs status build clean test verify
+
+# Configuration
+PROJECT_NAME := LeDiscord
help: ## Afficher cette aide
- @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-15s\033[0m %s\n", $$1, $$2}'
+ @echo "🚀 $(PROJECT_NAME) - Makefile Zero-Config"
+ @echo "=========================================="
+ @echo ""
+ @echo "📋 Environnements disponibles :"
+ @echo " local - Développement local (localhost)"
+ @echo " dev - Environnement de développement (dev.lediscord.com)"
+ @echo " prod - Production (lediscord.com)"
+ @echo ""
+ @echo "🔧 Commandes disponibles :"
+ @echo ""
+ @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
+ @echo ""
+ @echo "💡 Exemples :"
+ @echo " make local # Démarrer en mode local"
+ @echo " make dev # Démarrer en mode développement"
+ @echo " make prod # Démarrer en mode production"
+ @echo " make stop-local # Arrêter en mode local"
+ @echo " make logs-dev # Voir les logs en mode développement"
-start: ## Démarrer l'application
- ./start.sh
+# ===========================================
+# LOCAL (développement sur votre machine)
+# ===========================================
-stop: ## Arrêter l'application
- ./stop.sh
+local: ## Démarrer en mode local
+ @echo "🚀 Démarrage de $(PROJECT_NAME) en mode LOCAL..."
+ @docker compose -f docker-compose.local.yml up --build -d
+ @echo "✅ $(PROJECT_NAME) local démarré !"
+ @echo " Frontend: http://localhost:5173"
+ @echo " Backend: http://localhost:8000"
+ @echo " API Docs: http://localhost:8000/docs"
-restart: ## Redémarrer l'application
- ./stop.sh
- ./start.sh
+stop-local: ## Arrêter en mode local
+ @echo "🛑 Arrêt de $(PROJECT_NAME) en mode LOCAL..."
+ @docker compose -f docker-compose.local.yml down
+ @echo "✅ $(PROJECT_NAME) local arrêté"
-logs: ## Afficher les logs
- docker compose logs -f
+restart-local: ## Redémarrer en mode local
+ @echo "🔄 Redémarrage de $(PROJECT_NAME) en mode LOCAL..."
+ @$(MAKE) stop-local
+ @$(MAKE) local
-logs-backend: ## Afficher les logs du backend
- docker compose logs -f backend
+logs-local: ## Voir les logs en mode local
+ @echo "📝 Logs de $(PROJECT_NAME) en mode LOCAL..."
+ @docker compose -f docker-compose.local.yml logs -f
-logs-frontend: ## Afficher les logs du frontend
- docker compose logs -f frontend
+status-local: ## Voir le statut en mode local
+ @echo "📊 Statut de $(PROJECT_NAME) en mode LOCAL..."
+ @docker compose -f docker-compose.local.yml ps
-logs-db: ## Afficher les logs de la base de données
- docker compose logs -f postgres
+build-local: ## Reconstruire en mode local
+ @echo "🔨 Reconstruction de $(PROJECT_NAME) en mode LOCAL..."
+ @docker compose -f docker-compose.local.yml build --no-cache
+ @echo "✅ Reconstruction terminée"
-build: ## Reconstruire les images Docker
- docker compose build
+# ===========================================
+# DEVELOPMENT (dev.lediscord.com)
+# ===========================================
-clean: ## Nettoyer les conteneurs et volumes
- docker compose down -v
- rm -rf backend/__pycache__
- rm -rf backend/**/__pycache__
+dev: ## Démarrer en mode développement
+ @echo "🚀 Démarrage de $(PROJECT_NAME) en mode DEVELOPMENT..."
+ @docker compose -f docker-compose.dev.yml up --build -d
+ @echo "✅ $(PROJECT_NAME) development démarré !"
+ @echo " Frontend: http://localhost:8082"
+ @echo " Backend: http://localhost:8002"
+ @echo " API Docs: http://localhost:8002/docs"
-install: ## Installer les dépendances localement (dev)
- cd backend && pip install -r requirements.txt
- cd frontend && npm install
+stop-dev: ## Arrêter en mode développement
+ @echo "🛑 Arrêt de $(PROJECT_NAME) en mode DEVELOPMENT..."
+ @docker compose -f docker-compose.dev.yml down
+ @echo "✅ $(PROJECT_NAME) development arrêté"
-dev-backend: ## Lancer le backend en mode développement
- cd backend && uvicorn app:app --reload --host 0.0.0.0 --port 8000
+restart-dev: ## Redémarrer en mode développement
+ @echo "🔄 Redémarrage de $(PROJECT_NAME) en mode DEVELOPMENT..."
+ @$(MAKE) stop-dev
+ @$(MAKE) dev
-dev-frontend: ## Lancer le frontend en mode développement
- cd frontend && npm run dev
+logs-dev: ## Voir les logs en mode développement
+ @echo "📝 Logs de $(PROJECT_NAME) en mode DEVELOPMENT..."
+ @docker compose -f docker-compose.dev.yml logs -f
-shell-backend: ## Ouvrir un shell dans le conteneur backend
- docker compose exec backend /bin/bash
+status-dev: ## Voir le statut en mode développement
+ @echo "📊 Statut de $(PROJECT_NAME) en mode DEVELOPMENT..."
+ @docker compose -f docker-compose.dev.yml ps
-shell-db: ## Ouvrir psql dans le conteneur PostgreSQL
- docker compose exec postgres psql -U lediscord_user -d lediscord
+build-dev: ## Reconstruire en mode développement
+ @echo "🔨 Reconstruction de $(PROJECT_NAME) en mode DEVELOPMENT..."
+ @docker compose -f docker-compose.dev.yml build --no-cache
+ @echo "✅ Reconstruction terminée"
-backup-db: ## Sauvegarder la base de données
- docker compose exec postgres pg_dump -U lediscord_user lediscord > backup_$$(date +%Y%m%d_%H%M%S).sql
+# ===========================================
+# PRODUCTION (lediscord.com)
+# ===========================================
-status: ## Afficher le statut des conteneurs
- docker compose ps
+prod: ## Démarrer en mode production
+ @echo "🚀 Démarrage de $(PROJECT_NAME) en mode PRODUCTION..."
+ @docker compose -f docker-compose.prod.yml up --build -d
+ @echo "✅ $(PROJECT_NAME) production démarré !"
+ @echo " Frontend: http://localhost:80"
+ @echo " Backend: http://localhost:8001"
+ @echo " API Docs: http://localhost:8001/docs"
+
+stop-prod: ## Arrêter en mode production
+ @echo "🛑 Arrêt de $(PROJECT_NAME) en mode PRODUCTION..."
+ @docker compose -f docker-compose.prod.yml down
+ @echo "✅ $(PROJECT_NAME) production arrêté"
+
+restart-prod: ## Redémarrer en mode production
+ @echo "🔄 Redémarrage de $(PROJECT_NAME) en mode PRODUCTION..."
+ @$(MAKE) stop-prod
+ @$(MAKE) prod
+
+logs-prod: ## Voir les logs en mode production
+ @echo "📝 Logs de $(PROJECT_NAME) en mode PRODUCTION..."
+ @docker compose -f docker-compose.prod.yml logs -f
+
+status-prod: ## Voir le statut en mode production
+ @echo "📊 Statut de $(PROJECT_NAME) en mode PRODUCTION..."
+ @docker compose -f docker-compose.prod.yml ps
+
+build-prod: ## Reconstruire en mode production
+ @echo "🔨 Reconstruction de $(PROJECT_NAME) en mode PRODUCTION..."
+ @docker compose -f docker-compose.prod.yml build --no-cache
+ @echo "✅ Reconstruction terminée"
+
+# ===========================================
+# COMMANDES GLOBALES
+# ===========================================
+
+start: local ## Démarrer en mode local (alias)
+stop: stop-local ## Arrêter en mode local (alias)
+restart: restart-local ## Redémarrer en mode local (alias)
+logs: logs-local ## Voir les logs en mode local (alias)
+
+all: ## Démarrer tous les environnements
+ @echo "🚀 Démarrage de tous les environnements $(PROJECT_NAME)..."
+ @$(MAKE) local
+ @$(MAKE) dev
+ @$(MAKE) prod
+ @echo "✅ Tous les environnements sont démarrés !"
+
+stop-all: ## Arrêter tous les environnements
+ @echo "🛑 Arrêt de tous les environnements $(PROJECT_NAME)..."
+ @$(MAKE) stop-local
+ @$(MAKE) stop-dev
+ @$(MAKE) stop-prod
+ @echo "✅ Tous les environnements sont arrêtés !"
+
+status: ## Voir le statut de tous les environnements
+ @echo "📊 Statut de tous les environnements $(PROJECT_NAME)..."
+ @echo ""
+ @echo "🔵 LOCAL:"
+ @$(MAKE) status-local
+ @echo ""
+ @echo "🟡 DEVELOPMENT:"
+ @$(MAKE) status-dev
+ @echo ""
+ @echo "🟢 PRODUCTION:"
+ @$(MAKE) status-prod
+
+clean: ## Nettoyer tous les environnements (ATTENTION: supprime les volumes)
+ @echo "🧹 Nettoyage complet de $(PROJECT_NAME)..."
+ @echo "⚠️ ATTENTION: Cette action supprimera tous les volumes et données !"
+ @read -p "Êtes-vous sûr ? (y/N): " -n 1 -r; \
+ if [[ $$REPLY =~ ^[Yy]$$ ]]; then \
+ echo ""; \
+ echo "🧹 Nettoyage en cours..."; \
+ $(MAKE) stop-all; \
+ docker compose -f docker-compose.local.yml down -v --remove-orphans; \
+ docker compose -f docker-compose.dev.yml down -v --remove-orphans; \
+ docker compose -f docker-compose.prod.yml down -v --remove-orphans; \
+ docker system prune -f; \
+ echo "✅ Nettoyage terminé"; \
+ else \
+ echo ""; \
+ echo "❌ Nettoyage annulé"; \
+ fi
+
+# ===========================================
+# UTILITAIRES
+# ===========================================
+
+test: ## Tester la configuration des environnements
+ @echo "🧪 Test de la configuration $(PROJECT_NAME)..."
+ @if [ -f "test-environments.sh" ]; then \
+ ./test-environments.sh; \
+ else \
+ echo "❌ Script de test non trouvé"; \
+ fi
+
+verify: ## Vérifier le mode Zero-Config
+ @echo "🔍 Vérification Zero-Config $(PROJECT_NAME)..."
+ @if [ -f "verify-zero-config.sh" ]; then \
+ ./verify-zero-config.sh; \
+ else \
+ echo "❌ Script de vérification non trouvé"; \
+ fi
+
+check: ## Vérifier la configuration des fichiers d'environnement
+ @echo "🔍 Vérification des fichiers d'environnement..."
+ @echo ""
+ @echo "📁 Backend:"
+ @for env in local development production; do \
+ if [ -f "backend/.env.$$env" ]; then \
+ echo "✅ backend/.env.$$env"; \
+ else \
+ echo "❌ backend/.env.$$env manquant"; \
+ fi; \
+ done
+ @echo ""
+ @echo "📁 Frontend:"
+ @for env in local development production; do \
+ if [ -f "frontend/.env.$$env" ]; then \
+ echo "✅ frontend/.env.$$env"; \
+ else \
+ echo "❌ frontend/.env.$$env manquant"; \
+ fi; \
+ done
+ @echo ""
+ @echo "📁 Docker Compose:"
+ @for env in local dev prod; do \
+ if [ -f "docker-compose.$$env.yml" ]; then \
+ echo "✅ docker-compose.$$env.yml"; \
+ else \
+ echo "❌ docker-compose.$$env.yml manquant"; \
+ fi; \
+ done
diff --git a/README.md b/README.md
old mode 100644
new mode 100755
diff --git a/backend/Dockerfile b/backend/Dockerfile
deleted file mode 100644
index d754e4b..0000000
--- a/backend/Dockerfile
+++ /dev/null
@@ -1,29 +0,0 @@
-FROM python:3.11-slim
-
-WORKDIR /app
-
-# Install system dependencies
-RUN apt-get update && apt-get install -y \
- gcc \
- libpq-dev \
- libmagic1 \
- libgl1 \
- libglib2.0-0 \
- libsm6 \
- libxext6 \
- libxrender1 \
- libgomp1 \
- && rm -rf /var/lib/apt/lists/*
-
-# Copy requirements first for better caching
-COPY requirements.txt .
-RUN pip install --no-cache-dir -r requirements.txt
-
-# Copy application code
-COPY . .
-
-# Create uploads directory
-RUN mkdir -p /app/uploads
-
-# Run the application
-CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
diff --git a/backend/Dockerfile.dev b/backend/Dockerfile.dev
new file mode 100755
index 0000000..eb1d8fb
--- /dev/null
+++ b/backend/Dockerfile.dev
@@ -0,0 +1,61 @@
+FROM python:3.11-slim
+
+LABEL maintainer="LeDiscord Team"
+LABEL version="1.0"
+LABEL description="LeDiscord Backend - Environnement Développement"
+
+WORKDIR /app
+
+# Env dev
+ENV ENVIRONMENT=development \
+ PYTHONPATH=/app \
+ PYTHONUNBUFFERED=1 \
+ PYTHONDONTWRITEBYTECODE=1
+
+# Dépendances système (minifiées)
+RUN apt-get update && apt-get install -y --no-install-recommends \
+ gcc \
+ libpq-dev \
+ libmagic1 \
+ libgl1 \
+ libglib2.0-0 \
+ libsm6 \
+ libxext6 \
+ libxrender1 \
+ libgomp1 \
+ curl \
+ && rm -rf /var/lib/apt/lists/*
+
+# Requirements (cache friendly)
+COPY requirements.txt .
+
+# Uvicorn[standard] apporte watchfiles pour un --reload rapide/stable en dev
+RUN pip install --no-cache-dir --upgrade pip \
+ && pip install --no-cache-dir -r requirements.txt \
+ && pip install --no-cache-dir "uvicorn[standard]"
+
+# Dossiers utiles
+RUN mkdir -p /app/uploads /app/logs
+
+# Code source
+COPY . .
+
+# Env dev
+COPY .env.development .env
+
+# Permissions
+RUN chmod -R 755 /app
+
+EXPOSE 8000
+
+# Hot-reload + respect des en-têtes proxy (utile si tu testes derrière Traefik en dev)
+# Astuce: on exclut uploads/logs du reload pour éviter les restarts inutiles
+CMD ["uvicorn", "app:app", \
+ "--reload", \
+ "--reload-exclude", "uploads/*", \
+ "--reload-exclude", "logs/*", \
+ "--host", "0.0.0.0", \
+ "--port", "8000", \
+ "--log-level", "debug", \
+ "--proxy-headers", \
+ "--forwarded-allow-ips=*"]
diff --git a/backend/Dockerfile.prod b/backend/Dockerfile.prod
new file mode 100755
index 0000000..3c19e95
--- /dev/null
+++ b/backend/Dockerfile.prod
@@ -0,0 +1,75 @@
+# Multi-stage build pour la production
+FROM python:3.11-slim AS builder
+
+LABEL maintainer="LeDiscord Team"
+LABEL version="1.0"
+LABEL description="LeDiscord Backend - Environnement Production"
+
+WORKDIR /app
+
+# Env
+ENV ENVIRONMENT=production \
+ PYTHONPATH=/app \
+ PYTHONUNBUFFERED=1 \
+ PYTHONDONTWRITEBYTECODE=1
+
+# Dépendances de build
+RUN apt-get update && apt-get install -y --no-install-recommends \
+ gcc \
+ libpq-dev \
+ && rm -rf /var/lib/apt/lists/*
+
+# Requirements
+COPY requirements.txt .
+RUN pip install --no-cache-dir --upgrade pip \
+ && pip install --no-cache-dir -r requirements.txt
+
+# ---- Stage runtime ----
+FROM python:3.11-slim AS production
+
+WORKDIR /app
+
+# Env runtime
+ENV ENVIRONMENT=production \
+ PYTHONPATH=/app \
+ PYTHONUNBUFFERED=1 \
+ PYTHONDONTWRITEBYTECODE=1
+
+# Dépendances runtime
+RUN apt-get update && apt-get install -y --no-install-recommends \
+ libpq5 \
+ libmagic1 \
+ libgl1 \
+ libglib2.0-0 \
+ libsm6 \
+ libxext6 \
+ libxrender1 \
+ libgomp1 \
+ && rm -rf /var/lib/apt/lists/*
+
+# Paquets Python depuis le builder
+COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
+COPY --from=builder /usr/local/bin /usr/local/bin
+
+# Dossiers appli
+RUN mkdir -p /app/uploads /app/logs
+
+# Code source
+COPY . .
+
+# Env prod (attention à ce que tu y mets)
+COPY .env.production .env
+
+# Utilisateur non-root
+RUN groupadd -r lediscord && useradd -r -g lediscord lediscord \
+ && chown -R lediscord:lediscord /app
+USER lediscord
+
+EXPOSE 8000
+
+# Healthcheck (optionnel mais pratique)
+HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
+ CMD python -c "import socket; s=socket.socket(); s.settimeout(2); s.connect(('127.0.0.1',8000)); s.close()" || exit 1
+
+# Démarrage uvicorn — pas de guillemets imbriqués ici
+CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4", "--log-level", "info", "--proxy-headers", "--forwarded-allow-ips=*"]
diff --git a/backend/__init__.py b/backend/__init__.py
old mode 100644
new mode 100755
diff --git a/backend/api/routers/__init__.py b/backend/api/routers/__init__.py
old mode 100644
new mode 100755
diff --git a/backend/api/routers/admin.py b/backend/api/routers/admin.py
old mode 100644
new mode 100755
diff --git a/backend/api/routers/albums.py b/backend/api/routers/albums.py
old mode 100644
new mode 100755
diff --git a/backend/api/routers/auth.py b/backend/api/routers/auth.py
old mode 100644
new mode 100755
diff --git a/backend/api/routers/events.py b/backend/api/routers/events.py
old mode 100644
new mode 100755
index d8b2517..9bb8707
--- a/backend/api/routers/events.py
+++ b/backend/api/routers/events.py
@@ -1,5 +1,5 @@
from fastapi import APIRouter, Depends, HTTPException, status
-from sqlalchemy.orm import Session
+from sqlalchemy.orm import Session, joinedload
from typing import List
from datetime import datetime
from config.database import get_db
@@ -64,7 +64,7 @@ async def get_events(
upcoming: bool = None
):
"""Get all events, optionally filtered by upcoming status."""
- query = db.query(Event)
+ query = db.query(Event).options(joinedload(Event.creator))
if upcoming is True:
# Only upcoming events
@@ -83,7 +83,7 @@ async def get_upcoming_events(
current_user: User = Depends(get_current_active_user)
):
"""Get only upcoming events."""
- events = db.query(Event).filter(
+ events = db.query(Event).options(joinedload(Event.creator)).filter(
Event.date >= datetime.utcnow()
).order_by(Event.date).all()
return [format_event_response(event, db) for event in events]
@@ -94,7 +94,7 @@ async def get_past_events(
current_user: User = Depends(get_current_active_user)
):
"""Get only past events."""
- events = db.query(Event).filter(
+ events = db.query(Event).options(joinedload(Event.creator)).filter(
Event.date < datetime.utcnow()
).order_by(Event.date.desc()).all()
return [format_event_response(event, db) for event in events]
@@ -204,6 +204,9 @@ def format_event_response(event: Event, db: Session) -> dict:
participations = []
present_count = absent_count = maybe_count = pending_count = 0
+ # Get creator user directly
+ creator = db.query(User).filter(User.id == event.creator_id).first()
+
for p in event.participations:
user = db.query(User).filter(User.id == p.user_id).first()
participations.append({
@@ -235,7 +238,8 @@ def format_event_response(event: Event, db: Session) -> dict:
"cover_image": event.cover_image,
"created_at": event.created_at,
"updated_at": event.updated_at,
- "creator_name": event.creator.full_name,
+ "creator_name": creator.full_name if creator else "Unknown",
+ "creator_avatar": creator.avatar_url if creator else None,
"participations": participations,
"present_count": present_count,
"absent_count": absent_count,
diff --git a/backend/api/routers/information.py b/backend/api/routers/information.py
old mode 100644
new mode 100755
diff --git a/backend/api/routers/notifications.py b/backend/api/routers/notifications.py
old mode 100644
new mode 100755
diff --git a/backend/api/routers/posts.py b/backend/api/routers/posts.py
old mode 100644
new mode 100755
diff --git a/backend/api/routers/settings.py b/backend/api/routers/settings.py
old mode 100644
new mode 100755
index edfd405..5de4e80
--- a/backend/api/routers/settings.py
+++ b/backend/api/routers/settings.py
@@ -40,7 +40,7 @@ async def get_upload_limits(
db: Session = Depends(get_db),
current_user: User = Depends(get_admin_user)
):
- """Get current upload limits configuration."""
+ """Get current upload limits configuration (admin only)."""
settings = db.query(SystemSettings).filter(
SystemSettings.category == "uploads"
).all()
@@ -61,6 +61,28 @@ async def get_upload_limits(
allowed_video_types=settings_dict.get("allowed_video_types", "video/mp4,video/mpeg,video/quicktime,video/webm").split(",")
)
+@router.get("/public/upload-limits", response_model=UploadLimitsResponse)
+async def get_public_upload_limits(
+ db: Session = Depends(get_db)
+):
+ """Get current upload limits configuration (public endpoint - no auth required)."""
+ settings = db.query(SystemSettings).filter(
+ SystemSettings.category == "uploads"
+ ).all()
+
+ # Convertir en dictionnaire pour faciliter l'accès
+ settings_dict = {s.key: s.value for s in settings}
+
+ return UploadLimitsResponse(
+ max_album_size_mb=int(settings_dict.get("max_album_size_mb", "100")),
+ max_vlog_size_mb=int(settings_dict.get("max_vlog_size_mb", "500")),
+ max_image_size_mb=int(settings_dict.get("max_image_size_mb", "10")),
+ max_video_size_mb=int(settings_dict.get("max_video_size_mb", "100")),
+ max_media_per_album=int(settings_dict.get("max_media_per_album", "50")),
+ allowed_image_types=settings_dict.get("allowed_image_types", "image/jpeg,image/png,image/gif,image/webp").split(","),
+ allowed_video_types=settings_dict.get("allowed_video_types", "video/mp4,video/mpeg,video/quicktime,video/webm").split(",")
+ )
+
@router.post("/", response_model=SystemSettingResponse)
async def create_setting(
setting_data: SystemSettingCreate,
diff --git a/backend/api/routers/stats.py b/backend/api/routers/stats.py
old mode 100644
new mode 100755
diff --git a/backend/api/routers/tickets.py b/backend/api/routers/tickets.py
old mode 100644
new mode 100755
diff --git a/backend/api/routers/users.py b/backend/api/routers/users.py
old mode 100644
new mode 100755
diff --git a/backend/api/routers/vlogs.py b/backend/api/routers/vlogs.py
old mode 100644
new mode 100755
diff --git a/backend/app.py b/backend/app.py
old mode 100644
new mode 100755
index 2e0ebb1..a56c125
--- a/backend/app.py
+++ b/backend/app.py
@@ -194,7 +194,7 @@ app = FastAPI(
# Configure CORS
app.add_middleware(
CORSMiddleware,
- allow_origins=settings.CORS_ORIGINS,
+ allow_origins=settings.CORS_ORIGINS_LIST,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
diff --git a/backend/config/database.py b/backend/config/database.py
old mode 100644
new mode 100755
diff --git a/backend/config/settings.py b/backend/config/settings.py
old mode 100644
new mode 100755
index 94705bd..6aac893
--- a/backend/config/settings.py
+++ b/backend/config/settings.py
@@ -1,37 +1,118 @@
from typing import List
import os
+from pathlib import Path
class Settings:
- # Database
- DATABASE_URL: str = os.getenv("DATABASE_URL", "postgresql://lediscord_user:lediscord_password@postgres:5432/lediscord")
+ """Configuration principale avec variables d'environnement obligatoires"""
- # JWT
- JWT_SECRET_KEY: str = "your-super-secret-jwt-key-change-me"
- JWT_ALGORITHM: str = "HS256"
- JWT_EXPIRATION_MINUTES: int = 10080 # 7 days
+ # Environnement - OBLIGATOIRE
+ ENVIRONMENT: str = os.getenv("ENVIRONMENT")
+ if not ENVIRONMENT:
+ raise ValueError("ENVIRONMENT variable is required. Use .env.local, .env.development, or .env.production")
+
+ # Debug et reload
+ DEBUG: bool = os.getenv("DEBUG", "false").lower() == "true"
+ RELOAD: bool = os.getenv("RELOAD", "false").lower() == "true"
+
+ # Database - OBLIGATOIRE
+ DATABASE_URL: str = os.getenv("DATABASE_URL")
+ if not DATABASE_URL:
+ raise ValueError("DATABASE_URL variable is required")
+
+ # JWT - OBLIGATOIRE
+ JWT_SECRET_KEY: str = os.getenv("JWT_SECRET_KEY")
+ if not JWT_SECRET_KEY:
+ raise ValueError("JWT_SECRET_KEY variable is required")
+
+ JWT_ALGORITHM: str = os.getenv("JWT_ALGORITHM", "HS256")
+ JWT_EXPIRATION_MINUTES: int = int(os.getenv("JWT_EXPIRATION_MINUTES", "10080"))
# Upload
- UPLOAD_PATH: str = "/app/uploads"
- MAX_UPLOAD_SIZE: int = 100 * 1024 * 1024 # 100MB
- ALLOWED_IMAGE_TYPES: List[str] = ["image/jpeg", "image/png", "image/gif", "image/webp"]
- ALLOWED_VIDEO_TYPES: List[str] = ["video/mp4", "video/mpeg", "video/quicktime", "video/webm"]
+ UPLOAD_PATH: str = os.getenv("UPLOAD_PATH", "./uploads")
+ MAX_UPLOAD_SIZE: int = int(os.getenv("MAX_UPLOAD_SIZE", "104857600"))
+ ALLOWED_IMAGE_TYPES: List[str] = os.getenv("ALLOWED_IMAGE_TYPES", "image/jpeg,image/png,image/gif,image/webp").split(",")
+ ALLOWED_VIDEO_TYPES: List[str] = os.getenv("ALLOWED_VIDEO_TYPES", "video/mp4,video/mpeg,video/quicktime,video/webm").split(",")
- # CORS - Fixed list, no environment parsing
- CORS_ORIGINS: List[str] = ["http://localhost:5173", "http://localhost:3000"]
+ # CORS - OBLIGATOIRE
+ CORS_ORIGINS: str = os.getenv("CORS_ORIGINS")
+ if not CORS_ORIGINS:
+ raise ValueError("CORS_ORIGINS variable is required")
+ CORS_ORIGINS_LIST: List[str] = CORS_ORIGINS.split(",")
# Email
- SMTP_HOST: str = "smtp.gmail.com"
- SMTP_PORT: int = 587
- SMTP_USER: str = ""
- SMTP_PASSWORD: str = ""
- SMTP_FROM: str = "noreply@lediscord.com"
+ SMTP_HOST: str = os.getenv("SMTP_HOST", "smtp.gmail.com")
+ SMTP_PORT: int = int(os.getenv("SMTP_PORT", "587"))
+ SMTP_USER: str = os.getenv("SMTP_USER", "")
+ SMTP_PASSWORD: str = os.getenv("SMTP_PASSWORD", "")
+ SMTP_FROM: str = os.getenv("SMTP_FROM", "noreply@lediscord.com")
- # Admin
- ADMIN_EMAIL: str = "admin@lediscord.com"
- ADMIN_PASSWORD: str = "admin123"
+ # Admin - OBLIGATOIRE
+ ADMIN_EMAIL: str = os.getenv("ADMIN_EMAIL")
+ if not ADMIN_EMAIL:
+ raise ValueError("ADMIN_EMAIL variable is required")
+
+ ADMIN_PASSWORD: str = os.getenv("ADMIN_PASSWORD")
+ if not ADMIN_PASSWORD:
+ raise ValueError("ADMIN_PASSWORD variable is required")
# App
- APP_NAME: str = "LeDiscord"
- APP_URL: str = "http://localhost:5173"
+ APP_NAME: str = os.getenv("APP_NAME", "LeDiscord")
+ APP_URL: str = os.getenv("APP_URL", "http://localhost:5173")
+
+ # Logging
+ LOG_LEVEL: str = os.getenv("LOG_LEVEL", "INFO" if ENVIRONMENT == "production" else "DEBUG")
+
+ # Performance
+ WORKERS: int = int(os.getenv("WORKERS", "1" if ENVIRONMENT in ["local", "development"] else "4"))
+
+ # Sécurité (production uniquement)
+ SECURE_COOKIES: bool = os.getenv("SECURE_COOKIES", "false").lower() == "true"
+ SECURE_HEADERS: bool = os.getenv("SECURE_HEADERS", "false").lower() == "true"
+
+ def __str__(self) -> str:
+ """Représentation lisible de la configuration"""
+ return f"""
+🔧 Configuration LeDiscord - Environnement: {self.ENVIRONMENT.upper()}
+ 📊 Debug: {self.DEBUG}
+ 🔄 Reload: {self.RELOAD}
+ 🌐 CORS Origins: {', '.join(self.CORS_ORIGINS_LIST)}
+ 🗄️ Database: {self.DATABASE_URL.split('@')[1] if '@' in self.DATABASE_URL else 'Unknown'}
+ 📁 Upload Path: {self.UPLOAD_PATH}
+ 📝 Log Level: {self.LOG_LEVEL}
+ 🚀 Workers: {self.WORKERS}
+ """
+
+ def validate(self) -> bool:
+ """Valide la configuration"""
+ required_vars = [
+ "ENVIRONMENT",
+ "DATABASE_URL",
+ "JWT_SECRET_KEY",
+ "CORS_ORIGINS",
+ "ADMIN_EMAIL",
+ "ADMIN_PASSWORD"
+ ]
+
+ for var in required_vars:
+ if not getattr(self, var):
+ print(f"❌ Configuration invalide: {var} est manquant")
+ return False
+
+ print("✅ Configuration validée avec succès")
+ return True
-settings = Settings()
+# Instance globale
+try:
+ settings = Settings()
+except ValueError as e:
+ print(f"❌ Erreur de configuration: {e}")
+ print("💡 Assurez-vous d'utiliser un fichier d'environnement spécifique:")
+ print(" - .env.local pour le développement local")
+ print(" - .env.development pour l'environnement de développement")
+ print(" - .env.production pour la production")
+ raise
+
+# Validation automatique au démarrage
+if __name__ == "__main__":
+ print(settings)
+ settings.validate()
diff --git a/backend/models/__init__.py b/backend/models/__init__.py
old mode 100644
new mode 100755
diff --git a/backend/models/album.py b/backend/models/album.py
old mode 100644
new mode 100755
diff --git a/backend/models/event.py b/backend/models/event.py
old mode 100644
new mode 100755
diff --git a/backend/models/information.py b/backend/models/information.py
old mode 100644
new mode 100755
diff --git a/backend/models/notification.py b/backend/models/notification.py
old mode 100644
new mode 100755
diff --git a/backend/models/post.py b/backend/models/post.py
old mode 100644
new mode 100755
diff --git a/backend/models/settings.py b/backend/models/settings.py
old mode 100644
new mode 100755
diff --git a/backend/models/ticket.py b/backend/models/ticket.py
old mode 100644
new mode 100755
diff --git a/backend/models/user.py b/backend/models/user.py
old mode 100644
new mode 100755
diff --git a/backend/models/vlog.py b/backend/models/vlog.py
old mode 100644
new mode 100755
diff --git a/backend/requirements.txt b/backend/requirements.txt
old mode 100644
new mode 100755
diff --git a/backend/schemas/__init__.py b/backend/schemas/__init__.py
old mode 100644
new mode 100755
diff --git a/backend/schemas/album.py b/backend/schemas/album.py
old mode 100644
new mode 100755
diff --git a/backend/schemas/event.py b/backend/schemas/event.py
old mode 100644
new mode 100755
index 4461228..d421064
--- a/backend/schemas/event.py
+++ b/backend/schemas/event.py
@@ -40,6 +40,7 @@ class EventResponse(EventBase):
id: int
creator_id: int
creator_name: str
+ creator_avatar: Optional[str] = None
cover_image: Optional[str]
created_at: datetime
participations: List[ParticipationResponse] = []
diff --git a/backend/schemas/information.py b/backend/schemas/information.py
old mode 100644
new mode 100755
diff --git a/backend/schemas/notification.py b/backend/schemas/notification.py
old mode 100644
new mode 100755
diff --git a/backend/schemas/post.py b/backend/schemas/post.py
old mode 100644
new mode 100755
diff --git a/backend/schemas/settings.py b/backend/schemas/settings.py
old mode 100644
new mode 100755
diff --git a/backend/schemas/ticket.py b/backend/schemas/ticket.py
old mode 100644
new mode 100755
diff --git a/backend/schemas/user.py b/backend/schemas/user.py
old mode 100644
new mode 100755
diff --git a/backend/schemas/vlog.py b/backend/schemas/vlog.py
old mode 100644
new mode 100755
diff --git a/backend/test_config.py b/backend/test_config.py
new file mode 100755
index 0000000..7892b1d
--- /dev/null
+++ b/backend/test_config.py
@@ -0,0 +1,84 @@
+#!/usr/bin/env python3
+"""
+Script de test pour vérifier la configuration des environnements
+Usage: python test_config.py [local|development|production]
+"""
+
+import os
+import sys
+from pathlib import Path
+
+def test_environment(env_name: str):
+ """Teste la configuration d'un environnement spécifique"""
+ print(f"🔍 Test de la configuration {env_name.upper()}")
+ print("=" * 50)
+
+ # Définir l'environnement
+ os.environ["ENVIRONMENT"] = env_name
+
+ try:
+ # Importer la configuration
+ from config.settings import settings
+
+ print(f"✅ Configuration chargée avec succès")
+ print(f" Environnement détecté: {settings.ENVIRONMENT}")
+ print(f" Debug: {settings.DEBUG}")
+ print(f" Reload: {settings.RELOAD}")
+ print(f" Log Level: {settings.LOG_LEVEL}")
+ print(f" Workers: {settings.WORKERS}")
+ print(f" CORS Origins: {', '.join(settings.CORS_ORIGINS)}")
+ print(f" Upload Path: {settings.UPLOAD_PATH}")
+ print(f" Database: {settings.DATABASE_URL.split('@')[1] if '@' in settings.DATABASE_URL else 'Unknown'}")
+
+ # Validation
+ if settings.validate():
+ print(f"✅ Configuration {env_name} validée avec succès")
+ else:
+ print(f"❌ Configuration {env_name} invalide")
+
+ except Exception as e:
+ print(f"❌ Erreur lors du chargement de la configuration {env_name}: {e}")
+ return False
+
+ print()
+ return True
+
+def main():
+ """Fonction principale"""
+ print("🚀 Test de configuration LeDiscord Backend")
+ print("=" * 60)
+
+ # Vérifier que nous sommes dans le bon répertoire
+ if not Path("config/settings.py").exists():
+ print("❌ Erreur: Ce script doit être exécuté depuis le répertoire backend/")
+ sys.exit(1)
+
+ # Test des environnements
+ environments = ["local", "development", "production"]
+
+ if len(sys.argv) > 1:
+ env_arg = sys.argv[1].lower()
+ if env_arg in environments:
+ environments = [env_arg]
+ else:
+ print(f"❌ Environnement invalide: {env_arg}")
+ print(f" Environnements valides: {', '.join(environments)}")
+ sys.exit(1)
+
+ success_count = 0
+ for env in environments:
+ if test_environment(env):
+ success_count += 1
+
+ print("=" * 60)
+ print(f"📊 Résultats: {success_count}/{len(environments)} configurations valides")
+
+ if success_count == len(environments):
+ print("🎉 Toutes les configurations sont valides !")
+ return 0
+ else:
+ print("⚠️ Certaines configurations ont des problèmes")
+ return 1
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/backend/utils/email.py b/backend/utils/email.py
old mode 100644
new mode 100755
diff --git a/backend/utils/init_db.py b/backend/utils/init_db.py
old mode 100644
new mode 100755
diff --git a/backend/utils/notification_service.py b/backend/utils/notification_service.py
old mode 100644
new mode 100755
diff --git a/backend/utils/security.py b/backend/utils/security.py
old mode 100644
new mode 100755
diff --git a/backend/utils/settings_service.py b/backend/utils/settings_service.py
old mode 100644
new mode 100755
diff --git a/backend/utils/video_utils.py b/backend/utils/video_utils.py
old mode 100644
new mode 100755
diff --git a/backup/_data/Dockerfile.dev b/backup/_data/Dockerfile.dev
new file mode 100755
index 0000000..b910b39
--- /dev/null
+++ b/backup/_data/Dockerfile.dev
@@ -0,0 +1,30 @@
+FROM node:18-alpine
+
+# Métadonnées
+LABEL maintainer="LeDiscord Team"
+LABEL version="1.0"
+LABEL description="LeDiscord Frontend - Environnement Development"
+
+WORKDIR /app
+
+# Variables d'environnement pour le développement
+ENV NODE_ENV=development
+ENV VITE_ENVIRONMENT=development
+
+# Copy package files first for better caching
+COPY package*.json ./
+
+# Install dependencies
+RUN npm ci
+
+# Copy application files
+COPY . .
+
+# Copy development environment file
+COPY .env.development .env
+
+# Expose port
+EXPOSE 5173
+
+# Run the application in development mode
+CMD ["npm", "run", "dev"]
diff --git a/backup/_data/Dockerfile.prod b/backup/_data/Dockerfile.prod
new file mode 100755
index 0000000..d5b5b81
--- /dev/null
+++ b/backup/_data/Dockerfile.prod
@@ -0,0 +1,50 @@
+# Multi-stage build pour la production
+FROM node:18-alpine AS builder
+
+# Métadonnées
+LABEL maintainer="LeDiscord Team"
+LABEL version="1.0"
+LABEL description="LeDiscord Frontend - Build Production"
+
+WORKDIR /app
+
+# Variables d'environnement pour la production
+ENV NODE_ENV=production
+ENV VITE_ENVIRONMENT=production
+
+# Copy package files first for better caching
+COPY package*.json ./
+
+# Install dependencies
+RUN npm ci
+
+# Copy application files
+COPY . .
+
+# Copy production environment file
+COPY .env.production .env
+
+# Debug: Vérifier le contenu du fichier .env
+RUN echo "=== Contenu du fichier .env ===" && cat .env
+RUN echo "=== Variables d'environnement ===" && env | grep VITE
+
+# Charger les variables d'environnement depuis le fichier .env (en filtrant les commentaires)
+RUN export $(cat .env | grep -v '^#' | grep -v '^$' | xargs) && echo "=== Variables après export ===" && env | grep VITE
+
+# Build the application avec les variables d'environnement chargées
+RUN export $(cat .env | grep -v '^#' | grep -v '^$' | xargs) && npm run build
+
+# Production stage
+FROM nginx:alpine
+
+# Copy built application
+COPY --from=builder /app/dist /usr/share/nginx/html
+
+# Copy nginx configuration
+COPY nginx-frontend.conf /etc/nginx/nginx.conf
+
+# Expose port
+EXPOSE 80
+
+# Start nginx
+CMD ["nginx", "-g", "daemon off;"]
diff --git a/backup/_data/index.html b/backup/_data/index.html
new file mode 100755
index 0000000..1eae32e
--- /dev/null
+++ b/backup/_data/index.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ LeDiscord - Notre espace
+
+
+
+
+
+
+
+
+
diff --git a/backup/_data/nginx-frontend.conf b/backup/_data/nginx-frontend.conf
new file mode 100755
index 0000000..3e8d41a
--- /dev/null
+++ b/backup/_data/nginx-frontend.conf
@@ -0,0 +1,64 @@
+events {
+ worker_connections 1024;
+}
+
+http {
+ include /etc/nginx/mime.types;
+ default_type application/octet-stream;
+
+ # Logging
+ log_format main '$remote_addr - $remote_user [$time_local] "$request" '
+ '$status $body_bytes_sent "$http_referer" '
+ '"$http_user_agent" "$http_x_forwarded_for"';
+
+ access_log /var/log/nginx/access.log main;
+ error_log /var/log/nginx/error.log warn;
+
+ # Basic settings
+ sendfile on;
+ tcp_nopush on;
+ tcp_nodelay on;
+ keepalive_timeout 65;
+ types_hash_max_size 2048;
+
+ # Gzip compression
+ gzip on;
+ gzip_vary on;
+ gzip_min_length 1024;
+ gzip_proxied expired no-cache no-store private auth;
+ gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss;
+
+ server {
+ listen 80;
+ server_name localhost;
+
+ root /usr/share/nginx/html;
+ index index.html;
+
+ # Static files with long cache
+ location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
+ expires 1y;
+ add_header Cache-Control "public, immutable";
+ try_files $uri =404;
+ }
+
+ # Vue Router - SPA fallback
+ location / {
+ try_files $uri $uri/ /index.html;
+ add_header Cache-Control "no-cache, no-store, must-revalidate";
+ }
+
+ # Health check
+ location /health {
+ access_log off;
+ return 200 "healthy\n";
+ add_header Content-Type text/plain;
+ }
+
+ # Security headers
+ add_header X-Frame-Options "SAMEORIGIN" always;
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header X-XSS-Protection "1; mode=block" always;
+ add_header Referrer-Policy "strict-origin-when-cross-origin" always;
+ }
+}
diff --git a/backup/_data/package-lock.json b/backup/_data/package-lock.json
new file mode 100755
index 0000000..66f5469
--- /dev/null
+++ b/backup/_data/package-lock.json
@@ -0,0 +1,3396 @@
+{
+ "name": "lediscord-frontend",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "lediscord-frontend",
+ "version": "1.0.0",
+ "dependencies": {
+ "@vueuse/core": "^10.6.1",
+ "axios": "^1.6.2",
+ "date-fns": "^2.30.0",
+ "lucide-vue-next": "^0.294.0",
+ "pinia": "^2.1.7",
+ "video.js": "^8.6.1",
+ "vue": "^3.3.8",
+ "vue-router": "^4.2.5",
+ "vue-toastification": "^2.0.0-rc.5"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "^4.5.0",
+ "autoprefixer": "^10.4.16",
+ "postcss": "^8.4.31",
+ "tailwindcss": "^3.3.5",
+ "terser": "^5.43.1",
+ "vite": "^5.0.0"
+ }
+ },
+ "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/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz",
+ "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.2"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz",
+ "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.28.2",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz",
+ "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "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/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==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.30",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz",
+ "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "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/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.47.1.tgz",
+ "integrity": "sha512-lTahKRJip0knffA/GTNFJMrToD+CM+JJ+Qt5kjzBK/sFQ0EWqfKW3AYQSlZXN98tX0lx66083U9JYIMioMMK7g==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.47.1.tgz",
+ "integrity": "sha512-uqxkb3RJLzlBbh/bbNQ4r7YpSZnjgMgyoEOY7Fy6GCbelkDSAzeiogxMG9TfLsBbqmGsdDObo3mzGqa8hps4MA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.47.1.tgz",
+ "integrity": "sha512-tV6reObmxBDS4DDyLzTDIpymthNlxrLBGAoQx6m2a7eifSNEZdkXQl1PE4ZjCkEDPVgNXSzND/k9AQ3mC4IOEQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.47.1.tgz",
+ "integrity": "sha512-XuJRPTnMk1lwsSnS3vYyVMu4x/+WIw1MMSiqj5C4j3QOWsMzbJEK90zG+SWV1h0B1ABGCQ0UZUjti+TQK35uHQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.47.1.tgz",
+ "integrity": "sha512-79BAm8Ag/tmJ5asCqgOXsb3WY28Rdd5Lxj8ONiQzWzy9LvWORd5qVuOnjlqiWWZJw+dWewEktZb5yiM1DLLaHw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.47.1.tgz",
+ "integrity": "sha512-OQ2/ZDGzdOOlyfqBiip0ZX/jVFekzYrGtUsqAfLDbWy0jh1PUU18+jYp8UMpqhly5ltEqotc2miLngf9FPSWIA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.47.1.tgz",
+ "integrity": "sha512-HZZBXJL1udxlCVvoVadstgiU26seKkHbbAMLg7680gAcMnRNP9SAwTMVet02ANA94kXEI2VhBnXs4e5nf7KG2A==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.47.1.tgz",
+ "integrity": "sha512-sZ5p2I9UA7T950JmuZ3pgdKA6+RTBr+0FpK427ExW0t7n+QwYOcmDTK/aRlzoBrWyTpJNlS3kacgSlSTUg6P/Q==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.47.1.tgz",
+ "integrity": "sha512-3hBFoqPyU89Dyf1mQRXCdpc6qC6At3LV6jbbIOZd72jcx7xNk3aAp+EjzAtN6sDlmHFzsDJN5yeUySvorWeRXA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.47.1.tgz",
+ "integrity": "sha512-49J4FnMHfGodJWPw73Ve+/hsPjZgcXQGkmqBGZFvltzBKRS+cvMiWNLadOMXKGnYRhs1ToTGM0sItKISoSGUNA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.47.1.tgz",
+ "integrity": "sha512-4yYU8p7AneEpQkRX03pbpLmE21z5JNys16F1BZBZg5fP9rIlb0TkeQjn5du5w4agConCCEoYIG57sNxjryHEGg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.47.1.tgz",
+ "integrity": "sha512-fAiq+J28l2YMWgC39jz/zPi2jqc0y3GSRo1yyxlBHt6UN0yYgnegHSRPa3pnHS5amT/efXQrm0ug5+aNEu9UuQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.47.1.tgz",
+ "integrity": "sha512-daoT0PMENNdjVYYU9xec30Y2prb1AbEIbb64sqkcQcSaR0zYuKkoPuhIztfxuqN82KYCKKrj+tQe4Gi7OSm1ow==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.47.1.tgz",
+ "integrity": "sha512-JNyXaAhWtdzfXu5pUcHAuNwGQKevR+6z/poYQKVW+pLaYOj9G1meYc57/1Xv2u4uTxfu9qEWmNTjv/H/EpAisw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.47.1.tgz",
+ "integrity": "sha512-U/CHbqKSwEQyZXjCpY43/GLYcTVKEXeRHw0rMBJP7fP3x6WpYG4LTJWR3ic6TeYKX6ZK7mrhltP4ppolyVhLVQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.47.1.tgz",
+ "integrity": "sha512-uTLEakjxOTElfeZIGWkC34u2auLHB1AYS6wBjPGI00bWdxdLcCzK5awjs25YXpqB9lS8S0vbO0t9ZcBeNibA7g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.47.1.tgz",
+ "integrity": "sha512-Ft+d/9DXs30BK7CHCTX11FtQGHUdpNDLJW0HHLign4lgMgBcPFN3NkdIXhC5r9iwsMwYreBBc4Rho5ieOmKNVQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.47.1.tgz",
+ "integrity": "sha512-N9X5WqGYzZnjGAFsKSfYFtAShYjwOmFJoWbLg3dYixZOZqU7hdMq+/xyS14zKLhFhZDhP9VfkzQnsdk0ZDS9IA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.47.1.tgz",
+ "integrity": "sha512-O+KcfeCORZADEY8oQJk4HK8wtEOCRE4MdOkb8qGZQNun3jzmj2nmhV/B/ZaaZOkPmJyvm/gW9n0gsB4eRa1eiQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.47.1.tgz",
+ "integrity": "sha512-CpKnYa8eHthJa3c+C38v/E+/KZyF1Jdh2Cz3DyKZqEWYgrM1IHFArXNWvBLPQCKUEsAqqKX27tTqVEFbDNUcOA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "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/web-bluetooth": {
+ "version": "0.0.20",
+ "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
+ "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==",
+ "license": "MIT"
+ },
+ "node_modules/@videojs/http-streaming": {
+ "version": "3.17.2",
+ "resolved": "https://registry.npmjs.org/@videojs/http-streaming/-/http-streaming-3.17.2.tgz",
+ "integrity": "sha512-VBQ3W4wnKnVKb/limLdtSD2rAd5cmHN70xoMf4OmuDd0t2kfJX04G+sfw6u2j8oOm2BXYM9E1f4acHruqKnM1g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "@videojs/vhs-utils": "^4.1.1",
+ "aes-decrypter": "^4.0.2",
+ "global": "^4.4.0",
+ "m3u8-parser": "^7.2.0",
+ "mpd-parser": "^1.3.1",
+ "mux.js": "7.1.0",
+ "video.js": "^7 || ^8"
+ },
+ "engines": {
+ "node": ">=8",
+ "npm": ">=5"
+ },
+ "peerDependencies": {
+ "video.js": "^8.19.0"
+ }
+ },
+ "node_modules/@videojs/vhs-utils": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-4.1.1.tgz",
+ "integrity": "sha512-5iLX6sR2ownbv4Mtejw6Ax+naosGvoT9kY+gcuHzANyUZZ+4NpeNdKMUhb6ag0acYej1Y7cmr/F2+4PrggMiVA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "global": "^4.4.0"
+ },
+ "engines": {
+ "node": ">=8",
+ "npm": ">=5"
+ }
+ },
+ "node_modules/@videojs/xhr": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@videojs/xhr/-/xhr-2.7.0.tgz",
+ "integrity": "sha512-giab+EVRanChIupZK7gXjHy90y3nncA2phIOyG3Ne5fvpiMJzvqYwiTOnEVW2S4CoYcuKJkomat7bMXA/UoUZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "global": "~4.4.0",
+ "is-function": "^1.0.1"
+ }
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz",
+ "integrity": "sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.0.0 || ^5.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.19.tgz",
+ "integrity": "sha512-/afpyvlkrSNYbPo94Qu8GtIOWS+g5TRdOvs6XZNw6pWQQmj5pBgSZvEPOIZlqWq0YvoUhDDQaQ2TnzuJdOV4hA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.3",
+ "@vue/shared": "3.5.19",
+ "entities": "^4.5.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.19.tgz",
+ "integrity": "sha512-Drs6rPHQZx/pN9S6ml3Z3K/TWCIRPvzG2B/o5kFK9X0MNHt8/E+38tiRfojufrYBfA6FQUFB2qBBRXlcSXWtOA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.19",
+ "@vue/shared": "3.5.19"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.19.tgz",
+ "integrity": "sha512-YWCm1CYaJ+2RvNmhCwI7t3I3nU+hOrWGWMsn+Z/kmm1jy5iinnVtlmkiZwbLlbV1SRizX7vHsc0/bG5dj0zRTg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.3",
+ "@vue/compiler-core": "3.5.19",
+ "@vue/compiler-dom": "3.5.19",
+ "@vue/compiler-ssr": "3.5.19",
+ "@vue/shared": "3.5.19",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.17",
+ "postcss": "^8.5.6",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.19.tgz",
+ "integrity": "sha512-/wx0VZtkWOPdiQLWPeQeqpHWR/LuNC7bHfSX7OayBTtUy8wur6vT6EQIX6Et86aED6J+y8tTw43qo2uoqGg5sw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.19",
+ "@vue/shared": "3.5.19"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "6.6.4",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+ "license": "MIT"
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.19.tgz",
+ "integrity": "sha512-4bueZg2qs5MSsK2dQk3sssV0cfvxb/QZntTC8v7J448GLgmfPkQ+27aDjlt40+XFqOwUq5yRxK5uQh14Fc9eVA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/shared": "3.5.19"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.19.tgz",
+ "integrity": "sha512-TaooCr8Hge1sWjLSyhdubnuofs3shhzZGfyD11gFolZrny76drPwBVQj28/z/4+msSFb18tOIg6VVVgf9/IbIA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.19",
+ "@vue/shared": "3.5.19"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.19.tgz",
+ "integrity": "sha512-qmahqeok6ztuUTmV8lqd7N9ymbBzctNF885n8gL3xdCC1u2RnM/coX16Via0AiONQXUoYpxPojL3U1IsDgSWUQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.19",
+ "@vue/runtime-core": "3.5.19",
+ "@vue/shared": "3.5.19",
+ "csstype": "^3.1.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.19.tgz",
+ "integrity": "sha512-ZJ/zV9SQuaIO+BEEVq/2a6fipyrSYfjKMU3267bPUk+oTx/hZq3RzV7VCh0Unlppt39Bvh6+NzxeopIFv4HJNg==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.5.19",
+ "@vue/shared": "3.5.19"
+ },
+ "peerDependencies": {
+ "vue": "3.5.19"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.19.tgz",
+ "integrity": "sha512-IhXCOn08wgKrLQxRFKKlSacWg4Goi1BolrdEeLYn6tgHjJNXVrWJ5nzoxZqNwl5p88aLlQ8LOaoMa3AYvaKJ/Q==",
+ "license": "MIT"
+ },
+ "node_modules/@vueuse/core": {
+ "version": "10.11.1",
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz",
+ "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.20",
+ "@vueuse/metadata": "10.11.1",
+ "@vueuse/shared": "10.11.1",
+ "vue-demi": ">=0.14.8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/metadata": {
+ "version": "10.11.1",
+ "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz",
+ "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared": {
+ "version": "10.11.1",
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz",
+ "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==",
+ "license": "MIT",
+ "dependencies": {
+ "vue-demi": ">=0.14.8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@xmldom/xmldom": {
+ "version": "0.8.11",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz",
+ "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/aes-decrypter": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/aes-decrypter/-/aes-decrypter-4.0.2.tgz",
+ "integrity": "sha512-lc+/9s6iJvuaRe5qDlMTpCFjnwpkeOXp8qP3oiZ5jsj1MRg+SBVUmmICrhxHvc8OELSmc+fEyyxAuppY6hrWzw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "@videojs/vhs-utils": "^4.1.1",
+ "global": "^4.4.0",
+ "pkcs7": "^1.0.4"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz",
+ "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "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/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/autoprefixer": {
+ "version": "10.4.21",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
+ "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
+ "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.24.4",
+ "caniuse-lite": "^1.0.30001702",
+ "fraction.js": "^4.3.7",
+ "normalize-range": "^0.1.2",
+ "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/axios": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz",
+ "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.4",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/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/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/browserslist": {
+ "version": "4.25.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.3.tgz",
+ "integrity": "sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==",
+ "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": {
+ "caniuse-lite": "^1.0.30001735",
+ "electron-to-chromium": "^1.5.204",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "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/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/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-lite": {
+ "version": "1.0.30001736",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001736.tgz",
+ "integrity": "sha512-ImpN5gLEY8gWeqfLUyEF4b7mYWcYoR2Si1VhnrbM4JizRFmfGaAQ12PhNykq6nvI4XvKLrsp8Xde74D5phJOSw==",
+ "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/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/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/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": "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/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/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/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "license": "MIT"
+ },
+ "node_modules/date-fns": {
+ "version": "2.30.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
+ "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.21.0"
+ },
+ "engines": {
+ "node": ">=0.11"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/date-fns"
+ }
+ },
+ "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/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/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/dom-walk": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
+ "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
+ },
+ "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/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.208",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.208.tgz",
+ "integrity": "sha512-ozZyibehoe7tOhNaf16lKmljVf+3npZcJIEbJRVftVsmAg5TeA1mGS9dVCZzOwr2xT7xK15V0p7+GZqSPgkuPg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "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/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/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/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/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "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/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "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/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/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
+ "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
+ "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/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "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/global": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
+ "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
+ "license": "MIT",
+ "dependencies": {
+ "min-document": "^2.19.0",
+ "process": "^0.11.10"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-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/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-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-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-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-function": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
+ "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==",
+ "license": "MIT"
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/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/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "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/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/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/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/lucide-vue-next": {
+ "version": "0.294.0",
+ "resolved": "https://registry.npmjs.org/lucide-vue-next/-/lucide-vue-next-0.294.0.tgz",
+ "integrity": "sha512-bcUuGyLJoq9ExyozROMezdaczK2loP3emYb8PvS7HhZ56rUJVOv5hJgTmWfrfr8vJE7J69ImoMyPTwmUHF198w==",
+ "license": "ISC",
+ "peerDependencies": {
+ "vue": ">=3.0.1"
+ }
+ },
+ "node_modules/m3u8-parser": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-7.2.0.tgz",
+ "integrity": "sha512-CRatFqpjVtMiMaKXxNvuI3I++vUumIXVVT/JpCpdU/FynV/ceVw1qpPyyBNindL+JlPMSesx+WX1QJaZEJSaMQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "@videojs/vhs-utils": "^4.1.1",
+ "global": "^4.4.0"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.17",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
+ "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/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/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-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/min-document": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
+ "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==",
+ "dependencies": {
+ "dom-walk": "^0.1.0"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/mpd-parser": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mpd-parser/-/mpd-parser-1.3.1.tgz",
+ "integrity": "sha512-1FuyEWI5k2HcmhS1HkKnUAQV7yFPfXPht2DnRRGtoiiAAW+ESTbtEXIDpRkwdU+XyrQuwrIym7UkoPKsZ0SyFw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "@videojs/vhs-utils": "^4.0.0",
+ "@xmldom/xmldom": "^0.8.3",
+ "global": "^4.4.0"
+ },
+ "bin": {
+ "mpd-to-m3u8-json": "bin/parse.js"
+ }
+ },
+ "node_modules/mux.js": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-7.1.0.tgz",
+ "integrity": "sha512-NTxawK/BBELJrYsZThEulyUMDVlLizKdxyAsMuzoCD1eFj97BVaA8D/CvKsKu6FOLYkFojN5CbM9h++ZTZtknA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/runtime": "^7.11.2",
+ "global": "^4.4.0"
+ },
+ "bin": {
+ "muxjs-transmux": "bin/transmux.js"
+ },
+ "engines": {
+ "node": ">=8",
+ "npm": ">=5"
+ }
+ },
+ "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==",
+ "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/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "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-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "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/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "dev": true,
+ "license": "BlueOak-1.0.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-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "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/pinia": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.3.1.tgz",
+ "integrity": "sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-api": "^6.6.3",
+ "vue-demi": "^0.14.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.4.4",
+ "vue": "^2.7.0 || ^3.5.11"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "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/pkcs7": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/pkcs7/-/pkcs7-1.0.4.tgz",
+ "integrity": "sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5"
+ },
+ "bin": {
+ "pkcs7": "bin/cli.js"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-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-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "lilconfig": "^3.0.0",
+ "yaml": "^2.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "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-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-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/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "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/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/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/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/resolve": {
+ "version": "1.22.10",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.16.0",
+ "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/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/rollup": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.47.1.tgz",
+ "integrity": "sha512-iasGAQoZ5dWDzULEUX3jiW0oB1qyFOepSyDyoU6S/OhVlDIwj5knI5QBa5RRQ0sK7OE0v+8VIi2JuV+G+3tfNg==",
+ "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.47.1",
+ "@rollup/rollup-android-arm64": "4.47.1",
+ "@rollup/rollup-darwin-arm64": "4.47.1",
+ "@rollup/rollup-darwin-x64": "4.47.1",
+ "@rollup/rollup-freebsd-arm64": "4.47.1",
+ "@rollup/rollup-freebsd-x64": "4.47.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.47.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.47.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.47.1",
+ "@rollup/rollup-linux-arm64-musl": "4.47.1",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.47.1",
+ "@rollup/rollup-linux-ppc64-gnu": "4.47.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.47.1",
+ "@rollup/rollup-linux-riscv64-musl": "4.47.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.47.1",
+ "@rollup/rollup-linux-x64-gnu": "4.47.1",
+ "@rollup/rollup-linux-x64-musl": "4.47.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.47.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.47.1",
+ "@rollup/rollup-win32-x64-msvc": "4.47.1",
+ "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/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/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/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/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-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/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "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-cjs/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/string-width-cjs/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-width-cjs/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-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "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-ansi-cjs/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/sucrase": {
+ "version": "3.35.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "^10.3.10",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "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/tailwindcss": {
+ "version": "3.4.17",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
+ "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==",
+ "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.6",
+ "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",
+ "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/terser": {
+ "version": "5.43.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz",
+ "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.14.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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/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/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/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/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "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/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/video.js": {
+ "version": "8.23.4",
+ "resolved": "https://registry.npmjs.org/video.js/-/video.js-8.23.4.tgz",
+ "integrity": "sha512-qI0VTlYmKzEqRsz1Nppdfcaww4RSxZAq77z2oNSl3cNg2h6do5C8Ffl0KqWQ1OpD8desWXsCrde7tKJ9gGTEyQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "@videojs/http-streaming": "^3.17.2",
+ "@videojs/vhs-utils": "^4.1.1",
+ "@videojs/xhr": "2.7.0",
+ "aes-decrypter": "^4.0.2",
+ "global": "4.4.0",
+ "m3u8-parser": "^7.2.0",
+ "mpd-parser": "^1.3.1",
+ "mux.js": "^7.0.1",
+ "videojs-contrib-quality-levels": "4.1.0",
+ "videojs-font": "4.2.0",
+ "videojs-vtt.js": "0.15.5"
+ }
+ },
+ "node_modules/videojs-contrib-quality-levels": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-4.1.0.tgz",
+ "integrity": "sha512-TfrXJJg1Bv4t6TOCMEVMwF/CoS8iENYsWNKip8zfhB5kTcegiFYezEA0eHAJPU64ZC8NQbxQgOwAsYU8VXbOWA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "global": "^4.4.0"
+ },
+ "engines": {
+ "node": ">=16",
+ "npm": ">=8"
+ },
+ "peerDependencies": {
+ "video.js": "^8"
+ }
+ },
+ "node_modules/videojs-font": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-4.2.0.tgz",
+ "integrity": "sha512-YPq+wiKoGy2/M7ccjmlvwi58z2xsykkkfNMyIg4xb7EZQQNwB71hcSsB3o75CqQV7/y5lXkXhI/rsGAS7jfEmQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/videojs-vtt.js": {
+ "version": "0.15.5",
+ "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz",
+ "integrity": "sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "global": "^4.3.1"
+ }
+ },
+ "node_modules/vite": {
+ "version": "5.4.19",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz",
+ "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==",
+ "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/vue": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.19.tgz",
+ "integrity": "sha512-ZRh0HTmw6KChRYWgN8Ox/wi7VhpuGlvMPrHjIsdRbzKNgECFLzy+dKL5z9yGaBSjCpmcfJCbh3I1tNSRmBz2tg==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.19",
+ "@vue/compiler-sfc": "3.5.19",
+ "@vue/runtime-dom": "3.5.19",
+ "@vue/server-renderer": "3.5.19",
+ "@vue/shared": "3.5.19"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-demi": {
+ "version": "0.14.10",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
+ "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-router": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.1.tgz",
+ "integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-api": "^6.6.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/vue-toastification": {
+ "version": "2.0.0-rc.5",
+ "resolved": "https://registry.npmjs.org/vue-toastification/-/vue-toastification-2.0.0-rc.5.tgz",
+ "integrity": "sha512-q73e5jy6gucEO/U+P48hqX+/qyXDozAGmaGgLFm5tXX4wJBcVsnGp4e/iJqlm9xzHETYOilUuwOUje2Qg1JdwA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "vue": "^3.0.2"
+ }
+ },
+ "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/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "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-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/yaml": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
+ "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ }
+ }
+ }
+}
diff --git a/backup/_data/package.json b/backup/_data/package.json
new file mode 100755
index 0000000..1058aee
--- /dev/null
+++ b/backup/_data/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "lediscord-frontend",
+ "version": "1.0.0",
+ "private": true,
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@vueuse/core": "^10.6.1",
+ "axios": "^1.6.2",
+ "date-fns": "^2.30.0",
+ "lucide-vue-next": "^0.294.0",
+ "pinia": "^2.1.7",
+ "video.js": "^8.6.1",
+ "vue": "^3.3.8",
+ "vue-router": "^4.2.5",
+ "vue-toastification": "^2.0.0-rc.5"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "^4.5.0",
+ "autoprefixer": "^10.4.16",
+ "postcss": "^8.4.31",
+ "tailwindcss": "^3.3.5",
+ "terser": "^5.43.1",
+ "vite": "^5.0.0"
+ }
+}
diff --git a/backup/_data/postcss.config.js b/backup/_data/postcss.config.js
new file mode 100755
index 0000000..33ad091
--- /dev/null
+++ b/backup/_data/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+}
diff --git a/backup/_data/public/favicon.ico b/backup/_data/public/favicon.ico
new file mode 100644
index 0000000..2adbbd4
Binary files /dev/null and b/backup/_data/public/favicon.ico differ
diff --git a/backup/_data/public/logo_lediscord.png b/backup/_data/public/logo_lediscord.png
new file mode 100644
index 0000000..f080311
Binary files /dev/null and b/backup/_data/public/logo_lediscord.png differ
diff --git a/backup/_data/src/App.vue b/backup/_data/src/App.vue
new file mode 100755
index 0000000..cb55266
--- /dev/null
+++ b/backup/_data/src/App.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/backup/_data/src/components/EnvironmentDebug.vue b/backup/_data/src/components/EnvironmentDebug.vue
new file mode 100755
index 0000000..bdf0a1a
--- /dev/null
+++ b/backup/_data/src/components/EnvironmentDebug.vue
@@ -0,0 +1,62 @@
+
+
+
+
+ {{ environment.toUpperCase() }}
+
+
+
API: {{ apiUrl }}
+
App: {{ appUrl }}
+
Build: {{ buildTime }}
+
Router: {{ routerStatus }}
+
VITE_API_URL: {{ viteApiUrl }}
+
NODE_ENV: {{ nodeEnv }}
+
+
+
+
+
+
+
diff --git a/backup/_data/src/components/LoadingLogo.vue b/backup/_data/src/components/LoadingLogo.vue
new file mode 100644
index 0000000..05630f9
--- /dev/null
+++ b/backup/_data/src/components/LoadingLogo.vue
@@ -0,0 +1,50 @@
+
+
+
+
+
{{ text || 'Chargement...' }}
+
+
+
+
diff --git a/backup/_data/src/components/MentionInput.vue b/backup/_data/src/components/MentionInput.vue
new file mode 100755
index 0000000..7268e9c
--- /dev/null
+++ b/backup/_data/src/components/MentionInput.vue
@@ -0,0 +1,230 @@
+
+
+
+
+
+
+
diff --git a/backup/_data/src/components/Mentions.vue b/backup/_data/src/components/Mentions.vue
new file mode 100755
index 0000000..518aed7
--- /dev/null
+++ b/backup/_data/src/components/Mentions.vue
@@ -0,0 +1,79 @@
+
+
+
+
+ @{{ part.username }}
+
+ {{ part.text }}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/backup/_data/src/components/TicketFloatingButton.vue b/backup/_data/src/components/TicketFloatingButton.vue
new file mode 100755
index 0000000..d27cf57
--- /dev/null
+++ b/backup/_data/src/components/TicketFloatingButton.vue
@@ -0,0 +1,226 @@
+
+
+
+
+
+
+
+
+
+
Nouveau ticket
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/backup/_data/src/components/UserAvatar.vue b/backup/_data/src/components/UserAvatar.vue
new file mode 100755
index 0000000..6c9efa8
--- /dev/null
+++ b/backup/_data/src/components/UserAvatar.vue
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
{{ userName }}
+
@{{ username }}
+
+
+
+
+
diff --git a/backup/_data/src/components/VideoPlayer.vue b/backup/_data/src/components/VideoPlayer.vue
new file mode 100755
index 0000000..3cb45c0
--- /dev/null
+++ b/backup/_data/src/components/VideoPlayer.vue
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+ Pour voir cette vidéo, activez JavaScript et considérez passer à un navigateur web qui
+ supporte la vidéo HTML5 .
+
+
+
+
+
+
+
+
+
+ {{ viewsCount }} vue{{ viewsCount > 1 ? 's' : '' }}
+
+
+
+ {{ formatDuration(duration) }}
+
+
+
+
+
+
+ {{ likesCount }}
+
+
+
+
+ {{ commentsCount }}
+
+
+
+
+
+
+
+
+
diff --git a/backup/_data/src/components/VlogComments.vue b/backup/_data/src/components/VlogComments.vue
new file mode 100755
index 0000000..0058391
--- /dev/null
+++ b/backup/_data/src/components/VlogComments.vue
@@ -0,0 +1,191 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/backup/_data/src/layouts/AuthLayout.vue b/backup/_data/src/layouts/AuthLayout.vue
new file mode 100755
index 0000000..f00515f
--- /dev/null
+++ b/backup/_data/src/layouts/AuthLayout.vue
@@ -0,0 +1,25 @@
+
+
+
+
+
LeDiscord
+
Notre espace privé
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/backup/_data/src/layouts/DefaultLayout.vue b/backup/_data/src/layouts/DefaultLayout.vue
new file mode 100755
index 0000000..7e13008
--- /dev/null
+++ b/backup/_data/src/layouts/DefaultLayout.vue
@@ -0,0 +1,289 @@
+
+
+
+
+
+
+
+
+
+
+ LeDiscord
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ user?.full_name }}
+
+
+
+
+
+
+
+ Mon profil
+
+
+ Statistiques
+
+
+ Informations
+
+
+ Mes tickets
+
+
+ Administration
+
+
+
+
+ Déconnexion
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Notifications
+
+
+
+
+
+
+ Aucune notification
+
+
+
+
+ {{ notifications.length }} notification(s)
+
+ Tout marquer comme lu
+
+
+
+
+
+
+
{{ notification.title }}
+
{{ notification.message }}
+
{{ formatDate(notification.created_at) }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/backup/_data/src/main.js b/backup/_data/src/main.js
new file mode 100755
index 0000000..3479b73
--- /dev/null
+++ b/backup/_data/src/main.js
@@ -0,0 +1,48 @@
+import { createApp, nextTick } from 'vue'
+import { createPinia } from 'pinia'
+import Toast from 'vue-toastification'
+import 'vue-toastification/dist/index.css'
+
+import App from './App.vue'
+import router from './router'
+import './style.css'
+
+// Créer l'application
+const app = createApp(App)
+
+// Créer et configurer Pinia
+const pinia = createPinia()
+
+// Toast configuration
+const toastOptions = {
+ position: 'top-right',
+ timeout: 3000,
+ closeOnClick: true,
+ pauseOnFocusLoss: true,
+ pauseOnHover: true,
+ draggable: true,
+ draggablePercent: 0.6,
+ showCloseButtonOnHover: false,
+ hideProgressBar: false,
+ closeButton: 'button',
+ icon: true,
+ rtl: false
+}
+
+// Installer les plugins dans l'ordre correct
+// IMPORTANT: Pinia doit être installé AVANT le router
+app.use(pinia)
+app.use(Toast, toastOptions)
+
+// Maintenant installer le router
+app.use(router)
+
+// Attendre que le router soit prêt avant de monter l'app
+router.isReady().then(() => {
+ app.mount('#app')
+ console.log('🚀 Application montée avec succès')
+}).catch((error) => {
+ console.error('❌ Erreur lors du montage de l\'application:', error)
+ // Fallback: monter l'app même en cas d'erreur
+ app.mount('#app')
+})
diff --git a/backup/_data/src/router/index.js b/backup/_data/src/router/index.js
new file mode 100755
index 0000000..7dea9ee
--- /dev/null
+++ b/backup/_data/src/router/index.js
@@ -0,0 +1,134 @@
+import { createRouter, createWebHistory } from 'vue-router'
+
+// Views
+import Home from '@/views/Home.vue'
+import Login from '@/views/Login.vue'
+import Register from '@/views/Register.vue'
+import Events from '@/views/Events.vue'
+import EventDetail from '@/views/EventDetail.vue'
+import Albums from '@/views/Albums.vue'
+import AlbumDetail from '@/views/AlbumDetail.vue'
+import Vlogs from '@/views/Vlogs.vue'
+import VlogDetail from '@/views/VlogDetail.vue'
+import Posts from '@/views/Posts.vue'
+import Profile from '@/views/Profile.vue'
+import UserProfile from '@/views/UserProfile.vue'
+import Stats from '@/views/Stats.vue'
+import Admin from '@/views/Admin.vue'
+import Information from '@/views/Information.vue'
+import MyTickets from '@/views/MyTickets.vue'
+
+
+const routes = [
+ {
+ path: '/',
+ name: 'Home',
+ component: Home,
+ meta: { requiresAuth: true }
+ },
+ {
+ path: '/login',
+ name: 'Login',
+ component: Login,
+ meta: { layout: 'auth' }
+ },
+ {
+ path: '/register',
+ name: 'Register',
+ component: Register,
+ meta: { layout: 'auth' }
+ },
+ {
+ path: '/events',
+ name: 'Events',
+ component: Events,
+ meta: { requiresAuth: true }
+ },
+ {
+ path: '/events/:id',
+ name: 'EventDetail',
+ component: EventDetail,
+ meta: { requiresAuth: true }
+ },
+ {
+ path: '/albums',
+ name: 'Albums',
+ component: Albums,
+ meta: { requiresAuth: true }
+ },
+ {
+ path: '/albums/:id',
+ name: 'AlbumDetail',
+ component: AlbumDetail,
+ meta: { requiresAuth: true }
+ },
+ {
+ path: '/vlogs',
+ name: 'Vlogs',
+ component: Vlogs,
+ meta: { requiresAuth: true }
+ },
+ {
+ path: '/vlogs/:id',
+ name: 'VlogDetail',
+ component: VlogDetail,
+ meta: { requiresAuth: true }
+ },
+ {
+ path: '/posts',
+ name: 'Posts',
+ component: Posts,
+ meta: { requiresAuth: true }
+ },
+ {
+ path: '/profile',
+ name: 'Profile',
+ component: Profile,
+ meta: { requiresAuth: true }
+ },
+ {
+ path: '/profile/:id',
+ name: 'UserProfile',
+ component: UserProfile,
+ meta: { requiresAuth: true }
+ },
+ {
+ path: '/stats',
+ name: 'Stats',
+ component: Stats,
+ meta: { requiresAuth: true }
+ },
+ {
+ path: '/admin',
+ name: 'Admin',
+ component: Admin,
+ meta: { requiresAuth: true, requiresAdmin: true }
+ },
+ {
+ path: '/information',
+ name: 'Information',
+ component: Information,
+ meta: { requiresAuth: true }
+ },
+ {
+ path: '/my-tickets',
+ name: 'MyTickets',
+ component: MyTickets,
+ meta: { requiresAuth: true }
+ }
+
+]
+
+const router = createRouter({
+ history: createWebHistory(),
+ routes
+})
+
+// Navigation guard simplifié - la logique d'authentification sera gérée dans les composants
+router.beforeEach((to, from, next) => {
+ // Pour l'instant, on laisse passer toutes les routes
+ // La logique d'authentification sera gérée dans les composants individuels
+ next()
+})
+
+export default router
diff --git a/backup/_data/src/stores/auth.js b/backup/_data/src/stores/auth.js
new file mode 100755
index 0000000..110ec23
--- /dev/null
+++ b/backup/_data/src/stores/auth.js
@@ -0,0 +1,197 @@
+import { defineStore } from 'pinia'
+import { ref, computed } from 'vue'
+import axios from '@/utils/axios'
+import router from '@/router'
+import { useToast } from 'vue-toastification'
+
+export const useAuthStore = defineStore('auth', () => {
+ const user = ref(null)
+ const token = ref(localStorage.getItem('token'))
+ const toast = useToast()
+
+ const isAuthenticated = computed(() => !!token.value)
+ const isAdmin = computed(() => user.value?.is_admin || false)
+
+ if (token.value) {
+ axios.defaults.headers.common['Authorization'] = `Bearer ${token.value}`
+ }
+
+ async function login(email, password) {
+ try {
+ // Pour OAuth2PasswordRequestForm, on doit envoyer en format x-www-form-urlencoded
+ const formData = new URLSearchParams()
+ formData.append('username', email) // OAuth2PasswordRequestForm expects username field
+ formData.append('password', password)
+
+ const response = await axios.post('/api/auth/login', formData.toString(), {
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ }
+ })
+ const { access_token, user: userData } = response.data
+
+ token.value = access_token
+ user.value = userData
+ localStorage.setItem('token', access_token)
+ axios.defaults.headers.common['Authorization'] = `Bearer ${access_token}`
+
+ toast.success(`Bienvenue ${userData.full_name} !`)
+ router.push('/')
+
+ return { success: true }
+ } catch (error) {
+ toast.error(error.response?.data?.detail || 'Erreur de connexion')
+ return { success: false, error: error.response?.data?.detail }
+ }
+ }
+
+ async function register(userData) {
+ try {
+ const response = await axios.post('/api/auth/register', userData)
+ const { access_token, user: newUser } = response.data
+
+ token.value = access_token
+ user.value = newUser
+ localStorage.setItem('token', access_token)
+ axios.defaults.headers.common['Authorization'] = `Bearer ${access_token}`
+
+ toast.success('Inscription réussie !')
+ router.push('/')
+
+ return { success: true }
+ } catch (error) {
+ toast.error(error.response?.data?.detail || 'Erreur lors de l\'inscription')
+ return { success: false, error: error.response?.data?.detail }
+ }
+ }
+
+ async function logout() {
+ token.value = null
+ user.value = null
+ localStorage.removeItem('token')
+ delete axios.defaults.headers.common['Authorization']
+ router.push('/login')
+ toast.info('Déconnexion réussie')
+ }
+
+ async function fetchCurrentUser() {
+ if (!token.value) return
+
+ try {
+ const response = await axios.get('/api/users/me')
+ user.value = response.data
+ } catch (error) {
+ console.error('Error fetching user:', error)
+ if (error.response?.status === 401) {
+ logout()
+ }
+ }
+ }
+
+ async function updateProfile(profileData) {
+ try {
+ const response = await axios.put('/api/users/me', profileData)
+ user.value = response.data
+ toast.success('Profil mis à jour')
+ return { success: true, data: response.data }
+ } catch (error) {
+ toast.error('Erreur lors de la mise à jour du profil')
+ return { success: false, error: error.response?.data?.detail }
+ }
+ }
+
+ async function uploadAvatar(file) {
+ try {
+ const formData = new FormData()
+ formData.append('file', file)
+
+ const response = await axios.post('/api/users/me/avatar', formData, {
+ headers: {
+ 'Content-Type': 'multipart/form-data'
+ }
+ })
+
+ user.value = response.data
+ toast.success('Avatar mis à jour')
+ return { success: true, data: response.data }
+ } catch (error) {
+ console.error('Error uploading avatar:', error)
+ toast.error('Erreur lors de l\'upload de l\'avatar')
+ return { success: false, error: error.response?.data?.detail || 'Erreur inconnue' }
+ }
+ }
+
+ // Notifications
+ const notifications = ref([])
+ const unreadCount = ref(0)
+
+ async function fetchNotifications() {
+ if (!token.value) return
+
+ try {
+ const response = await axios.get('/api/notifications?limit=50')
+ notifications.value = response.data
+ unreadCount.value = notifications.value.filter(n => !n.is_read).length
+ } catch (error) {
+ console.error('Error fetching notifications:', error)
+ }
+ }
+
+ async function markNotificationRead(notificationId) {
+ try {
+ await axios.put(`/api/notifications/${notificationId}/read`)
+ const notification = notifications.value.find(n => n.id === notificationId)
+ if (notification && !notification.is_read) {
+ notification.is_read = true
+ notification.read_at = new Date().toISOString()
+ unreadCount.value = Math.max(0, unreadCount.value - 1)
+ }
+ } catch (error) {
+ console.error('Error marking notification read:', error)
+ }
+ }
+
+ async function markAllNotificationsRead() {
+ try {
+ await axios.put('/api/notifications/read-all')
+ notifications.value.forEach(n => {
+ n.is_read = true
+ n.read_at = new Date().toISOString()
+ })
+ unreadCount.value = 0
+ } catch (error) {
+ console.error('Error marking all notifications read:', error)
+ }
+ }
+
+ async function fetchUnreadCount() {
+ if (!token.value) return
+
+ try {
+ const response = await axios.get('/api/notifications/unread-count')
+ unreadCount.value = response.data.unread_count
+ } catch (error) {
+ console.error('Error fetching unread count:', error)
+ }
+ }
+
+ return {
+ user,
+ token,
+ isAuthenticated,
+ isAdmin,
+ login,
+ register,
+ logout,
+ fetchCurrentUser,
+ updateProfile,
+ uploadAvatar,
+ // Notifications
+ notifications,
+ unreadCount,
+ fetchNotifications,
+ markNotificationRead,
+ markAllNotificationsRead,
+ fetchUnreadCount
+ }
+})
diff --git a/backup/_data/src/style.css b/backup/_data/src/style.css
new file mode 100755
index 0000000..aeb178f
--- /dev/null
+++ b/backup/_data/src/style.css
@@ -0,0 +1,72 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+ body {
+ @apply bg-gray-50 text-gray-900 antialiased;
+ }
+}
+
+@layer components {
+ .btn {
+ @apply inline-flex items-center justify-center px-4 py-2 border border-transparent text-sm font-medium rounded-lg focus:outline-none focus:ring-2 focus:ring-offset-2 transition-all duration-200;
+ }
+
+ .btn-primary {
+ @apply btn bg-primary-600 text-white hover:bg-primary-700 focus:ring-primary-500 shadow-lg hover:shadow-xl;
+ }
+
+ .btn-secondary {
+ @apply btn bg-white text-secondary-700 border-secondary-200 hover:bg-secondary-50 focus:ring-primary-500 hover:border-primary-300;
+ }
+
+ .card {
+ @apply bg-white rounded-xl shadow-sm border border-secondary-100 overflow-hidden hover:shadow-md transition-shadow;
+ }
+
+ .input {
+ @apply block w-full px-3 py-2 border border-secondary-300 rounded-lg shadow-sm focus:ring-primary-500 focus:border-primary-500 sm:text-sm transition-colors;
+ }
+
+ .label {
+ @apply block text-sm font-medium text-secondary-700 mb-1;
+ }
+
+ .line-clamp-2 {
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ }
+
+ /* Discord-style gradients */
+ .bg-gradient-discord {
+ @apply bg-gradient-to-br from-primary-50 via-white to-secondary-50;
+ }
+
+ .bg-gradient-primary {
+ @apply bg-gradient-to-r from-primary-500 to-primary-600;
+ }
+
+ .bg-gradient-secondary {
+ @apply bg-gradient-to-r from-secondary-500 to-secondary-600;
+ }
+
+ /* Status colors */
+ .status-online {
+ @apply bg-success-500;
+ }
+
+ .status-offline {
+ @apply bg-secondary-400;
+ }
+
+ .status-away {
+ @apply bg-warning-500;
+ }
+
+ .status-dnd {
+ @apply bg-accent-500;
+ }
+}
diff --git a/backup/_data/src/utils/axios.js b/backup/_data/src/utils/axios.js
new file mode 100755
index 0000000..813bbe2
--- /dev/null
+++ b/backup/_data/src/utils/axios.js
@@ -0,0 +1,166 @@
+import axios from 'axios'
+import { useToast } from 'vue-toastification'
+import router from '@/router'
+
+// Configuration de l'URL de base selon l'environnement
+const getBaseURL = () => {
+ // Récupérer l'environnement depuis les variables Vite
+ const environment = import.meta.env.VITE_ENVIRONMENT || 'local'
+
+ // Log de debug pour l'environnement
+ console.log(`🌍 Frontend - Environnement détecté: ${environment}`)
+ console.log(`🔗 API URL: ${import.meta.env.VITE_API_URL}`)
+ console.log(`🔧 VITE_ENVIRONMENT: ${import.meta.env.VITE_ENVIRONMENT}`)
+ console.log(`🔧 NODE_ENV: ${import.meta.env.NODE_ENV}`)
+
+ // Utiliser directement la variable d'environnement VITE_API_URL
+ // qui est déjà configurée correctement pour chaque environnement
+ const apiUrl = import.meta.env.VITE_API_URL
+
+ if (!apiUrl) {
+ console.warn('⚠️ VITE_API_URL non définie, utilisation de la valeur par défaut')
+ // Valeurs par défaut selon l'environnement
+ switch (environment) {
+ case 'production':
+ return 'https://api.lediscord.com'
+ case 'development':
+ return 'https://api-dev.lediscord.com' // API externe HTTPS en développement
+ case 'local':
+ default:
+ return 'http://localhost:8000'
+ }
+ }
+
+ console.log(`🎯 URL finale utilisée: ${apiUrl}`)
+ return apiUrl
+}
+
+// Configuration de l'instance axios
+const instance = axios.create({
+ baseURL: getBaseURL(),
+ timeout: 30000,
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+})
+
+// Log de la configuration
+console.log(`🚀 Axios configuré avec l'URL de base: ${getBaseURL()}`)
+
+// Request interceptor
+instance.interceptors.request.use(
+ config => {
+ const token = localStorage.getItem('token')
+ if (token) {
+ config.headers.Authorization = `Bearer ${token}`
+ }
+
+ // Log des requêtes en développement
+ if (import.meta.env.DEV) {
+ console.log(`📤 Requête ${config.method?.toUpperCase()} vers: ${config.url}`)
+ }
+
+ return config
+ },
+ error => {
+ console.error('❌ Erreur dans l\'intercepteur de requête:', error)
+ return Promise.reject(error)
+ }
+)
+
+// Response interceptor
+instance.interceptors.response.use(
+ response => {
+ // Log des réponses en développement
+ if (import.meta.env.DEV) {
+ console.log(`📥 Réponse ${response.status} de: ${response.config.url}`)
+ }
+ return response
+ },
+ error => {
+ const toast = useToast()
+
+ // Log détaillé des erreurs
+ console.error('❌ Erreur API:', {
+ status: error.response?.status,
+ statusText: error.response?.statusText,
+ url: error.config?.url,
+ method: error.config?.method,
+ data: error.response?.data
+ })
+
+ if (error.response?.status === 401) {
+ // Ne pas rediriger si on est déjà sur une page d'auth
+ const currentRoute = router.currentRoute.value
+ if (!currentRoute.path.includes('/login') && !currentRoute.path.includes('/register')) {
+ localStorage.removeItem('token')
+ router.push('/login')
+ toast.error('Session expirée, veuillez vous reconnecter')
+ }
+ } else if (error.response?.status === 403) {
+ toast.error('Accès non autorisé')
+ } else if (error.response?.status === 500) {
+ toast.error('Erreur serveur, veuillez réessayer plus tard')
+ } else if (error.code === 'ECONNABORTED') {
+ toast.error('Délai d\'attente dépassé, veuillez réessayer')
+ } else if (!error.response) {
+ toast.error('Erreur de connexion, vérifiez votre connexion internet')
+ }
+
+ return Promise.reject(error)
+ }
+)
+
+export default instance
+
+// Fonction utilitaire pour construire les URLs des médias
+export function getMediaUrl(path) {
+ if (!path) return null
+ if (typeof path !== 'string') return path
+ if (path.startsWith('http')) return path
+
+ const baseUrl = getBaseURL()
+
+ // Déjà un chemin uploads complet
+ if (path.startsWith('/uploads/')) {
+ return `${baseUrl}${path}`
+ }
+
+ // Chemins relatifs issus de l'API (ex: /avatars/..., /vlogs/..., /albums/...)
+ if (path.startsWith('/')) {
+ return `${baseUrl}/uploads${path}`
+ }
+
+ // Fallback
+ return `${baseUrl}/uploads/${path}`
+}
+
+// Fonction utilitaire pour obtenir l'environnement actuel
+export function getCurrentEnvironment() {
+ return import.meta.env.VITE_ENVIRONMENT || 'local'
+}
+
+// Fonction utilitaire pour vérifier si on est en production
+export function isProduction() {
+ return getCurrentEnvironment() === 'production'
+}
+
+// Fonction utilitaire pour vérifier si on est en développement
+export function isDevelopment() {
+ return getCurrentEnvironment() === 'development'
+}
+
+// Fonction utilitaire pour vérifier si on est en local
+export function isLocal() {
+ return getCurrentEnvironment() === 'local'
+}
+
+// Fonction utilitaire pour obtenir l'URL de l'API
+export function getApiUrl() {
+ return import.meta.env.VITE_API_URL || getBaseURL()
+}
+
+// Fonction utilitaire pour obtenir l'URL de l'application
+export function getAppUrl() {
+ return import.meta.env.VITE_APP_URL || window.location.origin
+}
diff --git a/backup/_data/src/views/Admin.vue b/backup/_data/src/views/Admin.vue
new file mode 100755
index 0000000..bbc7db2
--- /dev/null
+++ b/backup/_data/src/views/Admin.vue
@@ -0,0 +1,2127 @@
+
+
+
Administration
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Total utilisateurs
+
{{ dashboard.users.total }}
+
+
+
+
+ {{ dashboard.users.active }} actifs, {{ dashboard.users.admins }} admins
+
+
+
+
+
+
+
Événements
+
{{ dashboard.content.events }}
+
+
+
+
+
+
+
+
+
Médias
+
{{ dashboard.content.media_files }}
+
+
+
+
+
+
+
+
+
Stockage total
+
{{ dashboard.storage.total_formatted }}
+
+
+
+
+
+
+
+
+
+
Utilisation du stockage
+
+
+
+
+ {{ name }}
+ {{ category.formatted }}
+
+
+
+
+
+
+
+ Total
+ {{ dashboard.storage.total_formatted }}
+
+
+
+
+
+
+
Actions rapides
+
+
+
+
+ Nettoyer les fichiers orphelins
+
+
+
+
+ Actualiser les statistiques
+
+
+
+
+ Exporter les données utilisateurs
+
+
+
+
+
+
+
+
+
Paramètres système
+
+
+
+ Initialiser les paramètres
+
+
+
+ Actualiser
+
+
+
+ Tester les limites
+
+
+
+
+
+
+
Limites d'upload
+
+
+ Taille max albums (MB)
+
+
+
+ Taille max vlogs (MB)
+
+
+
+ Taille max images (MB)
+
+
+
+ Taille max vidéos (MB)
+
+
+
+
Nombre max de médias par album
+
+
+ Limite le nombre de photos/vidéos qu'un utilisateur peut ajouter dans un album
+
+
+
+
+
+ {{ savingSettings ? 'Sauvegarde...' : 'Sauvegarder les limites' }}
+
+
+
+
+
+
Paramètres généraux
+
+
+
Nombre max d'utilisateurs
+
+
+ Actuellement : {{ users.length }}/{{ settings.max_users }} utilisateurs
+
+
+
+
+
+
+ Autoriser les nouvelles inscriptions
+
+
+
+
+
+
+
+
+ Attention : Les nouvelles inscriptions sont désactivées. Aucun nouvel utilisateur ne pourra s'inscrire.
+
+
+
+
+
+
+
+
+ {{ savingSettings ? 'Sauvegarde...' : 'Sauvegarder les paramètres' }}
+
+
+
+
+
+
+
+
Gestion des informations
+
+
+ Nouvelle information
+
+
+
+
+
+
+
+ Titre
+ Catégorie
+ Statut
+ Priorité
+ Date
+ Actions
+
+
+
+
+
+
+
{{ info.title }}
+
{{ info.content.substring(0, 100) }}{{ info.content.length > 100 ? '...' : '' }}
+
+
+
+
+
+ {{ getCategoryLabel(info.category) }}
+
+
+
+
+
+ {{ info.is_published ? 'Publié' : 'Brouillon' }}
+
+
+
+
+ {{ info.priority }}
+
+
+
+ {{ formatDate(info.created_at) }}
+
+
+
+
+
+ Modifier
+
+
+
+ {{ info.is_published ? 'Dépublier' : 'Publier' }}
+
+
+
+ Supprimer
+
+
+
+
+
+
+
+
+
+
+
+
+
Gestion des utilisateurs
+
+
+ Actualiser
+
+
+
+
+
+
+
+ Utilisateur
+ Statut
+ Rôle
+ Stockage
+ Activité
+ Actions
+
+
+
+
+
+
+
+
+
+
+
+
{{ user.full_name }}
+
{{ user.email }}
+
+
+
+
+
+
+ {{ user.is_active ? 'Actif' : 'Inactif' }}
+
+
+
+
+
+ {{ user.is_admin ? 'Admin' : 'Utilisateur' }}
+
+
+
+
+ {{ user.storage_used }}
+
+
+
+
+
{{ user.content_count.posts }} posts
+
{{ user.content_count.vlogs }} vlogs
+
{{ user.content_count.albums }} albums
+
+
+
+
+
+
+ {{ user.is_active ? 'Désactiver' : 'Activer' }}
+
+
+
+ {{ user.is_admin ? 'Retirer admin' : 'Donner admin' }}
+
+
+
+ Supprimer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Gestion des tickets
+
Suivi et résolution des demandes utilisateurs
+
+
+
+
{{ filteredTickets.length }}
+
Tickets actifs
+
+
+
+
{{ resolvedTicketsCount }}
+
Résolus
+
+
+
+
+
+
+
+
+
+
+
+
+ Tous les statuts
+ 🔴 Ouverts
+ 🟡 En cours
+ 🟢 Résolus
+ ⚫ Fermés
+
+
+
+
+ Tous les types
+ 🐛 Bug
+ 💡 Fonctionnalité
+ ✨ Amélioration
+ ❓ Support
+ 📝 Autre
+
+
+
+
+ Toutes les priorités
+ 🔴 Urgente
+ 🟠 Élevée
+ 🟡 Moyenne
+ 🟢 Faible
+
+
+
+
+
+
+ 🔴 Urgents ({{ urgentTicketsCount }})
+
+
+ ⚠️ Non assignés ({{ unassignedTicketsCount }})
+
+
+ 📅 Récents ({{ recentTicketsCount }})
+
+
+ 🗑️ Effacer les filtres
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ ticket.title }}
+
+
+ Par {{ ticket.user_name }} • {{ formatRelativeDate(ticket.created_at) }}
+
+
+
+
+
+ {{ getPriorityLabel(ticket.priority) }}
+
+
+
+ {{ getStatusLabel(ticket.status) }}
+
+
+
+
+
+
+
+ {{ getTypeLabel(ticket.ticket_type) }}
+
+
+ → {{ getAssignedAdminName(ticket.assigned_to) }}
+
+
+
+
+
+
+
+ {{ ticket.description }}
+
+
+ Cliquez pour voir plus...
+
+
+
+
+
+
+
+
+ 📸 Screenshot
+
+
+ 📝 Notes admin
+
+
+
+
+
+
+
+
+
+
+
+
+
Aucun ticket trouvé
+
Aucun ticket ne correspond à vos critères de recherche.
+
+
+
+
+
+
+
+
+
+
Modifier le ticket
+
Mettre à jour les informations et le statut
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Informations du ticket
+
+
+
+
Titre
+
+ {{ editingTicket.title }}
+
+
+
+
Type
+
+ {{ getTypeLabel(editingTicket.ticket_type) }}
+
+
+
+
+
+
+
+
+
+
+
+ Gestion du ticket
+
+
+
+
+ Statut
+
+ 🔴 Ouvert
+ 🟡 En cours
+ 🟢 Résolu
+ ⚫ Fermé
+
+
+
+
+
+ Priorité
+
+ 🟢 Faible
+ 🟡 Moyenne
+ 🟠 Élevée
+ 🔴 Urgente
+
+
+
+
+
+
+
+
+
+
+
+ Assignation et communication
+
+
+
+
+ Assigner à
+
+ 👤 Non assigné
+
+ 👑 {{ admin.full_name }}
+
+
+
+
+
+
+
Notes administrateur
+
+
Ces notes sont visibles uniquement par les administrateurs
+
+
+
+
+
+
+
+ Annuler
+
+
+
+
+
+
+
+ Sauvegarde...
+
+ Sauvegarder les modifications
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Détails du ticket
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ selectedTicket.title }}
+
+ Créé par : {{ selectedTicket.user_name }}
+
+
+ Email : {{ selectedTicket.user_email }}
+
+
+ Date : {{ formatDate(selectedTicket.created_at) }}
+
+
+
+
+
+ Statut :
+
+ {{ getStatusLabel(selectedTicket.status) }}
+
+
+
+ Priorité :
+
+ {{ getPriorityLabel(selectedTicket.priority) }}
+
+
+
+ Type :
+
+ {{ getTypeLabel(selectedTicket.ticket_type) }}
+
+
+
+
+
+
+
Assigné à :
+
{{ getAssignedAdminName(selectedTicket.assigned_to) }}
+
+
+
+
+
+
+ {{ getNextStatusLabel(selectedTicket.status) }}
+
+
+ Modifier
+
+
+
+
+
+
+
+
+
+
+
+
+ Description
+
+
+
{{ selectedTicket.description }}
+
+
+
+
+
+
+
+
+
+ Screenshot
+
+
+
+
Cliquez sur l'image pour l'agrandir
+
+
+
+
+
+
+
+
+
+ Notes administrateur
+
+
+
{{ selectedTicket.admin_notes }}
+
+
+
+
+
+
+
+
+
+ Historique
+
+
+
+
+
Créé le {{ formatDate(selectedTicket.created_at) }}
+
+
+
+
Modifié le {{ formatDate(selectedTicket.updated_at) }}
+
+
+
+
Résolu le {{ formatDate(selectedTicket.resolved_at) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Nettoyage des fichiers orphelins
+
+
+
+
Analyse en cours...
+
+
+
+
+ {{ orphanedFiles.length }} fichier(s) orphelin(s) trouvé(s) pour un total de {{ totalOrphanedSize }}.
+
+
+
+
+
+ {{ file.type }}
+ {{ file.path }}
+
+
{{ file.size }}
+
+
+
+
+
+ Annuler
+
+
+ Nettoyer ({{ totalOrphanedSize }})
+
+
+
+
+
+
+
Aucun fichier orphelin
+
Votre stockage est propre !
+
+
+
+
+
+
+
+
+
+
+
+ {{ editingInformation ? 'Modifier l\'information' : 'Nouvelle information' }}
+
+
+
+
+
+
+
+
+
+
+
+ Titre *
+
+
+
+
+
+ Catégorie
+
+ Général
+ Nouvelle version
+ À venir
+ Maintenance
+ Nouvelle fonctionnalité
+ Correction de bug
+
+
+
+
+
+
Priorité
+
+
+ Les informations avec une priorité plus élevée apparaîtront en premier
+
+
+
+
+
+
Contenu *
+
+
+ Utilisez des sauts de ligne pour structurer votre contenu
+
+
+
+
+
+
+
+ Publier immédiatement
+
+
+
+
+
+
+ Annuler
+
+
+
+ {{ savingInformation ? 'Sauvegarde...' : 'Sauvegarder' }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/backup/_data/src/views/AlbumDetail.vue b/backup/_data/src/views/AlbumDetail.vue
new file mode 100755
index 0000000..2906ea7
--- /dev/null
+++ b/backup/_data/src/views/AlbumDetail.vue
@@ -0,0 +1,862 @@
+
+
+
+
+
+
+
+
+
+
Album non trouvé
+
L'album que vous recherchez n'existe pas ou a été supprimé.
+
+ Retour aux albums
+
+
+
+
+
+
+
+
+
+
+ Retour aux albums
+
+
+
+
+
+ Modifier
+
+
+
+ Ajouter des médias
+
+
+
+ Supprimer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ album.title }}
+
+
+
+
+ {{ album.description }}
+
+
+
+
+ Créé par {{ album.creator_name }}
+
+
+
+
+ {{ formatDate(album.created_at) }}
+
+
+
+
+
+ {{ album.event_title }}
+
+
+
+
+
+
+
Statistiques
+
+
+
{{ album.media_count || 0 }}
+
Médias
+
+
+
{{ formatBytes(totalSize) }}
+
Taille totale
+
+
+
+
+
+
+
+
+
+
+
Top Media
+
Les médias les plus appréciés de cet album
+
+
+
+
+
+
+
+
+ {{ media.media_type === 'image' ? '📷' : '🎥' }}
+
+
+
+
+
+ {{ media.likes_count }}
+
+
+
+
+ {{ media.caption }}
+
+
+
+
+
+
+
+
+
Galerie
+
+
+
+
+
+
+
+
+
+
+
+
+
Aucun média
+
Cet album ne contient pas encore de photos ou vidéos
+
+
+
+
+
+
+
+
+
+
+ {{ media.media_type === 'image' ? '📷' : '🎥' }}
+
+
+
+
+ {{ media.caption }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ media.likes_count }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ media.caption || 'Sans titre' }}
+
{{ formatBytes(media.file_size) }} • {{ media.media_type === 'image' ? 'Image' : 'Vidéo' }}
+
{{ formatDate(media.created_at) }}
+
+
+
+
+
+
+
+
+
+ {{ media.likes_count }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Modifier l'album
+
+
+
+ Titre
+
+
+
+
+ Description
+
+
+
+
+
+ Annuler
+
+
+ {{ updating ? 'Mise à jour...' : 'Mettre à jour' }}
+
+
+
+
+
+
+
+
+
+
+
+
Ajouter des médias
+
+
+
+
Photos et vidéos
+
+
+
+
+
+
Glissez-déposez ou cliquez pour sélectionner
+
Images et vidéos (max 100MB par fichier)
+
+ Sélectionner des fichiers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ media.type === 'image' ? '📷' : '🎥' }}
+
+
+
+
+
+ Ajouter plus de fichiers
+
+
+
+
+
+
+
+ Annuler
+
+
+ {{ uploading ? 'Upload...' : 'Ajouter les médias' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ getCurrentMediaIndex() + 1 }} / {{ album.media.length }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ selectedMedia.caption }}
+
+
+
+
+ {{ formatBytes(selectedMedia.file_size) }}
+
+
+
+ {{ selectedMedia.media_type === 'image' ? '📷 Image' : '🎥 Vidéo' }}
+
+
+
+ {{ formatDate(selectedMedia.created_at) }}
+
+
+
+
+
+
+
+ {{ selectedMedia.likes_count }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/backup/_data/src/views/Albums.vue b/backup/_data/src/views/Albums.vue
new file mode 100755
index 0000000..8804a67
--- /dev/null
+++ b/backup/_data/src/views/Albums.vue
@@ -0,0 +1,786 @@
+
+
+
+
+
+
Albums photos
+
Partagez vos souvenirs en photos et vidéos
+
+
+
+ Nouvel album
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ album.media_count }} média{{ album.media_count > 1 ? 's' : '' }}
+
+
+
+
+
+
{{ album.title }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ album.creator_name }}
+
+
+
+
+
{{ formatRelativeDate(album.created_at) }}
+
+ 📅 {{ album.event_title }}
+
+
+
+
+
+
+
+
+
+ {{ loading ? 'Chargement...' : 'Charger plus' }}
+
+
+
+
+
+
+
Aucun album
+
Créez le premier album pour partager vos photos !
+
+
+
+
+
+
+
Créer un nouvel album
+
+
+
+ Titre
+
+
+
+
+ Description
+
+
+
+
+ Lier à un événement (optionnel)
+
+ Aucun événement
+
+ {{ event.title }} - {{ formatDate(event.date) }}
+
+
+
+
+
+
Photos et vidéos
+
+
+
+
+
+
Glissez-déposez ou cliquez pour sélectionner
+
+ Images et vidéos (max {{ uploadLimits.max_image_size_mb }}MB pour images, {{ uploadLimits.max_video_size_mb }}MB pour vidéos)
+
+ Maximum {{ uploadLimits.max_media_per_album }} fichiers par album
+
+
+ Sélectionner des fichiers
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ media.name }}
+
+ {{ formatFileSize(media.size) }}
+
+ ({{ Math.round((1 - media.size / media.originalSize) * 100) }}% compression)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ media.type === 'image' ? '📷' : '🎥' }}
+
+
+
+
+
+ Ajouter plus de fichiers
+
+
+
+
+
+
+
+
+ {{ uploadStatus }}
+ {{ currentFileIndex }}/{{ totalFiles }}
+
+
+
+ {{ Math.round(uploadProgress) }}% terminé
+
+
+
+
+
+
+
+ ✅ {{ uploadSuccess.length }} fichier(s) uploadé(s) avec succès
+
+
+
+
+ ❌ {{ uploadErrors.length }} erreur(s) lors de l'upload
+
+
+
+ {{ error.file }}: {{ error.message }}
+
+
+
+
+
+
+
+ Annuler
+
+
+
+
+ Upload en cours...
+
+
+ Création...
+
+
+ Créer l'album
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/backup/_data/src/views/EventDetail.vue b/backup/_data/src/views/EventDetail.vue
new file mode 100755
index 0000000..6970321
--- /dev/null
+++ b/backup/_data/src/views/EventDetail.vue
@@ -0,0 +1,518 @@
+
+
+
+
+
+
+
+
+
+
Événement non trouvé
+
L'événement que vous recherchez n'existe pas ou a été supprimé.
+
+ Retour aux événements
+
+
+
+
+
+
+
+
+
+
+ Retour aux événements
+
+
+
+
+
+ Modifier
+
+
+
+ Supprimer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ event.title }}
+
+
+
+
+
+ {{ formatDate(event.date) }}
+
+
+
+
+ Fin : {{ formatDate(event.end_date) }}
+
+
+
+
+ {{ event.location }}
+
+
+
+
+ Organisé par {{ event.creator_name }}
+
+
+
+
+
+
Participation
+
+
+
{{ event.present_count || 0 }}
+
Présents
+
+
+
{{ event.maybe_count || 0 }}
+
Peut-être
+
+
+
{{ event.absent_count || 0 }}
+
Absents
+
+
+
{{ event.pending_count || 0 }}
+
En attente
+
+
+
+
+
+
+
+
+
+
+
Description
+
{{ event.description }}
+
+
+
+
+
+
+
+
Ma participation
+
+
+ ✓ Présent
+
+
+ ? Peut-être
+
+
+ ✗ Absent
+
+
+
+
+
+
+
Participants
+
+
+ Aucun participant pour le moment
+
+
+
+
+
+
+
+
+
+
+
{{ participation.full_name }}
+
@{{ participation.username }}
+
+
+
+
+
+ {{ getStatusText(participation.status) }}
+
+
+ {{ formatRelativeDate(participation.response_date) }}
+
+
+
+
+
+
+
+
+
+
Albums liés
+
+ Voir tous les albums →
+
+
+
+
+ Aucun album lié à cet événement
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ album.media_count }} média{{ album.media_count > 1 ? 's' : '' }}
+
+
+
+
+
+
+
+
{{ album.title }}
+
+
+ {{ album.creator_name }}
+
+
{{ album.description }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/backup/_data/src/views/Events.vue b/backup/_data/src/views/Events.vue
new file mode 100755
index 0000000..dc344a8
--- /dev/null
+++ b/backup/_data/src/views/Events.vue
@@ -0,0 +1,519 @@
+
+
+
+
+
+
Événements
+
Organisez et participez aux événements du groupe
+
+
+
+ Nouvel événement
+
+
+
+
+
+
+
+ À venir
+
+
+ Passés
+
+
+ Tous
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatDate(event.date) }}
+
+
+
+
+
+ {{ getParticipationText(getUserParticipation(event)) }}
+
+
+
+
+
+
{{ event.title }}
+
+
+
+
+
+
+
+
+ {{ event.location || 'Lieu non spécifié' }}
+
+
+
+
+
+ {{ event.creator_name }}
+
+
+
+
+
+
+ ✓ Présent
+
+
+ ? Peut-être
+
+
+ ✗ Absent
+
+
+
+
+
+ {{ event.present_count || 0 }} présents
+ {{ event.maybe_count || 0 }} peut-être
+ {{ event.absent_count || 0 }} absents
+
+
+
+
+
+
+
+
+ {{ loading ? 'Chargement...' : 'Charger plus' }}
+
+
+
+
+
+
+
+ {{ activeTab === 'upcoming' ? 'Aucun événement à venir' :
+ activeTab === 'past' ? 'Aucun événement passé' : 'Aucun événement' }}
+
+
+ {{ activeTab === 'upcoming' ? 'Créez le premier événement pour commencer !' :
+ activeTab === 'past' ? 'Les événements passés apparaîtront ici' :
+ 'Créez le premier événement pour commencer !' }}
+
+
+
+
+
+
+
+
Créer un nouvel événement
+
+
+
+ Titre
+
+
+
+
+ Description (optionnel)
+
+
+
+
+ Lieu
+
+
+
+
+
+
Coordonnées géographiques (optionnel)
+
+
+
+
+
+
+
+
+
+
+ Annuler
+
+
+ {{ creating ? 'Création...' : 'Créer l\'événement' }}
+
+
+
+
+
+
+
+
+
+
diff --git a/backup/_data/src/views/Home.vue b/backup/_data/src/views/Home.vue
new file mode 100755
index 0000000..15ab54c
--- /dev/null
+++ b/backup/_data/src/views/Home.vue
@@ -0,0 +1,304 @@
+
+
+
+
+
+ Salut {{ user?.full_name }} ! 👋
+
+
Voici ce qui se passe dans le groupe
+
+
+
+
+
+
+
+
Prochain événement
+
{{ nextEvent?.title || 'Aucun' }}
+
+ {{ formatDate(nextEvent.date) }}
+
+
+
+
+
+
+
+
+
+
Taux de présence
+
{{ Math.round(user?.attendance_rate || 0) }}%
+
+
+
+
+
+
+
+
+
Nouveaux posts
+
{{ recentPosts }}
+
Cette semaine
+
+
+
+
+
+
+
+
+
Membres actifs
+
{{ activeMembers }}
+
+
+
+
+
+
+
+
+
+
+
+
Publications récentes
+
+
+
+ Aucune publication récente
+
+
+
+
+
+
+
+
+
+
{{ post.author_name }}
+
{{ formatRelativeDate(post.created_at) }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ post.likes_count || 0 }}
+
+
+
+
+ {{ post.comments_count || 0 }}
+
+
+
+
+
+
+
+ Voir toutes les publications →
+
+
+
+
+
+
+
+
+
Événements à venir
+
+
+
+ Aucun événement prévu
+
+
+ {{ event.title }}
+ {{ formatDate(event.date) }}
+
+ 📍 {{ event.location }}
+
+
+
+ ✓ {{ event.present_count }} présents
+
+
+ ? {{ event.maybe_count }} peut-être
+
+
+
+
+
+ Voir tous les événements →
+
+
+
+
+
+
+
Derniers vlogs
+
+
+
+ Aucun vlog récent
+
+
+
+
+
+
+
+
+
+ {{ vlog.title }}
+ Par {{ vlog.author_name }}
+ {{ vlog.views_count }} vues
+
+
+
+ Voir tous les vlogs →
+
+
+
+
+
+
+
+
diff --git a/backup/_data/src/views/Information.vue b/backup/_data/src/views/Information.vue
new file mode 100755
index 0000000..21baca2
--- /dev/null
+++ b/backup/_data/src/views/Information.vue
@@ -0,0 +1,177 @@
+
+
+
+
+
Informations
+
Restez informés des dernières nouvelles de LeDiscord
+
+
+
+
+
+ Toutes
+
+
+ {{ getCategoryLabel(category) }}
+
+
+
+
+
+
+
+
+
+
+
+
Aucune information
+
+ {{ selectedCategory ? `Aucune information dans la catégorie "${getCategoryLabel(selectedCategory)}"` : 'Aucune information disponible pour le moment' }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ getCategoryLabel(info.category) }}
+
+
+ {{ formatDate(info.created_at) }}
+
+
+
{{ info.title }}
+
+
+
+
+
+
+
+
+
+ Mis à jour le {{ formatDate(info.updated_at) }}
+ Brouillon
+
+
+
+
+
+
+
diff --git a/backup/_data/src/views/Login.vue b/backup/_data/src/views/Login.vue
new file mode 100755
index 0000000..49113db
--- /dev/null
+++ b/backup/_data/src/views/Login.vue
@@ -0,0 +1,89 @@
+
+
+
Connexion
+
+
+
+ Email
+
+
+
+
+ Mot de passe
+
+
+
+
+ {{ loading ? 'Connexion...' : 'Se connecter' }}
+
+
+
+
+
+ Pas encore de compte ?
+
+ S'inscrire
+
+
+
+ Les nouvelles inscriptions sont temporairement désactivées
+
+
+
+
+
+
diff --git a/backup/_data/src/views/MyTickets.vue b/backup/_data/src/views/MyTickets.vue
new file mode 100755
index 0000000..c98d33f
--- /dev/null
+++ b/backup/_data/src/views/MyTickets.vue
@@ -0,0 +1,533 @@
+
+
+
+
+
Mes tickets
+
Suivez vos demandes et signalements
+
+
+
+
+
+
{{ ticketStats.open }}
+
Ouverts
+
+
+
{{ ticketStats.in_progress }}
+
En cours
+
+
+
{{ ticketStats.resolved }}
+
Résolus
+
+
+
{{ ticketStats.total }}
+
Total
+
+
+
+
+
+
+ Tous
+
+
+ {{ getStatusLabel(status) }}
+
+
+
+
+
+
+
+
+
+
+
+
Aucun ticket
+
+ {{ selectedStatus ? `Aucun ticket avec le statut "${getStatusLabel(selectedStatus)}"` : 'Vous n\'avez pas encore créé de ticket' }}
+
+
+ Créer mon premier ticket
+
+
+
+
+
+
+
+
+
+
+
+ {{ getTypeLabel(ticket.ticket_type) }}
+
+
+ {{ getStatusLabel(ticket.status) }}
+
+
+ {{ getPriorityLabel(ticket.priority) }}
+
+
+ {{ formatDate(ticket.created_at) }}
+
+
+
{{ ticket.title }}
+
+
+
+ Modifier
+
+
+ Supprimer
+
+
+
+
+
+
+
{{ ticket.description }}
+
+
+
+
+
Screenshot :
+
+
+
+
+
+
Réponse de l'équipe :
+
{{ ticket.admin_notes }}
+
+
+
+
+ Mis à jour le {{ formatDate(ticket.updated_at) }}
+
+ Assigné à {{ ticket.assigned_admin_name }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ editingTicket ? 'Modifier le ticket' : 'Nouveau ticket' }}
+
+
+
+
+
+
+
+
+
+
+
+ Titre *
+
+
+
+
+
+ Type
+
+ 🐛 Bug
+ 💡 Demande de fonctionnalité
+ ✨ Amélioration
+ ❓ Support
+ 📝 Autre
+
+
+
+
+
+ Priorité
+
+ 🟢 Faible
+ 🟡 Moyenne
+ 🟠 Élevée
+ 🔴 Urgente
+
+
+
+
+
+ Description *
+
+
+
+
+
+
Screenshot (optionnel)
+
+
+ Formats acceptés : JPG, PNG, GIF, WebP (max 5MB)
+
+
+
+
+
+
+ Annuler
+
+
+
+ {{ savingTicket ? 'Sauvegarde...' : 'Sauvegarder' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/backup/_data/src/views/Posts.vue b/backup/_data/src/views/Posts.vue
new file mode 100755
index 0000000..74c10c1
--- /dev/null
+++ b/backup/_data/src/views/Posts.vue
@@ -0,0 +1,521 @@
+
+
+
+
+
+
Publications
+
Partagez vos moments avec le groupe
+
+
+
+ Nouvelle publication
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ newPost.content.length }}/5000
+
+
+
+ {{ creating ? 'Publication...' : 'Publier' }}
+
+
+
+
+
+
+
+
+ Sélectionner une image
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ post.author_name }}
+
+ {{ formatRelativeDate(post.created_at) }}
+
+
+
+
+ Mentionne :
+
+ @{{ mentionedUser.username }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ post.likes_count || 0 }}
+
+
+
+
+ {{ post.comments_count || 0 }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
handleCommentMentionsChanged(post.id, mentions)"
+ />
+
+ {{ (post.newComment || '').length }}/500
+
+ Commenter
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ comment.author_name }}
+
+ {{ formatRelativeDate(comment.created_at) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ loading ? 'Chargement...' : 'Charger plus' }}
+
+
+
+
+
+
+
Aucune publication
+
Soyez le premier à partager quelque chose !
+
+
+
+
+
diff --git a/backup/_data/src/views/Profile.vue b/backup/_data/src/views/Profile.vue
new file mode 100755
index 0000000..2ee8498
--- /dev/null
+++ b/backup/_data/src/views/Profile.vue
@@ -0,0 +1,253 @@
+
+
+
Mon profil
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ user?.full_name }}
+
@{{ user?.username }}
+
+
+
Membre depuis {{ formatDate(user?.created_at) }}
+
Taux de présence : {{ Math.round(user?.attendance_rate || 0) }}%
+
+
+
+
+
+
+
+
+
Informations personnelles
+
+
+
+
+
+ Email
+
+
+
+
+
Bio
+
+
{{ (form.bio || '').length }}/500 caractères
+
+
+
+
+ {{ updating ? 'Mise à jour...' : 'Mettre à jour' }}
+
+
+ Réinitialiser
+
+
+
+
+
+
+
+
Mes statistiques
+
+
+
+
{{ stats.posts_count || 0 }}
+
Publications
+
+
+
+
{{ stats.vlogs_count || 0 }}
+
Vlogs
+
+
+
+
{{ stats.albums_count || 0 }}
+
Albums
+
+
+
+
{{ stats.events_created || 0 }}
+
Événements créés
+
+
+
+
+
+
+
+
+
diff --git a/backup/_data/src/views/Register.vue b/backup/_data/src/views/Register.vue
new file mode 100755
index 0000000..74596ee
--- /dev/null
+++ b/backup/_data/src/views/Register.vue
@@ -0,0 +1,190 @@
+
+
+
Inscription
+
+
+
+ Email
+
+
+
+
+ Nom d'utilisateur
+
+
+
+
+ Nom complet
+
+
+
+
+ Mot de passe
+
+
+
+
+ Confirmer le mot de passe
+
+
+
+
+ {{ error }}
+
+
+
+ {{ loading ? 'Inscription...' : !registrationEnabled ? 'Inscriptions désactivées' : 'S\'inscrire' }}
+
+
+
+
+
+ Déjà un compte ?
+
+ Se connecter
+
+
+
+
+
+
+
+
+
+
Inscriptions désactivées
+
+ Les nouvelles inscriptions sont temporairement désactivées. Veuillez contacter l'administrateur.
+
+
+
+
+
+
+
+
diff --git a/backup/_data/src/views/Stats.vue b/backup/_data/src/views/Stats.vue
new file mode 100755
index 0000000..de4557e
--- /dev/null
+++ b/backup/_data/src/views/Stats.vue
@@ -0,0 +1,307 @@
+
+
+
Statistiques du groupe
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Membres actifs
+
{{ overview.total_users }}
+
+
+
+
+
+
+
+
+
Événements
+
{{ overview.total_events }}
+
+
+
+
+
+
+
+
+
Albums
+
{{ overview.total_albums }}
+
+
+
+
+
+
+
+
+
Vlogs
+
{{ overview.total_vlogs }}
+
+
+
+
+
+
+
+
+
+
Taux de présence
+
+
+ Aucune donnée de présence disponible
+
+
+
+
+
+
+ {{ index + 1 }}
+
+
+
+
+
+
{{ Math.round(user.attendance_rate) }}%
+
{{ user.present_count }}/{{ user.total_past_events }} événements
+
+
+
+
+
+
+
+ 🏆 {{ attendanceStats.best_attendee.full_name }} est le plus assidu avec {{ Math.round(attendanceStats.best_attendee.attendance_rate) }}% de présence !
+
+
+
+
+
+
+
+
+
Statistiques fun
+
+
+
+
+
+
+
+
Posteur le plus actif
+
{{ funStats.most_active_poster.full_name }} ({{ funStats.most_active_poster.post_count }} posts)
+
+
+
+
+
+
+
+
+
+
Le plus mentionné
+
{{ funStats.most_mentioned.full_name }} ({{ funStats.most_mentioned.mention_count }} mentions)
+
+
+
+
+
+
+
+
+
+
Vlogger le plus prolifique
+
{{ funStats.biggest_vlogger.full_name }} ({{ funStats.biggest_vlogger.vlog_count }} vlogs)
+
+
+
+
+
+
+
+
+
+
Accro aux photos
+
{{ funStats.photo_addict.full_name }} ({{ funStats.photo_addict.album_count }} albums)
+
+
+
+
+
+
+
+
+
+
Organisateur d'événements
+
{{ funStats.event_organizer.full_name }} ({{ funStats.event_organizer.event_count }} événements)
+
+
+
+
+
+
+
+
+
+
Vlog le plus vu
+
{{ funStats.most_viewed_vlog.title }} ({{ funStats.most_viewed_vlog.views_count }} vues)
+
+
+
+
+
+
+
+
+
+
Activité récente (30 derniers jours)
+
+
+
+
{{ overview.recent_events || 0 }}
+
Nouveaux événements
+
+
+
+
{{ overview.recent_posts || 0 }}
+
Nouvelles publications
+
+
+
+
{{ overview.recent_vlogs || 0 }}
+
Nouveaux vlogs
+
+
+
+
+
+
+
Statistiques par utilisateur
+
+
+
+
+
+ Utilisateur
+ Taux de présence
+ Publications
+ Vlogs
+ Albums
+ Événements créés
+
+
+
+
+
+
+
+
+ {{ Math.round(user.user.attendance_rate) }}%
+
+
+ {{ user.content_stats.posts_count }}
+
+
+ {{ user.content_stats.vlogs_count }}
+
+
+ {{ user.content_stats.albums_count }}
+
+
+ {{ user.content_stats.events_created }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/backup/_data/src/views/UserProfile.vue b/backup/_data/src/views/UserProfile.vue
new file mode 100755
index 0000000..9227755
--- /dev/null
+++ b/backup/_data/src/views/UserProfile.vue
@@ -0,0 +1,223 @@
+
+
+
+
+
+
+
+
+
+
Profil non trouvé
+
L'utilisateur que vous recherchez n'existe pas ou a été supprimé.
+
+ Retour à l'accueil
+
+
+
+
+
+
+
+
+
+
+ Retour à l'accueil
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ profileUser.full_name }}
+
@{{ profileUser.username }}
+
+
+ {{ profileUser.bio }}
+
+
+
+
+
+
{{ userStats.posts_count || 0 }}
+
Publications
+
+
+
{{ userStats.vlogs_count || 0 }}
+
Vlogs
+
+
+
{{ userStats.albums_count || 0 }}
+
Albums
+
+
+
{{ userStats.events_created || 0 }}
+
Événements
+
+
+
+
+
+
+
Taux de présence
+
{{ profileUser.attendance_rate.toFixed(1) }}%
+
+
+
+
+
+
+
+
Activité récente
+
+
+ Aucune activité récente
+
+
+
+
+
+
+
+
+
{{ activity.description }}
+
{{ formatRelativeDate(activity.created_at) }}
+
+
+
+
+
+
+
+
+
Membre depuis
+
{{ formatDate(profileUser.created_at) }}
+
+
+
+
+
+
diff --git a/backup/_data/src/views/VlogDetail.vue b/backup/_data/src/views/VlogDetail.vue
new file mode 100755
index 0000000..2f822c2
--- /dev/null
+++ b/backup/_data/src/views/VlogDetail.vue
@@ -0,0 +1,370 @@
+
+
+
+
+
+
+
+
+
+
Vlog non trouvé
+
Le vlog que vous recherchez n'existe pas ou a été supprimé.
+
+ Retour aux vlogs
+
+
+
+
+
+
+
+
+
+
+ Retour aux vlogs
+
+
+
+
+
+ Modifier
+
+
+
+ Supprimer
+
+
+
+
+
{{ vlog.title }}
+
+
+
+
+
+
+
+
Par {{ vlog.author_name }}
+
+
+
+
+ {{ formatDate(vlog.created_at) }}
+
+
+
+
+ {{ vlog.views_count }} vue{{ vlog.views_count > 1 ? 's' : '' }}
+
+
+
+
+ {{ formatDuration(vlog.duration) }}
+
+
+
+
+
+
+
+
+
+
+
+
Description
+
{{ vlog.description }}
+
+
+
+
+
+
+
+
+
+
Autres vlogs de {{ vlog.author_name }}
+
+
+ Aucun autre vlog de cet auteur
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatDuration(relatedVlog.duration) }}
+
+
+
+
+
{{ relatedVlog.title }}
+
{{ formatRelativeDate(relatedVlog.created_at) }}
+
{{ relatedVlog.views_count }} vue{{ relatedVlog.views_count > 1 ? 's' : '' }}
+
+
+
+
+
+
+
+
+
+
+
Modifier le vlog
+
+
+
+ Titre
+
+
+
+
+ Description
+
+
+
+
+
+ Annuler
+
+
+ {{ updating ? 'Mise à jour...' : 'Mettre à jour' }}
+
+
+
+
+
+
+
+
+
+
diff --git a/backup/_data/src/views/Vlogs.vue b/backup/_data/src/views/Vlogs.vue
new file mode 100755
index 0000000..a26313d
--- /dev/null
+++ b/backup/_data/src/views/Vlogs.vue
@@ -0,0 +1,473 @@
+
+
+
+
+
+
Vlogs
+
Partagez vos moments en vidéo avec le groupe
+
+
+
+ Nouveau vlog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatDuration(vlog.duration) }}
+
+
+
+
+
+
{{ vlog.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ vlog.author_name }}
+
+
+
+
+
{{ formatRelativeDate(vlog.created_at) }}
+
+
+ {{ vlog.views_count }}
+
+
+
+
+
+
+
+
+
+ {{ loading ? 'Chargement...' : 'Charger plus' }}
+
+
+
+
+
+
+
Aucun vlog
+
Soyez le premier à partager un vlog !
+
+
+
+
+
+
+
Créer un nouveau vlog
+
+
+
+ Titre
+
+
+
+
+ Description
+
+
+
+
+
Vidéo
+
+
+
+
+
+
Cliquez pour sélectionner une vidéo
+
MP4, WebM, MOV (max {{ uploadLimits.max_video_size_mb }}MB)
+
+ Sélectionner une vidéo
+
+
+
+
+
+
+ Changer de vidéo
+
+
+
+
+
+
+
Miniature (optionnel)
+
+
+
+
+
+
Ajoutez une miniature personnalisée
+
+ Sélectionner une image
+
+
+
+
+
+
+ Changer la miniature
+
+
+
+
+
+
+
+ Annuler
+
+
+ {{ creating ? 'Création...' : 'Créer le vlog' }}
+
+
+
+
+
+
+
+
+
+
diff --git a/backup/_data/tailwind.config.js b/backup/_data/tailwind.config.js
new file mode 100755
index 0000000..eaa0ac1
--- /dev/null
+++ b/backup/_data/tailwind.config.js
@@ -0,0 +1,78 @@
+/** @type {import('tailwindcss').Config} */
+module.exports = {
+ content: [
+ "./index.html",
+ "./src/**/*.{vue,js,ts,jsx,tsx}",
+ ],
+ theme: {
+ extend: {
+ colors: {
+ // Discord-style color palette
+ primary: {
+ 50: '#f5f3ff', // Violet très pâle
+ 100: '#ede9fe', // Violet pâle
+ 200: '#ddd6fe', // Violet clair
+ 300: '#c4b5fd', // Violet moyen
+ 400: '#a78bfa', // Violet
+ 500: '#8b5cf6', // Violet principal
+ 600: '#7c3aed', // Violet foncé
+ 700: '#6d28d9', // Violet plus foncé
+ 800: '#5b21b6', // Violet très foncé
+ 900: '#4c1d95', // Violet le plus foncé
+ },
+ secondary: {
+ 50: '#f8fafc', // Gris très pâle
+ 100: '#f1f5f9', // Gris pâle
+ 200: '#e2e8f0', // Gris clair
+ 300: '#cbd5e1', // Gris moyen
+ 400: '#94a3b8', // Gris
+ 500: '#64748b', // Gris principal
+ 600: '#475569', // Gris foncé
+ 700: '#334155', // Gris plus foncé
+ 800: '#1e293b', // Gris très foncé
+ 900: '#0f172a', // Gris le plus foncé
+ },
+ accent: {
+ 50: '#fef2f2', // Rouge très pâle
+ 100: '#fee2e2', // Rouge pâle
+ 200: '#fecaca', // Rouge clair
+ 300: '#fca5a5', // Rouge moyen
+ 400: '#f87171', // Rouge
+ 500: '#ef4444', // Rouge principal
+ 600: '#dc2626', // Rouge foncé
+ 700: '#b91c1c', // Rouge plus foncé
+ 800: '#991b1b', // Rouge très foncé
+ 900: '#7f1d1d', // Rouge le plus foncé
+ },
+ success: {
+ 50: '#f0fdf4', // Vert très pâle
+ 100: '#dcfce7', // Vert pâle
+ 200: '#bbf7d0', // Vert clair
+ 300: '#86efac', // Vert moyen
+ 400: '#4ade80', // Vert
+ 500: '#22c55e', // Vert principal
+ 600: '#16a34a', // Vert foncé
+ 700: '#15803d', // Vert plus foncé
+ 800: '#166534', // Vert très foncé
+ 900: '#14532d', // Vert le plus foncé
+ },
+ warning: {
+ 50: '#fffbeb', // Jaune très pâle
+ 100: '#fef3c7', // Jaune pâle
+ 200: '#fde68a', // Jaune clair
+ 300: '#fcd34d', // Jaune moyen
+ 400: '#fbbf24', // Jaune
+ 500: '#f59e0b', // Jaune principal
+ 600: '#d97706', // Jaune foncé
+ 700: '#b45309', // Jaune plus foncé
+ 800: '#92400e', // Jaune très foncé
+ 900: '#78350f', // Jaune le plus foncé
+ }
+ },
+ fontFamily: {
+ sans: ['Inter', 'system-ui', 'sans-serif'],
+ },
+ },
+ },
+ plugins: [],
+}
diff --git a/backup/_data/test-env.js b/backup/_data/test-env.js
new file mode 100755
index 0000000..a017195
--- /dev/null
+++ b/backup/_data/test-env.js
@@ -0,0 +1,222 @@
+#!/usr/bin/env node
+
+/**
+ * Script de test des environnements Frontend LeDiscord
+ * Vérifie la cohérence des configurations et évite les problèmes de mixed content
+ */
+
+const fs = require('fs')
+const path = require('path')
+
+// Couleurs pour la console
+const colors = {
+ reset: '\x1b[0m',
+ bright: '\x1b[1m',
+ red: '\x1b[31m',
+ green: '\x1b[32m',
+ yellow: '\x1b[33m',
+ blue: '\x1b[34m',
+ magenta: '\x1b[35m',
+ cyan: '\x1b[36m'
+}
+
+function log(message, color = 'reset') {
+ console.log(`${colors[color]}${message}${colors.reset}`)
+}
+
+function testEnvironment(envName) {
+ log(`\n🔍 Test de l'environnement: ${envName.toUpperCase()}`, 'cyan')
+
+ const envFile = path.join(__dirname, `env.${envName}`)
+
+ if (!fs.existsSync(envFile)) {
+ log(`❌ Fichier ${envFile} non trouvé`, 'red')
+ return false
+ }
+
+ log(`✅ Fichier ${envFile} trouvé`, 'green')
+
+ // Lire le fichier d'environnement
+ const envContent = fs.readFileSync(envFile, 'utf8')
+ const envVars = {}
+
+ // Parser les variables d'environnement
+ envContent.split('\n').forEach(line => {
+ line = line.trim()
+ if (line && !line.startsWith('#')) {
+ const [key, ...valueParts] = line.split('=')
+ if (key && valueParts.length > 0) {
+ envVars[key] = valueParts.join('=')
+ }
+ }
+ })
+
+ // Vérifier les variables requises
+ const requiredVars = ['VITE_API_URL', 'VITE_APP_URL', 'VITE_UPLOAD_URL', 'VITE_ENVIRONMENT']
+ let allValid = true
+
+ requiredVars.forEach(varName => {
+ if (!envVars[varName]) {
+ log(`❌ Variable manquante: ${varName}`, 'red')
+ allValid = false
+ } else {
+ log(`✅ ${varName}: ${envVars[varName]}`, 'green')
+ }
+ })
+
+ // Vérifier la cohérence des protocoles
+ if (envVars.VITE_API_URL && envVars.VITE_APP_URL) {
+ const apiProtocol = envVars.VITE_API_URL.split('://')[0]
+ const appProtocol = envVars.VITE_APP_URL.split('://')[0]
+
+ if (apiProtocol !== appProtocol) {
+ log(`⚠️ Protocoles différents: API=${apiProtocol}, APP=${appProtocol}`, 'yellow')
+ log(` Cela peut causer des problèmes de mixed content!`, 'yellow')
+ allValid = false
+ } else {
+ log(`✅ Protocoles cohérents: ${apiProtocol}`, 'green')
+ }
+ }
+
+ // Vérifier la cohérence des domaines
+ if (envVars.VITE_API_URL && envVars.VITE_APP_URL) {
+ const apiDomain = envVars.VITE_API_URL.split('://')[1]?.split('/')[0]
+ const appDomain = envVars.VITE_APP_URL.split('://')[1]?.split('/')[0]
+
+ if (apiDomain && appDomain) {
+ if (envName === 'local') {
+ // En local, les domaines peuvent être différents (localhost:8000 vs localhost:5173)
+ log(`✅ Domaines locaux: API=${apiDomain}, APP=${appDomain}`, 'green')
+ } else if (apiDomain.includes('dev.') && appDomain.includes('dev.')) {
+ log(`✅ Domaines de développement cohérents: ${apiDomain}`, 'green')
+ } else if (!apiDomain.includes('dev.') && !appDomain.includes('dev.')) {
+ log(`✅ Domaines de production cohérents: ${apiDomain}`, 'green')
+ } else {
+ log(`⚠️ Domaines incohérents: API=${apiDomain}, APP=${appDomain}`, 'yellow')
+ allValid = false
+ }
+ }
+ }
+
+ // Vérifier l'environnement spécifié
+ if (envVars.VITE_ENVIRONMENT && envVars.VITE_ENVIRONMENT !== envName) {
+ log(`⚠️ Environnement spécifié (${envVars.VITE_ENVIRONMENT}) ne correspond pas au nom du fichier (${envName})`, 'yellow')
+ allValid = false
+ }
+
+ return allValid
+}
+
+function testDockerfiles() {
+ log(`\n🐳 Test des Dockerfiles`, 'cyan')
+
+ const dockerfiles = ['Dockerfile.local', 'Dockerfile.dev', 'Dockerfile.prod']
+ let allValid = true
+
+ dockerfiles.forEach(dockerfile => {
+ const dockerfilePath = path.join(__dirname, dockerfile)
+ if (fs.existsSync(dockerfilePath)) {
+ log(`✅ ${dockerfile} trouvé`, 'green')
+
+ // Vérifier que le Dockerfile copie le bon fichier d'environnement
+ const content = fs.readFileSync(dockerfilePath, 'utf8')
+ const envName = dockerfile.replace('Dockerfile.', '')
+
+ if (content.includes(`env.${envName}`)) {
+ log(`✅ ${dockerfile} copie le bon fichier env.${envName}`, 'green')
+ } else {
+ log(`❌ ${dockerfile} ne copie pas env.${envName}`, 'red')
+ allValid = false
+ }
+ } else {
+ log(`❌ ${dockerfile} manquant`, 'red')
+ allValid = false
+ }
+ })
+
+ return allValid
+}
+
+function testViteConfig() {
+ log(`\n⚙️ Test de la configuration Vite`, 'cyan')
+
+ const viteConfigPath = path.join(__dirname, 'vite.config.js')
+
+ if (!fs.existsSync(viteConfigPath)) {
+ log(`❌ vite.config.js non trouvé`, 'red')
+ return false
+ }
+
+ log(`✅ vite.config.js trouvé`, 'green')
+
+ // Vérifier que la configuration gère les environnements
+ const content = fs.readFileSync(viteConfigPath, 'utf8')
+
+ if (content.includes('getEnvironmentConfig')) {
+ log(`✅ Configuration par environnement détectée`, 'green')
+ } else {
+ log(`⚠️ Configuration par environnement non détectée`, 'yellow')
+ }
+
+ if (content.includes('proxy')) {
+ log(`✅ Configuration proxy détectée`, 'green')
+ } else {
+ log(`⚠️ Configuration proxy non détectée`, 'yellow')
+ }
+
+ return true
+}
+
+function main() {
+ const args = process.argv.slice(2)
+
+ log(`🚀 Test des environnements Frontend LeDiscord`, 'bright')
+ log(`📁 Répertoire: ${__dirname}`, 'blue')
+
+ let allTestsPassed = true
+
+ if (args.length > 0) {
+ // Test d'un environnement spécifique
+ const envName = args[0]
+ if (['local', 'development', 'production'].includes(envName)) {
+ allTestsPassed = testEnvironment(envName) && allTestsPassed
+ } else {
+ log(`❌ Environnement invalide: ${envName}`, 'red')
+ log(` Environnements valides: local, development, production`, 'yellow')
+ process.exit(1)
+ }
+ } else {
+ // Test de tous les environnements
+ log(`\n🌍 Test de tous les environnements`, 'cyan')
+
+ const environments = ['local', 'development', 'production']
+ environments.forEach(env => {
+ allTestsPassed = testEnvironment(env) && allTestsPassed
+ })
+ }
+
+ // Tests généraux
+ allTestsPassed = testDockerfiles() && allTestsPassed
+ allTestsPassed = testViteConfig() && allTestsPassed
+
+ // Résumé
+ log(`\n📊 Résumé des tests`, 'cyan')
+ if (allTestsPassed) {
+ log(`✅ Tous les tests sont passés avec succès!`, 'green')
+ log(`🎉 Votre configuration frontend est prête pour la production!`, 'green')
+ } else {
+ log(`❌ Certains tests ont échoué`, 'red')
+ log(`🔧 Veuillez corriger les problèmes avant de continuer`, 'yellow')
+ process.exit(1)
+ }
+
+ log(`\n💡 Conseils pour éviter les problèmes de mixed content:`, 'cyan')
+ log(` - Assurez-vous que toutes les URLs d'un même environnement utilisent le même protocole`, 'blue')
+ log(` - En local: utilisez HTTP (http://localhost:*)`, 'blue')
+ log(` - En développement/production: utilisez HTTPS (https://*.lediscord.com)`, 'blue')
+ log(` - Vérifiez que VITE_API_URL et VITE_APP_URL sont cohérents`, 'blue')
+}
+
+if (require.main === module) {
+ main()
+}
diff --git a/backup/_data/vite.config.js b/backup/_data/vite.config.js
new file mode 100755
index 0000000..056c285
--- /dev/null
+++ b/backup/_data/vite.config.js
@@ -0,0 +1,131 @@
+const { defineConfig } = require('vite')
+const vue = require('@vitejs/plugin-vue')
+const path = require('path')
+
+// Configuration par environnement
+const getEnvironmentConfig = (mode) => {
+ const configs = {
+ local: {
+ server: {
+ host: '0.0.0.0',
+ port: 5173,
+ allowedHosts: ['localhost', '127.0.0.1'],
+ proxy: {
+ '/api': {
+ target: 'http://localhost:8000',
+ changeOrigin: true,
+ secure: false
+ },
+ '/uploads': {
+ target: 'http://localhost:8000',
+ changeOrigin: true,
+ secure: false
+ }
+ }
+ },
+ define: {
+ __ENVIRONMENT__: '"local"'
+ }
+ },
+ development: {
+ server: {
+ host: '0.0.0.0',
+ port: 5173,
+ allowedHosts: ['dev.lediscord.com', 'localhost'],
+ // Pas de proxy en développement car l'API est externe (https://api-dev.lediscord.com)
+ // Le proxy n'est nécessaire que pour l'environnement local
+ },
+ define: {
+ __ENVIRONMENT__: '"development"'
+ }
+ },
+ production: {
+ server: {
+ host: '0.0.0.0',
+ port: 5173,
+ allowedHosts: ['lediscord.com', 'www.lediscord.com'],
+ proxy: {
+ '/api': {
+ target: 'https://api.lediscord.com',
+ changeOrigin: true,
+ secure: true
+ },
+ '/uploads': {
+ target: 'https://api.lediscord.com',
+ changeOrigin: true,
+ secure: true
+ }
+ }
+ },
+ define: {
+ __ENVIRONMENT__: '"production"'
+ }
+ }
+ }
+
+ return configs[mode] || configs.local
+}
+
+module.exports = defineConfig(({ command, mode }) => {
+ // Détecter l'environnement
+ const env = process.env.NODE_ENV || mode || 'local'
+ const envConfig = getEnvironmentConfig(env)
+
+ console.log(`🚀 Configuration Vite pour l'environnement: ${env.toUpperCase()}`)
+ console.log(`🔧 Variables d'environnement:`, {
+ NODE_ENV: process.env.NODE_ENV,
+ VITE_ENVIRONMENT: process.env.VITE_ENVIRONMENT,
+ VITE_API_URL: process.env.VITE_API_URL,
+ VITE_APP_URL: process.env.VITE_APP_URL
+ })
+
+ return {
+ plugins: [vue()],
+ resolve: {
+ alias: {
+ '@': path.resolve(__dirname, './src')
+ }
+ },
+
+ // Configuration du serveur selon l'environnement
+ server: envConfig.server,
+
+ // Configuration pour la production
+ build: {
+ rollupOptions: {
+ output: {
+ manualChunks: {
+ vendor: ['vue', 'vue-router', 'pinia'],
+ utils: ['axios', 'date-fns']
+ }
+ }
+ },
+ // Optimisations de production
+ minify: env === 'production' ? 'terser' : false,
+ sourcemap: env !== 'production',
+ // Variables d'environnement
+ define: envConfig.define
+ },
+
+ // Configuration des variables d'environnement
+ define: {
+ ...envConfig.define,
+ __BUILD_TIME__: JSON.stringify(new Date().toISOString()),
+ // Forcer les variables d'environnement
+ 'import.meta.env.VITE_ENVIRONMENT': JSON.stringify(process.env.VITE_ENVIRONMENT || env),
+ 'import.meta.env.VITE_API_URL': JSON.stringify(process.env.VITE_API_URL),
+ 'import.meta.env.VITE_APP_URL': JSON.stringify(process.env.VITE_APP_URL)
+ },
+
+ // Optimisations selon l'environnement
+ optimizeDeps: {
+ include: ['vue', 'vue-router', 'pinia', 'axios']
+ },
+
+ // Configuration des assets
+ assetsInclude: ['**/*.png', '**/*.jpg', '**/*.jpeg', '**/*.gif', '**/*.svg', '**/*.mp4', '**/*.webm'],
+
+ // Configuration du mode
+ mode: env === 'production' ? 'production' : 'development'
+ }
+})
diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml
new file mode 100755
index 0000000..38ee937
--- /dev/null
+++ b/docker-compose.dev.yml
@@ -0,0 +1,66 @@
+services:
+ postgres:
+ image: postgres:15-alpine
+ container_name: lediscord_db_dev
+ environment:
+ POSTGRES_DB: lediscord
+ POSTGRES_USER: lediscord_user
+ POSTGRES_PASSWORD: ${DB_PASSWORD:-lediscord_password}
+ volumes:
+ - postgres_data_dev:/var/lib/postgresql/data
+ ports:
+ - "5432:5432"
+ networks:
+ - lediscord_network_dev
+ healthcheck:
+ test: ["CMD-SHELL", "pg_isready -U lediscord_user -d lediscord"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+ restart: unless-stopped
+
+ backend:
+ build:
+ context: ./backend
+ dockerfile: Dockerfile.dev
+ container_name: lediscord_backend_dev
+ env_file:
+ - ./backend/.env.development
+ environment:
+ # Variables spécifiques au docker-compose (peuvent surcharger .env)
+ DB_PASSWORD: ${DB_PASSWORD:-lediscord_password}
+ volumes:
+ - ${UPLOAD_PATH:-./uploads}:/app/uploads
+ - ./backend:/app
+ ports:
+ - "8002:8000"
+ depends_on:
+ postgres:
+ condition: service_healthy
+ networks:
+ - lediscord_network_dev
+ restart: unless-stopped
+
+ frontend:
+ build:
+ context: ./frontend
+ dockerfile: Dockerfile.dev
+ container_name: lediscord_frontend_dev
+ env_file:
+ - ./frontend/.env.development
+ volumes:
+ - ./frontend:/app
+ - /app/node_modules
+ ports:
+ - "8082:5173"
+ networks:
+ - lediscord_network_dev
+ command: npm run dev #-- --host
+ restart: unless-stopped
+
+networks:
+ lediscord_network_dev:
+ driver: bridge
+
+volumes:
+ postgres_data_dev:
diff --git a/docker-compose.local.yml b/docker-compose.local.yml
new file mode 100755
index 0000000..5b628d4
--- /dev/null
+++ b/docker-compose.local.yml
@@ -0,0 +1,65 @@
+services:
+ postgres:
+ image: postgres:15-alpine
+ container_name: lediscord_db_local
+ environment:
+ POSTGRES_DB: lediscord
+ POSTGRES_USER: lediscord_user
+ POSTGRES_PASSWORD: ${DB_PASSWORD:-lediscord_password}
+ volumes:
+ - postgres_data_local:/var/lib/postgresql/data
+ ports:
+ - "5432:5432"
+ networks:
+ - lediscord_network_local
+ healthcheck:
+ test: ["CMD-SHELL", "pg_isready -U lediscord_user -d lediscord"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ backend:
+ build:
+ context: ./backend
+ dockerfile: Dockerfile.local
+ container_name: lediscord_backend_local
+ env_file:
+ - ./backend/.env.local
+ environment:
+ # Variables spécifiques au docker-compose (peuvent surcharger .env)
+ DB_PASSWORD: ${DB_PASSWORD:-lediscord_password}
+ volumes:
+ - ${UPLOAD_PATH:-./uploads}:/app/uploads
+ - ./backend:/app
+ ports:
+ - "8000:8000"
+ depends_on:
+ postgres:
+ condition: service_healthy
+ networks:
+ - lediscord_network_local
+ restart: unless-stopped
+
+ frontend:
+ build:
+ context: ./frontend
+ dockerfile: Dockerfile.local
+ container_name: lediscord_frontend_local
+ env_file:
+ - ./frontend/.env.local
+ volumes:
+ - ./frontend:/app
+ - /app/node_modules
+ ports:
+ - "5173:5173"
+ networks:
+ - lediscord_network_local
+ command: npm run dev -- --host
+ restart: unless-stopped
+
+networks:
+ lediscord_network_local:
+ driver: bridge
+
+volumes:
+ postgres_data_local:
diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml
new file mode 100755
index 0000000..f3a9f99
--- /dev/null
+++ b/docker-compose.prod.yml
@@ -0,0 +1,59 @@
+services:
+ postgres:
+ image: postgres:15-alpine
+ container_name: lediscord_db_prod
+ environment:
+ POSTGRES_DB: lediscord
+ POSTGRES_USER: lediscord_user
+ POSTGRES_PASSWORD: ${DB_PASSWORD:-lediscord_password}
+ volumes:
+ - postgres_data_prod:/var/lib/postgresql/data
+ networks:
+ - lediscord_network_prod
+ healthcheck:
+ test: ["CMD-SHELL", "pg_isready -U lediscord_user -d lediscord"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+ restart: unless-stopped
+
+ backend:
+ build:
+ context: ./backend
+ dockerfile: Dockerfile.prod
+ container_name: lediscord_backend_prod
+ env_file:
+ - ./backend/.env.production
+ environment:
+ # Variables spécifiques au docker-compose (peuvent surcharger .env)
+ DB_PASSWORD: ${DB_PASSWORD:-lediscord_password}
+ volumes:
+ - ${UPLOAD_PATH:-./uploads}:/app/uploads
+ ports:
+ - "8001:8000"
+ depends_on:
+ postgres:
+ condition: service_healthy
+ networks:
+ - lediscord_network_prod
+ restart: unless-stopped
+
+ frontend:
+ build:
+ context: ./frontend
+ dockerfile: Dockerfile.prod
+ container_name: lediscord_frontend_prod
+ env_file:
+ - ./frontend/.env.production
+ ports:
+ - "8080:80"
+ networks:
+ - lediscord_network_prod
+ restart: unless-stopped
+
+networks:
+ lediscord_network_prod:
+ driver: bridge
+
+volumes:
+ postgres_data_prod:
diff --git a/docker-compose.yml b/docker-compose.yml
deleted file mode 100644
index 275852f..0000000
--- a/docker-compose.yml
+++ /dev/null
@@ -1,70 +0,0 @@
-services:
- postgres:
- image: postgres:15-alpine
- container_name: lediscord_db
- environment:
- POSTGRES_DB: lediscord
- POSTGRES_USER: lediscord_user
- POSTGRES_PASSWORD: ${DB_PASSWORD:-lediscord_password}
- volumes:
- - postgres_data:/var/lib/postgresql/data
- ports:
- - "0.0.0.0:5432:5432"
- networks:
- - lediscord_network
- healthcheck:
- test: ["CMD-SHELL", "pg_isready -U lediscord_user -d lediscord"]
- interval: 10s
- timeout: 5s
- retries: 5
-
- backend:
- build:
- context: ./backend
- dockerfile: Dockerfile
- container_name: lediscord_backend
- environment:
- DATABASE_URL: postgresql://lediscord_user:${DB_PASSWORD:-lediscord_password}@postgres:5432/lediscord
- JWT_SECRET_KEY: ${JWT_SECRET_KEY:-your-super-secret-jwt-key-change-me}
- JWT_ALGORITHM: HS256
- JWT_EXPIRATION_MINUTES: 10080
- UPLOAD_PATH: /app/uploads
- CORS_ORIGINS: http://localhost:5173,http://localhost:3000
- SMTP_HOST: ${SMTP_HOST:-smtp.gmail.com}
- SMTP_PORT: ${SMTP_PORT:-587}
- SMTP_USER: ${SMTP_USER:-}
- SMTP_PASSWORD: ${SMTP_PASSWORD:-}
- volumes:
- - ./backend:/app
- - ${UPLOAD_PATH:-./uploads}:/app/uploads
- ports:
- - "8000:8000"
- depends_on:
- postgres:
- condition: service_healthy
- networks:
- - lediscord_network
- command: uvicorn app:app --host 0.0.0.0 --port 8000 --reload
-
- frontend:
- build:
- context: ./frontend
- dockerfile: Dockerfile
- container_name: lediscord_frontend
- volumes:
- - ./frontend:/app
- - /app/node_modules
- ports:
- - "5173:5173"
- networks:
- - lediscord_network
- environment:
- - VITE_API_URL=http://localhost:8000
- command: npm run dev -- --host
-
-networks:
- lediscord_network:
- driver: bridge
-
-volumes:
- postgres_data:
diff --git a/env.example b/env.example
deleted file mode 100644
index db57e17..0000000
--- a/env.example
+++ /dev/null
@@ -1,39 +0,0 @@
-# ===========================================
-# LeDiscord - Configuration d'environnement
-# ===========================================
-# Copiez ce fichier vers .env et modifiez les valeurs
-
-# ===========================================
-# BASE DE DONNÉES
-# ===========================================
-DB_PASSWORD=lediscord_password_change_me
-
-# ===========================================
-# JWT (SÉCURITÉ)
-# ===========================================
-JWT_SECRET_KEY=your-super-secret-jwt-key-change-me-to-something-very-long-and-random
-
-# ===========================================
-# EMAIL (OPTIONNEL)
-# ===========================================
-SMTP_HOST=smtp.gmail.com
-SMTP_PORT=587
-SMTP_USER=your-email@gmail.com
-SMTP_PASSWORD=your-app-password
-
-# ===========================================
-# UPLOAD ET STOCKAGE
-# ===========================================
-UPLOAD_PATH=./uploads
-
-# ===========================================
-# ADMIN PAR DÉFAUT
-# ===========================================
-ADMIN_EMAIL=admin@lediscord.com
-ADMIN_PASSWORD=admin123_change_me
-
-# ===========================================
-# CORS (DÉVELOPPEMENT)
-# ===========================================
-# Ces valeurs sont utilisées par défaut dans le code
-# CORS_ORIGINS=http://localhost:5173,http://localhost:3000
diff --git a/frontend/Dockerfile b/frontend/Dockerfile
deleted file mode 100644
index d6a1f77..0000000
--- a/frontend/Dockerfile
+++ /dev/null
@@ -1,18 +0,0 @@
-FROM node:18-alpine
-
-WORKDIR /app
-
-# Copy package files
-COPY package*.json ./
-
-# Install dependencies
-RUN npm install
-
-# Copy application files
-COPY . .
-
-# Expose port
-EXPOSE 5173
-
-# Run the application
-CMD ["npm", "run", "dev"]
diff --git a/frontend/Dockerfile.dev b/frontend/Dockerfile.dev
new file mode 100755
index 0000000..b910b39
--- /dev/null
+++ b/frontend/Dockerfile.dev
@@ -0,0 +1,30 @@
+FROM node:18-alpine
+
+# Métadonnées
+LABEL maintainer="LeDiscord Team"
+LABEL version="1.0"
+LABEL description="LeDiscord Frontend - Environnement Development"
+
+WORKDIR /app
+
+# Variables d'environnement pour le développement
+ENV NODE_ENV=development
+ENV VITE_ENVIRONMENT=development
+
+# Copy package files first for better caching
+COPY package*.json ./
+
+# Install dependencies
+RUN npm ci
+
+# Copy application files
+COPY . .
+
+# Copy development environment file
+COPY .env.development .env
+
+# Expose port
+EXPOSE 5173
+
+# Run the application in development mode
+CMD ["npm", "run", "dev"]
diff --git a/frontend/Dockerfile.prod b/frontend/Dockerfile.prod
new file mode 100755
index 0000000..d5b5b81
--- /dev/null
+++ b/frontend/Dockerfile.prod
@@ -0,0 +1,50 @@
+# Multi-stage build pour la production
+FROM node:18-alpine AS builder
+
+# Métadonnées
+LABEL maintainer="LeDiscord Team"
+LABEL version="1.0"
+LABEL description="LeDiscord Frontend - Build Production"
+
+WORKDIR /app
+
+# Variables d'environnement pour la production
+ENV NODE_ENV=production
+ENV VITE_ENVIRONMENT=production
+
+# Copy package files first for better caching
+COPY package*.json ./
+
+# Install dependencies
+RUN npm ci
+
+# Copy application files
+COPY . .
+
+# Copy production environment file
+COPY .env.production .env
+
+# Debug: Vérifier le contenu du fichier .env
+RUN echo "=== Contenu du fichier .env ===" && cat .env
+RUN echo "=== Variables d'environnement ===" && env | grep VITE
+
+# Charger les variables d'environnement depuis le fichier .env (en filtrant les commentaires)
+RUN export $(cat .env | grep -v '^#' | grep -v '^$' | xargs) && echo "=== Variables après export ===" && env | grep VITE
+
+# Build the application avec les variables d'environnement chargées
+RUN export $(cat .env | grep -v '^#' | grep -v '^$' | xargs) && npm run build
+
+# Production stage
+FROM nginx:alpine
+
+# Copy built application
+COPY --from=builder /app/dist /usr/share/nginx/html
+
+# Copy nginx configuration
+COPY nginx-frontend.conf /etc/nginx/nginx.conf
+
+# Expose port
+EXPOSE 80
+
+# Start nginx
+CMD ["nginx", "-g", "daemon off;"]
diff --git a/frontend/index.html b/frontend/index.html
old mode 100644
new mode 100755
diff --git a/frontend/nginx-frontend.conf b/frontend/nginx-frontend.conf
new file mode 100755
index 0000000..3e8d41a
--- /dev/null
+++ b/frontend/nginx-frontend.conf
@@ -0,0 +1,64 @@
+events {
+ worker_connections 1024;
+}
+
+http {
+ include /etc/nginx/mime.types;
+ default_type application/octet-stream;
+
+ # Logging
+ log_format main '$remote_addr - $remote_user [$time_local] "$request" '
+ '$status $body_bytes_sent "$http_referer" '
+ '"$http_user_agent" "$http_x_forwarded_for"';
+
+ access_log /var/log/nginx/access.log main;
+ error_log /var/log/nginx/error.log warn;
+
+ # Basic settings
+ sendfile on;
+ tcp_nopush on;
+ tcp_nodelay on;
+ keepalive_timeout 65;
+ types_hash_max_size 2048;
+
+ # Gzip compression
+ gzip on;
+ gzip_vary on;
+ gzip_min_length 1024;
+ gzip_proxied expired no-cache no-store private auth;
+ gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss;
+
+ server {
+ listen 80;
+ server_name localhost;
+
+ root /usr/share/nginx/html;
+ index index.html;
+
+ # Static files with long cache
+ location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
+ expires 1y;
+ add_header Cache-Control "public, immutable";
+ try_files $uri =404;
+ }
+
+ # Vue Router - SPA fallback
+ location / {
+ try_files $uri $uri/ /index.html;
+ add_header Cache-Control "no-cache, no-store, must-revalidate";
+ }
+
+ # Health check
+ location /health {
+ access_log off;
+ return 200 "healthy\n";
+ add_header Content-Type text/plain;
+ }
+
+ # Security headers
+ add_header X-Frame-Options "SAMEORIGIN" always;
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header X-XSS-Protection "1; mode=block" always;
+ add_header Referrer-Policy "strict-origin-when-cross-origin" always;
+ }
+}
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
new file mode 100755
index 0000000..66f5469
--- /dev/null
+++ b/frontend/package-lock.json
@@ -0,0 +1,3396 @@
+{
+ "name": "lediscord-frontend",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "lediscord-frontend",
+ "version": "1.0.0",
+ "dependencies": {
+ "@vueuse/core": "^10.6.1",
+ "axios": "^1.6.2",
+ "date-fns": "^2.30.0",
+ "lucide-vue-next": "^0.294.0",
+ "pinia": "^2.1.7",
+ "video.js": "^8.6.1",
+ "vue": "^3.3.8",
+ "vue-router": "^4.2.5",
+ "vue-toastification": "^2.0.0-rc.5"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "^4.5.0",
+ "autoprefixer": "^10.4.16",
+ "postcss": "^8.4.31",
+ "tailwindcss": "^3.3.5",
+ "terser": "^5.43.1",
+ "vite": "^5.0.0"
+ }
+ },
+ "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/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz",
+ "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.2"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz",
+ "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.28.2",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz",
+ "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "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/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==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.30",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz",
+ "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "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/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.47.1.tgz",
+ "integrity": "sha512-lTahKRJip0knffA/GTNFJMrToD+CM+JJ+Qt5kjzBK/sFQ0EWqfKW3AYQSlZXN98tX0lx66083U9JYIMioMMK7g==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.47.1.tgz",
+ "integrity": "sha512-uqxkb3RJLzlBbh/bbNQ4r7YpSZnjgMgyoEOY7Fy6GCbelkDSAzeiogxMG9TfLsBbqmGsdDObo3mzGqa8hps4MA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.47.1.tgz",
+ "integrity": "sha512-tV6reObmxBDS4DDyLzTDIpymthNlxrLBGAoQx6m2a7eifSNEZdkXQl1PE4ZjCkEDPVgNXSzND/k9AQ3mC4IOEQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.47.1.tgz",
+ "integrity": "sha512-XuJRPTnMk1lwsSnS3vYyVMu4x/+WIw1MMSiqj5C4j3QOWsMzbJEK90zG+SWV1h0B1ABGCQ0UZUjti+TQK35uHQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.47.1.tgz",
+ "integrity": "sha512-79BAm8Ag/tmJ5asCqgOXsb3WY28Rdd5Lxj8ONiQzWzy9LvWORd5qVuOnjlqiWWZJw+dWewEktZb5yiM1DLLaHw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.47.1.tgz",
+ "integrity": "sha512-OQ2/ZDGzdOOlyfqBiip0ZX/jVFekzYrGtUsqAfLDbWy0jh1PUU18+jYp8UMpqhly5ltEqotc2miLngf9FPSWIA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.47.1.tgz",
+ "integrity": "sha512-HZZBXJL1udxlCVvoVadstgiU26seKkHbbAMLg7680gAcMnRNP9SAwTMVet02ANA94kXEI2VhBnXs4e5nf7KG2A==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.47.1.tgz",
+ "integrity": "sha512-sZ5p2I9UA7T950JmuZ3pgdKA6+RTBr+0FpK427ExW0t7n+QwYOcmDTK/aRlzoBrWyTpJNlS3kacgSlSTUg6P/Q==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.47.1.tgz",
+ "integrity": "sha512-3hBFoqPyU89Dyf1mQRXCdpc6qC6At3LV6jbbIOZd72jcx7xNk3aAp+EjzAtN6sDlmHFzsDJN5yeUySvorWeRXA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.47.1.tgz",
+ "integrity": "sha512-49J4FnMHfGodJWPw73Ve+/hsPjZgcXQGkmqBGZFvltzBKRS+cvMiWNLadOMXKGnYRhs1ToTGM0sItKISoSGUNA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.47.1.tgz",
+ "integrity": "sha512-4yYU8p7AneEpQkRX03pbpLmE21z5JNys16F1BZBZg5fP9rIlb0TkeQjn5du5w4agConCCEoYIG57sNxjryHEGg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.47.1.tgz",
+ "integrity": "sha512-fAiq+J28l2YMWgC39jz/zPi2jqc0y3GSRo1yyxlBHt6UN0yYgnegHSRPa3pnHS5amT/efXQrm0ug5+aNEu9UuQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.47.1.tgz",
+ "integrity": "sha512-daoT0PMENNdjVYYU9xec30Y2prb1AbEIbb64sqkcQcSaR0zYuKkoPuhIztfxuqN82KYCKKrj+tQe4Gi7OSm1ow==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.47.1.tgz",
+ "integrity": "sha512-JNyXaAhWtdzfXu5pUcHAuNwGQKevR+6z/poYQKVW+pLaYOj9G1meYc57/1Xv2u4uTxfu9qEWmNTjv/H/EpAisw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.47.1.tgz",
+ "integrity": "sha512-U/CHbqKSwEQyZXjCpY43/GLYcTVKEXeRHw0rMBJP7fP3x6WpYG4LTJWR3ic6TeYKX6ZK7mrhltP4ppolyVhLVQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.47.1.tgz",
+ "integrity": "sha512-uTLEakjxOTElfeZIGWkC34u2auLHB1AYS6wBjPGI00bWdxdLcCzK5awjs25YXpqB9lS8S0vbO0t9ZcBeNibA7g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.47.1.tgz",
+ "integrity": "sha512-Ft+d/9DXs30BK7CHCTX11FtQGHUdpNDLJW0HHLign4lgMgBcPFN3NkdIXhC5r9iwsMwYreBBc4Rho5ieOmKNVQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.47.1.tgz",
+ "integrity": "sha512-N9X5WqGYzZnjGAFsKSfYFtAShYjwOmFJoWbLg3dYixZOZqU7hdMq+/xyS14zKLhFhZDhP9VfkzQnsdk0ZDS9IA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.47.1.tgz",
+ "integrity": "sha512-O+KcfeCORZADEY8oQJk4HK8wtEOCRE4MdOkb8qGZQNun3jzmj2nmhV/B/ZaaZOkPmJyvm/gW9n0gsB4eRa1eiQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.47.1.tgz",
+ "integrity": "sha512-CpKnYa8eHthJa3c+C38v/E+/KZyF1Jdh2Cz3DyKZqEWYgrM1IHFArXNWvBLPQCKUEsAqqKX27tTqVEFbDNUcOA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "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/web-bluetooth": {
+ "version": "0.0.20",
+ "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
+ "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==",
+ "license": "MIT"
+ },
+ "node_modules/@videojs/http-streaming": {
+ "version": "3.17.2",
+ "resolved": "https://registry.npmjs.org/@videojs/http-streaming/-/http-streaming-3.17.2.tgz",
+ "integrity": "sha512-VBQ3W4wnKnVKb/limLdtSD2rAd5cmHN70xoMf4OmuDd0t2kfJX04G+sfw6u2j8oOm2BXYM9E1f4acHruqKnM1g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "@videojs/vhs-utils": "^4.1.1",
+ "aes-decrypter": "^4.0.2",
+ "global": "^4.4.0",
+ "m3u8-parser": "^7.2.0",
+ "mpd-parser": "^1.3.1",
+ "mux.js": "7.1.0",
+ "video.js": "^7 || ^8"
+ },
+ "engines": {
+ "node": ">=8",
+ "npm": ">=5"
+ },
+ "peerDependencies": {
+ "video.js": "^8.19.0"
+ }
+ },
+ "node_modules/@videojs/vhs-utils": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-4.1.1.tgz",
+ "integrity": "sha512-5iLX6sR2ownbv4Mtejw6Ax+naosGvoT9kY+gcuHzANyUZZ+4NpeNdKMUhb6ag0acYej1Y7cmr/F2+4PrggMiVA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "global": "^4.4.0"
+ },
+ "engines": {
+ "node": ">=8",
+ "npm": ">=5"
+ }
+ },
+ "node_modules/@videojs/xhr": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@videojs/xhr/-/xhr-2.7.0.tgz",
+ "integrity": "sha512-giab+EVRanChIupZK7gXjHy90y3nncA2phIOyG3Ne5fvpiMJzvqYwiTOnEVW2S4CoYcuKJkomat7bMXA/UoUZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "global": "~4.4.0",
+ "is-function": "^1.0.1"
+ }
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz",
+ "integrity": "sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.0.0 || ^5.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.19.tgz",
+ "integrity": "sha512-/afpyvlkrSNYbPo94Qu8GtIOWS+g5TRdOvs6XZNw6pWQQmj5pBgSZvEPOIZlqWq0YvoUhDDQaQ2TnzuJdOV4hA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.3",
+ "@vue/shared": "3.5.19",
+ "entities": "^4.5.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.19.tgz",
+ "integrity": "sha512-Drs6rPHQZx/pN9S6ml3Z3K/TWCIRPvzG2B/o5kFK9X0MNHt8/E+38tiRfojufrYBfA6FQUFB2qBBRXlcSXWtOA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.19",
+ "@vue/shared": "3.5.19"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.19.tgz",
+ "integrity": "sha512-YWCm1CYaJ+2RvNmhCwI7t3I3nU+hOrWGWMsn+Z/kmm1jy5iinnVtlmkiZwbLlbV1SRizX7vHsc0/bG5dj0zRTg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.3",
+ "@vue/compiler-core": "3.5.19",
+ "@vue/compiler-dom": "3.5.19",
+ "@vue/compiler-ssr": "3.5.19",
+ "@vue/shared": "3.5.19",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.17",
+ "postcss": "^8.5.6",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.19.tgz",
+ "integrity": "sha512-/wx0VZtkWOPdiQLWPeQeqpHWR/LuNC7bHfSX7OayBTtUy8wur6vT6EQIX6Et86aED6J+y8tTw43qo2uoqGg5sw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.19",
+ "@vue/shared": "3.5.19"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "6.6.4",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+ "license": "MIT"
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.19.tgz",
+ "integrity": "sha512-4bueZg2qs5MSsK2dQk3sssV0cfvxb/QZntTC8v7J448GLgmfPkQ+27aDjlt40+XFqOwUq5yRxK5uQh14Fc9eVA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/shared": "3.5.19"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.19.tgz",
+ "integrity": "sha512-TaooCr8Hge1sWjLSyhdubnuofs3shhzZGfyD11gFolZrny76drPwBVQj28/z/4+msSFb18tOIg6VVVgf9/IbIA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.19",
+ "@vue/shared": "3.5.19"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.19.tgz",
+ "integrity": "sha512-qmahqeok6ztuUTmV8lqd7N9ymbBzctNF885n8gL3xdCC1u2RnM/coX16Via0AiONQXUoYpxPojL3U1IsDgSWUQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.19",
+ "@vue/runtime-core": "3.5.19",
+ "@vue/shared": "3.5.19",
+ "csstype": "^3.1.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.19.tgz",
+ "integrity": "sha512-ZJ/zV9SQuaIO+BEEVq/2a6fipyrSYfjKMU3267bPUk+oTx/hZq3RzV7VCh0Unlppt39Bvh6+NzxeopIFv4HJNg==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.5.19",
+ "@vue/shared": "3.5.19"
+ },
+ "peerDependencies": {
+ "vue": "3.5.19"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.19.tgz",
+ "integrity": "sha512-IhXCOn08wgKrLQxRFKKlSacWg4Goi1BolrdEeLYn6tgHjJNXVrWJ5nzoxZqNwl5p88aLlQ8LOaoMa3AYvaKJ/Q==",
+ "license": "MIT"
+ },
+ "node_modules/@vueuse/core": {
+ "version": "10.11.1",
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz",
+ "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.20",
+ "@vueuse/metadata": "10.11.1",
+ "@vueuse/shared": "10.11.1",
+ "vue-demi": ">=0.14.8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/metadata": {
+ "version": "10.11.1",
+ "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz",
+ "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared": {
+ "version": "10.11.1",
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz",
+ "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==",
+ "license": "MIT",
+ "dependencies": {
+ "vue-demi": ">=0.14.8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@xmldom/xmldom": {
+ "version": "0.8.11",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz",
+ "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/aes-decrypter": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/aes-decrypter/-/aes-decrypter-4.0.2.tgz",
+ "integrity": "sha512-lc+/9s6iJvuaRe5qDlMTpCFjnwpkeOXp8qP3oiZ5jsj1MRg+SBVUmmICrhxHvc8OELSmc+fEyyxAuppY6hrWzw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "@videojs/vhs-utils": "^4.1.1",
+ "global": "^4.4.0",
+ "pkcs7": "^1.0.4"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz",
+ "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "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/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/autoprefixer": {
+ "version": "10.4.21",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
+ "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
+ "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.24.4",
+ "caniuse-lite": "^1.0.30001702",
+ "fraction.js": "^4.3.7",
+ "normalize-range": "^0.1.2",
+ "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/axios": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz",
+ "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.4",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/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/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/browserslist": {
+ "version": "4.25.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.3.tgz",
+ "integrity": "sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==",
+ "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": {
+ "caniuse-lite": "^1.0.30001735",
+ "electron-to-chromium": "^1.5.204",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "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/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/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-lite": {
+ "version": "1.0.30001736",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001736.tgz",
+ "integrity": "sha512-ImpN5gLEY8gWeqfLUyEF4b7mYWcYoR2Si1VhnrbM4JizRFmfGaAQ12PhNykq6nvI4XvKLrsp8Xde74D5phJOSw==",
+ "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/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/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/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": "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/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/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/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "license": "MIT"
+ },
+ "node_modules/date-fns": {
+ "version": "2.30.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
+ "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.21.0"
+ },
+ "engines": {
+ "node": ">=0.11"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/date-fns"
+ }
+ },
+ "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/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/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/dom-walk": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
+ "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
+ },
+ "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/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.208",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.208.tgz",
+ "integrity": "sha512-ozZyibehoe7tOhNaf16lKmljVf+3npZcJIEbJRVftVsmAg5TeA1mGS9dVCZzOwr2xT7xK15V0p7+GZqSPgkuPg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "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/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/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/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/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "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/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "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/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/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
+ "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
+ "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/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "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/global": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
+ "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
+ "license": "MIT",
+ "dependencies": {
+ "min-document": "^2.19.0",
+ "process": "^0.11.10"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-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/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-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-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-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-function": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
+ "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==",
+ "license": "MIT"
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/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/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "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/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/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/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/lucide-vue-next": {
+ "version": "0.294.0",
+ "resolved": "https://registry.npmjs.org/lucide-vue-next/-/lucide-vue-next-0.294.0.tgz",
+ "integrity": "sha512-bcUuGyLJoq9ExyozROMezdaczK2loP3emYb8PvS7HhZ56rUJVOv5hJgTmWfrfr8vJE7J69ImoMyPTwmUHF198w==",
+ "license": "ISC",
+ "peerDependencies": {
+ "vue": ">=3.0.1"
+ }
+ },
+ "node_modules/m3u8-parser": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-7.2.0.tgz",
+ "integrity": "sha512-CRatFqpjVtMiMaKXxNvuI3I++vUumIXVVT/JpCpdU/FynV/ceVw1qpPyyBNindL+JlPMSesx+WX1QJaZEJSaMQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "@videojs/vhs-utils": "^4.1.1",
+ "global": "^4.4.0"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.17",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
+ "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/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/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-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/min-document": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
+ "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==",
+ "dependencies": {
+ "dom-walk": "^0.1.0"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/mpd-parser": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mpd-parser/-/mpd-parser-1.3.1.tgz",
+ "integrity": "sha512-1FuyEWI5k2HcmhS1HkKnUAQV7yFPfXPht2DnRRGtoiiAAW+ESTbtEXIDpRkwdU+XyrQuwrIym7UkoPKsZ0SyFw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "@videojs/vhs-utils": "^4.0.0",
+ "@xmldom/xmldom": "^0.8.3",
+ "global": "^4.4.0"
+ },
+ "bin": {
+ "mpd-to-m3u8-json": "bin/parse.js"
+ }
+ },
+ "node_modules/mux.js": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-7.1.0.tgz",
+ "integrity": "sha512-NTxawK/BBELJrYsZThEulyUMDVlLizKdxyAsMuzoCD1eFj97BVaA8D/CvKsKu6FOLYkFojN5CbM9h++ZTZtknA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/runtime": "^7.11.2",
+ "global": "^4.4.0"
+ },
+ "bin": {
+ "muxjs-transmux": "bin/transmux.js"
+ },
+ "engines": {
+ "node": ">=8",
+ "npm": ">=5"
+ }
+ },
+ "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==",
+ "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/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "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-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "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/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "dev": true,
+ "license": "BlueOak-1.0.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-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "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/pinia": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.3.1.tgz",
+ "integrity": "sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-api": "^6.6.3",
+ "vue-demi": "^0.14.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.4.4",
+ "vue": "^2.7.0 || ^3.5.11"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "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/pkcs7": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/pkcs7/-/pkcs7-1.0.4.tgz",
+ "integrity": "sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5"
+ },
+ "bin": {
+ "pkcs7": "bin/cli.js"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-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-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "lilconfig": "^3.0.0",
+ "yaml": "^2.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "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-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-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/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "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/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/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/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/resolve": {
+ "version": "1.22.10",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.16.0",
+ "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/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/rollup": {
+ "version": "4.47.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.47.1.tgz",
+ "integrity": "sha512-iasGAQoZ5dWDzULEUX3jiW0oB1qyFOepSyDyoU6S/OhVlDIwj5knI5QBa5RRQ0sK7OE0v+8VIi2JuV+G+3tfNg==",
+ "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.47.1",
+ "@rollup/rollup-android-arm64": "4.47.1",
+ "@rollup/rollup-darwin-arm64": "4.47.1",
+ "@rollup/rollup-darwin-x64": "4.47.1",
+ "@rollup/rollup-freebsd-arm64": "4.47.1",
+ "@rollup/rollup-freebsd-x64": "4.47.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.47.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.47.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.47.1",
+ "@rollup/rollup-linux-arm64-musl": "4.47.1",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.47.1",
+ "@rollup/rollup-linux-ppc64-gnu": "4.47.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.47.1",
+ "@rollup/rollup-linux-riscv64-musl": "4.47.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.47.1",
+ "@rollup/rollup-linux-x64-gnu": "4.47.1",
+ "@rollup/rollup-linux-x64-musl": "4.47.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.47.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.47.1",
+ "@rollup/rollup-win32-x64-msvc": "4.47.1",
+ "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/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/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/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/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-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/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "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-cjs/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/string-width-cjs/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-width-cjs/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-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "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-ansi-cjs/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/sucrase": {
+ "version": "3.35.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "^10.3.10",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "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/tailwindcss": {
+ "version": "3.4.17",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
+ "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==",
+ "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.6",
+ "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",
+ "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/terser": {
+ "version": "5.43.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz",
+ "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.14.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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/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/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/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/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "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/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/video.js": {
+ "version": "8.23.4",
+ "resolved": "https://registry.npmjs.org/video.js/-/video.js-8.23.4.tgz",
+ "integrity": "sha512-qI0VTlYmKzEqRsz1Nppdfcaww4RSxZAq77z2oNSl3cNg2h6do5C8Ffl0KqWQ1OpD8desWXsCrde7tKJ9gGTEyQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "@videojs/http-streaming": "^3.17.2",
+ "@videojs/vhs-utils": "^4.1.1",
+ "@videojs/xhr": "2.7.0",
+ "aes-decrypter": "^4.0.2",
+ "global": "4.4.0",
+ "m3u8-parser": "^7.2.0",
+ "mpd-parser": "^1.3.1",
+ "mux.js": "^7.0.1",
+ "videojs-contrib-quality-levels": "4.1.0",
+ "videojs-font": "4.2.0",
+ "videojs-vtt.js": "0.15.5"
+ }
+ },
+ "node_modules/videojs-contrib-quality-levels": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-4.1.0.tgz",
+ "integrity": "sha512-TfrXJJg1Bv4t6TOCMEVMwF/CoS8iENYsWNKip8zfhB5kTcegiFYezEA0eHAJPU64ZC8NQbxQgOwAsYU8VXbOWA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "global": "^4.4.0"
+ },
+ "engines": {
+ "node": ">=16",
+ "npm": ">=8"
+ },
+ "peerDependencies": {
+ "video.js": "^8"
+ }
+ },
+ "node_modules/videojs-font": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-4.2.0.tgz",
+ "integrity": "sha512-YPq+wiKoGy2/M7ccjmlvwi58z2xsykkkfNMyIg4xb7EZQQNwB71hcSsB3o75CqQV7/y5lXkXhI/rsGAS7jfEmQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/videojs-vtt.js": {
+ "version": "0.15.5",
+ "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz",
+ "integrity": "sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "global": "^4.3.1"
+ }
+ },
+ "node_modules/vite": {
+ "version": "5.4.19",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz",
+ "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==",
+ "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/vue": {
+ "version": "3.5.19",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.19.tgz",
+ "integrity": "sha512-ZRh0HTmw6KChRYWgN8Ox/wi7VhpuGlvMPrHjIsdRbzKNgECFLzy+dKL5z9yGaBSjCpmcfJCbh3I1tNSRmBz2tg==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.19",
+ "@vue/compiler-sfc": "3.5.19",
+ "@vue/runtime-dom": "3.5.19",
+ "@vue/server-renderer": "3.5.19",
+ "@vue/shared": "3.5.19"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-demi": {
+ "version": "0.14.10",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
+ "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-router": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.1.tgz",
+ "integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-api": "^6.6.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/vue-toastification": {
+ "version": "2.0.0-rc.5",
+ "resolved": "https://registry.npmjs.org/vue-toastification/-/vue-toastification-2.0.0-rc.5.tgz",
+ "integrity": "sha512-q73e5jy6gucEO/U+P48hqX+/qyXDozAGmaGgLFm5tXX4wJBcVsnGp4e/iJqlm9xzHETYOilUuwOUje2Qg1JdwA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "vue": "^3.0.2"
+ }
+ },
+ "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/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "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-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/yaml": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
+ "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ }
+ }
+ }
+}
diff --git a/frontend/package.json b/frontend/package.json
old mode 100644
new mode 100755
index 48a9a7f..1058aee
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -8,21 +8,22 @@
"preview": "vite preview"
},
"dependencies": {
- "vue": "^3.3.8",
- "vue-router": "^4.2.5",
- "pinia": "^2.1.7",
- "axios": "^1.6.2",
"@vueuse/core": "^10.6.1",
+ "axios": "^1.6.2",
"date-fns": "^2.30.0",
"lucide-vue-next": "^0.294.0",
- "vue-toastification": "^2.0.0-rc.5",
- "video.js": "^8.6.1"
+ "pinia": "^2.1.7",
+ "video.js": "^8.6.1",
+ "vue": "^3.3.8",
+ "vue-router": "^4.2.5",
+ "vue-toastification": "^2.0.0-rc.5"
},
"devDependencies": {
"@vitejs/plugin-vue": "^4.5.0",
"autoprefixer": "^10.4.16",
"postcss": "^8.4.31",
"tailwindcss": "^3.3.5",
+ "terser": "^5.43.1",
"vite": "^5.0.0"
}
}
diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js
old mode 100644
new mode 100755
diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico
new file mode 100644
index 0000000..2adbbd4
Binary files /dev/null and b/frontend/public/favicon.ico differ
diff --git a/frontend/public/logo_lediscord.png b/frontend/public/logo_lediscord.png
new file mode 100644
index 0000000..f080311
Binary files /dev/null and b/frontend/public/logo_lediscord.png differ
diff --git a/frontend/src/App.vue b/frontend/src/App.vue
old mode 100644
new mode 100755
index fa91e46..cb55266
--- a/frontend/src/App.vue
+++ b/frontend/src/App.vue
@@ -2,6 +2,7 @@
+
@@ -11,10 +12,11 @@ import { computed } from 'vue'
import { useRoute } from 'vue-router'
import DefaultLayout from '@/layouts/DefaultLayout.vue'
import AuthLayout from '@/layouts/AuthLayout.vue'
+import EnvironmentDebug from '@/components/EnvironmentDebug.vue'
const route = useRoute()
const layout = computed(() => {
return route.meta.layout === 'auth' ? AuthLayout : DefaultLayout
})
-
+
\ No newline at end of file
diff --git a/frontend/src/components/EnvironmentDebug.vue b/frontend/src/components/EnvironmentDebug.vue
new file mode 100755
index 0000000..bdf0a1a
--- /dev/null
+++ b/frontend/src/components/EnvironmentDebug.vue
@@ -0,0 +1,62 @@
+
+
+
+
+ {{ environment.toUpperCase() }}
+
+
+
API: {{ apiUrl }}
+
App: {{ appUrl }}
+
Build: {{ buildTime }}
+
Router: {{ routerStatus }}
+
VITE_API_URL: {{ viteApiUrl }}
+
NODE_ENV: {{ nodeEnv }}
+
+
+
+
+
+
+
diff --git a/frontend/src/components/LoadingLogo.vue b/frontend/src/components/LoadingLogo.vue
new file mode 100644
index 0000000..05630f9
--- /dev/null
+++ b/frontend/src/components/LoadingLogo.vue
@@ -0,0 +1,50 @@
+
+
+
+
+
{{ text || 'Chargement...' }}
+
+
+
+
diff --git a/frontend/src/components/MentionInput.vue b/frontend/src/components/MentionInput.vue
old mode 100644
new mode 100755
diff --git a/frontend/src/components/Mentions.vue b/frontend/src/components/Mentions.vue
old mode 100644
new mode 100755
index f6738a6..518aed7
--- a/frontend/src/components/Mentions.vue
+++ b/frontend/src/components/Mentions.vue
@@ -76,4 +76,4 @@ const parsedContent = computed(() => {
color: #7c3aed;
filter: drop-shadow(0 0 4px rgba(139, 92, 246, 0.5));
}
-
+
\ No newline at end of file
diff --git a/frontend/src/components/TicketFloatingButton.vue b/frontend/src/components/TicketFloatingButton.vue
old mode 100644
new mode 100755
index f607f2c..d27cf57
--- a/frontend/src/components/TicketFloatingButton.vue
+++ b/frontend/src/components/TicketFloatingButton.vue
@@ -116,10 +116,7 @@
class="flex-1 btn-primary"
:disabled="submitting"
>
-
-
-
-
+
{{ submitting ? 'Envoi...' : 'Envoyer le ticket' }}
@@ -130,10 +127,13 @@
+
\ No newline at end of file
diff --git a/frontend/src/layouts/AuthLayout.vue b/frontend/src/layouts/AuthLayout.vue
old mode 100644
new mode 100755
index fe0ebca..f00515f
--- a/frontend/src/layouts/AuthLayout.vue
+++ b/frontend/src/layouts/AuthLayout.vue
@@ -1,14 +1,22 @@
-
-
LeDiscord
+
+
LeDiscord
Notre espace privé
+
+
+
+
diff --git a/frontend/src/layouts/DefaultLayout.vue b/frontend/src/layouts/DefaultLayout.vue
old mode 100644
new mode 100755
index 8645de6..7e13008
--- a/frontend/src/layouts/DefaultLayout.vue
+++ b/frontend/src/layouts/DefaultLayout.vue
@@ -7,6 +7,11 @@
+
LeDiscord
@@ -281,4 +286,4 @@ onMounted(async () => {
await fetchNotifications()
await authStore.fetchUnreadCount()
})
-
+
\ No newline at end of file
diff --git a/frontend/src/main.js b/frontend/src/main.js
old mode 100644
new mode 100755
index 5b447b6..3479b73
--- a/frontend/src/main.js
+++ b/frontend/src/main.js
@@ -1,4 +1,4 @@
-import { createApp } from 'vue'
+import { createApp, nextTick } from 'vue'
import { createPinia } from 'pinia'
import Toast from 'vue-toastification'
import 'vue-toastification/dist/index.css'
@@ -7,7 +7,10 @@ import App from './App.vue'
import router from './router'
import './style.css'
+// Créer l'application
const app = createApp(App)
+
+// Créer et configurer Pinia
const pinia = createPinia()
// Toast configuration
@@ -26,8 +29,20 @@ const toastOptions = {
rtl: false
}
+// Installer les plugins dans l'ordre correct
+// IMPORTANT: Pinia doit être installé AVANT le router
app.use(pinia)
-app.use(router)
app.use(Toast, toastOptions)
-app.mount('#app')
+// Maintenant installer le router
+app.use(router)
+
+// Attendre que le router soit prêt avant de monter l'app
+router.isReady().then(() => {
+ app.mount('#app')
+ console.log('🚀 Application montée avec succès')
+}).catch((error) => {
+ console.error('❌ Erreur lors du montage de l\'application:', error)
+ // Fallback: monter l'app même en cas d'erreur
+ app.mount('#app')
+})
diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js
old mode 100644
new mode 100755
index 7e9cf3d..7dea9ee
--- a/frontend/src/router/index.js
+++ b/frontend/src/router/index.js
@@ -1,5 +1,4 @@
import { createRouter, createWebHistory } from 'vue-router'
-import { useAuthStore } from '@/stores/auth'
// Views
import Home from '@/views/Home.vue'
@@ -125,19 +124,11 @@ const router = createRouter({
routes
})
-// Navigation guard
+// Navigation guard simplifié - la logique d'authentification sera gérée dans les composants
router.beforeEach((to, from, next) => {
- const authStore = useAuthStore()
-
- if (to.meta.requiresAuth && !authStore.isAuthenticated) {
- next('/login')
- } else if (to.meta.requiresAdmin && !authStore.isAdmin) {
- next('/')
- } else if ((to.name === 'Login' || to.name === 'Register') && authStore.isAuthenticated) {
- next('/')
- } else {
- next()
- }
+ // Pour l'instant, on laisse passer toutes les routes
+ // La logique d'authentification sera gérée dans les composants individuels
+ next()
})
export default router
diff --git a/frontend/src/stores/auth.js b/frontend/src/stores/auth.js
old mode 100644
new mode 100755
diff --git a/frontend/src/style.css b/frontend/src/style.css
old mode 100644
new mode 100755
diff --git a/frontend/src/utils/axios.js b/frontend/src/utils/axios.js
old mode 100644
new mode 100755
index c80009f..813bbe2
--- a/frontend/src/utils/axios.js
+++ b/frontend/src/utils/axios.js
@@ -2,14 +2,51 @@ import axios from 'axios'
import { useToast } from 'vue-toastification'
import router from '@/router'
+// Configuration de l'URL de base selon l'environnement
+const getBaseURL = () => {
+ // Récupérer l'environnement depuis les variables Vite
+ const environment = import.meta.env.VITE_ENVIRONMENT || 'local'
+
+ // Log de debug pour l'environnement
+ console.log(`🌍 Frontend - Environnement détecté: ${environment}`)
+ console.log(`🔗 API URL: ${import.meta.env.VITE_API_URL}`)
+ console.log(`🔧 VITE_ENVIRONMENT: ${import.meta.env.VITE_ENVIRONMENT}`)
+ console.log(`🔧 NODE_ENV: ${import.meta.env.NODE_ENV}`)
+
+ // Utiliser directement la variable d'environnement VITE_API_URL
+ // qui est déjà configurée correctement pour chaque environnement
+ const apiUrl = import.meta.env.VITE_API_URL
+
+ if (!apiUrl) {
+ console.warn('⚠️ VITE_API_URL non définie, utilisation de la valeur par défaut')
+ // Valeurs par défaut selon l'environnement
+ switch (environment) {
+ case 'production':
+ return 'https://api.lediscord.com'
+ case 'development':
+ return 'https://api-dev.lediscord.com' // API externe HTTPS en développement
+ case 'local':
+ default:
+ return 'http://localhost:8000'
+ }
+ }
+
+ console.log(`🎯 URL finale utilisée: ${apiUrl}`)
+ return apiUrl
+}
+
+// Configuration de l'instance axios
const instance = axios.create({
- baseURL: import.meta.env.VITE_API_URL || 'http://localhost:8000',
+ baseURL: getBaseURL(),
timeout: 30000,
headers: {
'Content-Type': 'application/json'
}
})
+// Log de la configuration
+console.log(`🚀 Axios configuré avec l'URL de base: ${getBaseURL()}`)
+
// Request interceptor
instance.interceptors.request.use(
config => {
@@ -17,19 +54,41 @@ instance.interceptors.request.use(
if (token) {
config.headers.Authorization = `Bearer ${token}`
}
+
+ // Log des requêtes en développement
+ if (import.meta.env.DEV) {
+ console.log(`📤 Requête ${config.method?.toUpperCase()} vers: ${config.url}`)
+ }
+
return config
},
error => {
+ console.error('❌ Erreur dans l\'intercepteur de requête:', error)
return Promise.reject(error)
}
)
// Response interceptor
instance.interceptors.response.use(
- response => response,
+ response => {
+ // Log des réponses en développement
+ if (import.meta.env.DEV) {
+ console.log(`📥 Réponse ${response.status} de: ${response.config.url}`)
+ }
+ return response
+ },
error => {
const toast = useToast()
+ // Log détaillé des erreurs
+ console.error('❌ Erreur API:', {
+ status: error.response?.status,
+ statusText: error.response?.statusText,
+ url: error.config?.url,
+ method: error.config?.method,
+ data: error.response?.data
+ })
+
if (error.response?.status === 401) {
// Ne pas rediriger si on est déjà sur une page d'auth
const currentRoute = router.currentRoute.value
@@ -42,6 +101,10 @@ instance.interceptors.response.use(
toast.error('Accès non autorisé')
} else if (error.response?.status === 500) {
toast.error('Erreur serveur, veuillez réessayer plus tard')
+ } else if (error.code === 'ECONNABORTED') {
+ toast.error('Délai d\'attente dépassé, veuillez réessayer')
+ } else if (!error.response) {
+ toast.error('Erreur de connexion, vérifiez votre connexion internet')
}
return Promise.reject(error)
@@ -56,7 +119,7 @@ export function getMediaUrl(path) {
if (typeof path !== 'string') return path
if (path.startsWith('http')) return path
- const baseUrl = import.meta.env.VITE_API_URL || 'http://localhost:8000'
+ const baseUrl = getBaseURL()
// Déjà un chemin uploads complet
if (path.startsWith('/uploads/')) {
@@ -71,3 +134,33 @@ export function getMediaUrl(path) {
// Fallback
return `${baseUrl}/uploads/${path}`
}
+
+// Fonction utilitaire pour obtenir l'environnement actuel
+export function getCurrentEnvironment() {
+ return import.meta.env.VITE_ENVIRONMENT || 'local'
+}
+
+// Fonction utilitaire pour vérifier si on est en production
+export function isProduction() {
+ return getCurrentEnvironment() === 'production'
+}
+
+// Fonction utilitaire pour vérifier si on est en développement
+export function isDevelopment() {
+ return getCurrentEnvironment() === 'development'
+}
+
+// Fonction utilitaire pour vérifier si on est en local
+export function isLocal() {
+ return getCurrentEnvironment() === 'local'
+}
+
+// Fonction utilitaire pour obtenir l'URL de l'API
+export function getApiUrl() {
+ return import.meta.env.VITE_API_URL || getBaseURL()
+}
+
+// Fonction utilitaire pour obtenir l'URL de l'application
+export function getAppUrl() {
+ return import.meta.env.VITE_APP_URL || window.location.origin
+}
diff --git a/frontend/src/views/Admin.vue b/frontend/src/views/Admin.vue
old mode 100644
new mode 100755
index d5eb1e0..bbc7db2
--- a/frontend/src/views/Admin.vue
+++ b/frontend/src/views/Admin.vue
@@ -4,8 +4,7 @@
-
-
Chargement du dashboard...
+
@@ -579,16 +578,14 @@
-
-
Chargement des tickets...
+
-
+
@@ -674,7 +671,7 @@
-
+
@@ -1244,6 +1241,7 @@ import {
} from 'lucide-vue-next'
import { formatDistanceToNow } from 'date-fns'
import { fr } from 'date-fns/locale'
+import LoadingLogo from '@/components/LoadingLogo.vue'
const authStore = useAuthStore()
const toast = useToast()
@@ -1852,7 +1850,7 @@ function openImageModal(imageUrl) {
function getMediaUrl(path) {
if (!path) return ''
- return path.startsWith('http') ? path : `http://localhost:8000${path}`
+ return path.startsWith('http') ? path : `${import.meta.env.VITE_API_URL || 'http://localhost:8002'}${path}`
}
// Nouvelles fonctions pour les filtres et actions rapides
@@ -2126,4 +2124,4 @@ watch(showTicketEditModal, (newValue) => {
grid-template-columns: 1fr;
}
}
-
+
\ No newline at end of file
diff --git a/frontend/src/views/AlbumDetail.vue b/frontend/src/views/AlbumDetail.vue
old mode 100644
new mode 100755
index 6caae81..2906ea7
--- a/frontend/src/views/AlbumDetail.vue
+++ b/frontend/src/views/AlbumDetail.vue
@@ -1,10 +1,9 @@
-
-
-
-
Chargement de l'album...
-
+
+
+
+
@@ -586,6 +585,7 @@ import {
ChevronLeft,
ChevronRight
} from 'lucide-vue-next'
+import LoadingLogo from '@/components/LoadingLogo.vue'
const route = useRoute()
const router = useRouter()
@@ -859,4 +859,4 @@ onUnmounted(() => {
// Clean up event listeners
document.removeEventListener('keydown', handleKeyboardNavigation)
})
-
+
\ No newline at end of file
diff --git a/frontend/src/views/Albums.vue b/frontend/src/views/Albums.vue
old mode 100644
new mode 100755
index 225f184..8804a67
--- a/frontend/src/views/Albums.vue
+++ b/frontend/src/views/Albums.vue
@@ -783,4 +783,4 @@ onMounted(() => {
fetchUsers()
fetchUploadLimits()
})
-
+
\ No newline at end of file
diff --git a/frontend/src/views/EventDetail.vue b/frontend/src/views/EventDetail.vue
old mode 100644
new mode 100755
index 8932f00..6970321
--- a/frontend/src/views/EventDetail.vue
+++ b/frontend/src/views/EventDetail.vue
@@ -1,10 +1,9 @@
-
-
-
-
Chargement de l'événement...
-
+
+
+
+
@@ -46,7 +45,15 @@
-
+
+
+
+
-
+
+
+
+
@@ -480,6 +488,11 @@ async function fetchEvents() {
loading.value = true
try {
const response = await axios.get(`/api/events?limit=12&offset=${offset.value}`)
+ console.log('Events response:', response.data)
+ if (response.data && response.data.length > 0) {
+ console.log('First event:', response.data[0])
+ console.log('Creator avatar:', response.data[0].creator_avatar)
+ }
if (offset.value === 0) {
events.value = response.data
} else {
@@ -488,6 +501,7 @@ async function fetchEvents() {
hasMoreEvents.value = response.data.length === 12
} catch (error) {
+ console.error('Error fetching events:', error)
toast.error('Erreur lors du chargement des événements')
}
loading.value = false
diff --git a/frontend/src/views/Home.vue b/frontend/src/views/Home.vue
old mode 100644
new mode 100755
diff --git a/frontend/src/views/Information.vue b/frontend/src/views/Information.vue
old mode 100644
new mode 100755
index 7029ca9..21baca2
--- a/frontend/src/views/Information.vue
+++ b/frontend/src/views/Information.vue
@@ -34,11 +34,10 @@
-
-
-
-
Chargement des informations...
-
+
+
+
+
@@ -107,6 +106,7 @@ import { useToast } from 'vue-toastification'
import { formatDistanceToNow } from 'date-fns'
import { fr } from 'date-fns/locale'
import axios from '@/utils/axios'
+import LoadingLogo from '@/components/LoadingLogo.vue'
const toast = useToast()
diff --git a/frontend/src/views/Login.vue b/frontend/src/views/Login.vue
old mode 100644
new mode 100755
diff --git a/frontend/src/views/MyTickets.vue b/frontend/src/views/MyTickets.vue
old mode 100644
new mode 100755
index 18e8c98..c98d33f
--- a/frontend/src/views/MyTickets.vue
+++ b/frontend/src/views/MyTickets.vue
@@ -54,11 +54,10 @@
-
-
-
-
Chargement de vos tickets...
-
+
+
+
+
@@ -318,6 +317,7 @@ import { fr } from 'date-fns/locale'
import { Save } from 'lucide-vue-next'
import axios from '@/utils/axios'
import { getMediaUrl } from '@/utils/axios'
+import LoadingLogo from '@/components/LoadingLogo.vue'
const toast = useToast()
diff --git a/frontend/src/views/Posts.vue b/frontend/src/views/Posts.vue
old mode 100644
new mode 100755
diff --git a/frontend/src/views/Profile.vue b/frontend/src/views/Profile.vue
old mode 100644
new mode 100755
diff --git a/frontend/src/views/Register.vue b/frontend/src/views/Register.vue
old mode 100644
new mode 100755
diff --git a/frontend/src/views/Stats.vue b/frontend/src/views/Stats.vue
old mode 100644
new mode 100755
index d3f56a0..de4557e
--- a/frontend/src/views/Stats.vue
+++ b/frontend/src/views/Stats.vue
@@ -2,11 +2,10 @@
Statistiques du groupe
-
-
-
-
Chargement des statistiques...
-
+
+
+
+
@@ -252,6 +251,7 @@ import {
AtSign,
Eye
} from 'lucide-vue-next'
+import LoadingLogo from '@/components/LoadingLogo.vue'
const toast = useToast()
diff --git a/frontend/src/views/UserProfile.vue b/frontend/src/views/UserProfile.vue
old mode 100644
new mode 100755
index dbbdb58..9227755
--- a/frontend/src/views/UserProfile.vue
+++ b/frontend/src/views/UserProfile.vue
@@ -1,10 +1,9 @@
-
-
-
-
Chargement du profil...
-
+
+
+
+
@@ -118,7 +117,7 @@
+ Commentaires ({{ comments.length }}) +
+ +Aucun commentaire
+Soyez le premier à commenter ce vlog !
+